UTC 偏移量到本地时间转换



我有一个类,我用 utcoffset 毫秒将日期格式化为本地时间。

我处于一种奇怪的情况,日期总是格式化为 UTC 而不是本地时间。

我从以下方法中得到的时间戳或日期始终采用UTC。我应该如何使用 UTC 偏移毫秒转换为本地时间。

public Object[] format(ReportContext context) {
Map<String, String> queryParams = context.getQueryParams();
DateRange dateRange = queryParams.containsKey(DATE_RANGE) ?
DateRange.getDateRange(queryParams.get(DATE_RANGE)) :
DateRange.LAST_24_HOURS;
String messageKey = MESSAGE_KEY + dateRange.getRestParam();
Object args[];
Locale locale = context.getLocale();
DateTimeZone dateTimeZone = DateTimeZone.forOffsetMillis(19800000);
DateTimeFormatter dateFormatterWithZone = dateFormatter.withZone(dateTimeZone);
LocalDateTime startDateTime = parseParam(queryParams, START_TIME);
String startDate = dateFormatterWithZone.print(startDateTime);
if (dateRange == DateRange.TODAY || dateRange == DateRange.YESTERDAY) {
args = new Object[]{startDate};
} else {
LocalDateTime endDateTime = parseParam(queryParams, END_TIME);
if (dateRange == DateRange.LAST_24_HOURS) {
DateTimeFormatter timeFormatterWithZone = timeFormatter.withZone(dateTimeZone);
String startTime = timeFormatterWithZone.print(startDateTime);
String endDate = dateFormatterWithZone.print(endDateTime);
String endTime = timeFormatterWithZone.print(endDateTime);
args = new Object[] {startDate, startTime, endDate, endTime};
System.out.println("UTC time" + startDate + " " + startTime + " " + endDate + " " + endTime);
} else if (dateRange == DateRange.LAST_HOUR) {
DateTimeFormatter timeFormatterWithZone = timeFormatter.withZone(dateTimeZone);
String startTime = timeFormatterWithZone.print(startDateTime);
String endTime = timeFormatterWithZone.print(endDateTime);
args = new Object[] {startDate, startTime, endTime};
} else {
String endDate = dateFormatterWithZone.print(endDateTime);
args = new Object[] {startDate, endDate};
}
}
return ars;
}

LocalDateTime表示日期(日、月和年)和时间(小时、分钟、秒、毫秒),没有任何时区概念。如果我创建这个:

// March 8th 2018, at 10 AM (no timezone)
LocalDateTime startDateTime = new LocalDateTime(2018, 3, 8, 10, 0);

startDateTime变量表示"2018 年 3 月 8 日上午 10 点">,但没有时区,因此它可能是 2018 年 3 月 8 日上午 10 点(或者没有特别的地方,没关系)。如果设置此日期的格式,则在格式化程序中设置的时区无关紧要,都不会影响输出,因为LocalDateTime没有时区的概念,也不会受时区影响。

如果要在特定位置(地理区域,又名时区)表示此日期和时间,则必须提供DateTimeZone(表示时区的对象)并将LocalDateTime转换为DateTime

DateTimeZone zone = DateTimeZone.forID("Asia/Kolkata");
DateTime dt = startDateTime.toDateTime(zone);

请注意,我使用了名称Asia/Kolkata而不是偏移量的固定数值。这是因为时区可以随时更改 - 政治家可能会"因为原因"决定更改国家的偏移量 - 因此使用正确的时区名称(并保持时区数据更新)使您的代码更加可靠和面向未来。

此代码使dt等于"2018 年 3 月 8 日,亚洲/加尔各答时区上午 10 点"。现在它不再是本地日期/时间:它表示特定位置的日期和时间(由时区表示)。

时区之间的转换

如果结果错误,则必须知道LocalDateTime引用的时区,然后转换为所需的时区。

示例:如果我知道LocalDateTime是UTC格式,并且我想将其转换为"亚洲/加尔各答",我该怎么办?

首先,我将LocalDateTime转换为 UTC:

// LocalDateTime is in UTC
DateTime utcDateTime = startDateTime.toDateTime(DateTimeZone.UTC);

然后,我将这个utcDateTime转换为我想要的时区:

DateTimeZone zone = DateTimeZone.forID("Asia/Kolkata");
// convert utcDateTime to Asia/Kolkata timezone
DateTime kolkataDateTime = utcDateTime.withZone(zone);

kolkataDateTime相当于"2018 年 3 月 8 日下午 3:30(亚洲/加尔各答)"(因为 UTC 时间上午 10 点相当于时区Asia/Kolkata下午 3:30)。

相关内容

  • 没有找到相关文章

最新更新