关于 DateTimeZone.forID 的两个不同结果

Two different result about DateTimeZone.forID

我有这部分代码可以获取 DateTimeZone 的 un ID

String timeZoneId = Calendar.getInstance().getTimeZone().getID();
DateTimeZone desTimeZone = DateTimeZone.forID(timeZoneId);

在war文件中执行这部分代码时,得到timeZoneId = "GMT+01:00"

但是当我 运行 这部分代码在 main 方法中时,我得到了 timeZoneId = "Europe/Paris"

第一个在第二行抛出异常: 日期时区 ID 'GMT+01:00' 未被识别

我不知道为什么我有两个不同的结果!!!

如何在war文件和main方法(Europe/Paris)中得到相同的结果?

谢谢

编辑:添加方法的完整代码:

public static DateTime toLocalDateTime(String gmtDate) {

if (StringUtils.isBlank(gmtDate)) {
    return null;
}

DateTime gmt = new DateTime(gmtDate, DateTimeZone.UTC);

String timeZoneId =  Calendar.getInstance().getTimeZone().getID();
DateTimeZone desTimeZone = DateTimeZone.forID(timeZoneId);
DateTimeZone.setDefault(desTimeZone);
LocalDateTime locDateTime = gmt.withZone(DateTimeZone.getDefault()).toLocalDateTime();

return locDateTime.toDateTime();

}

tl;博士

使用现代 java.time classes 替换您在代码中混合使用的两个框架。

java.time.Instant
.parse( "2020-02-03T10:09:21.154Z" ) 
.atZone(
    ZoneId.of( "Europe/Paris" )
)

详情

您没有提供足够的细节来做出明确的诊断。您需要准确描述您的情况 运行 确切的代码。

我不确定是否值得为此付出努力,原因有二:

  • 您正在使用 Calendar,这是一个糟糕的 class,原始日期日期时间 classes 的一部分,多年前被现代 取代java.time class在 JSR 310 中定义。
  • 您正在使用来自 Joda-TimeDateTimeZonejava.time [=87] 的前身=]是的。该项目现在处于维护模式。

java.time

所以改用java.time.

获取 JVM 当前的默认时区。

ZoneId z = ZoneId.systemDefault() ;

如果您想知道该区域当前使用的偏移量,请使用 ZoneRules

ZoneRules rules = z.getRules() ;
ZoneOffset offset = rules.getOffset( Instant.now() ) ;

明确区域与偏移量。偏移量只是本初子午线之前或之后的小时-分钟-秒数。偏移量看起来像 +05:30。时区要多得多。时区是特定地区的人们使用的偏移量的过去、现在和未来变化的历史。时区名称的格式为 Continent/Region.

ISO 8601 字符串

如果给出标准 ISO 8601 格式的文本,例如 2020-02-03T10:09:21.154Z,请理解这代表了 UTC 时刻,即与 UTC 的偏移量为零小时-分钟-秒。末尾的 Z 表示 UTC,发音为“Zulu”。

解析 java.time.Instant 这样的输入。此 class 显示 UTC 时间。

Instant instant = Instant.parse( "2020-02-03T10:09:21.154Z" ) ;

要通过时区的挂钟时间查看这一刻,请应用 ZoneId 以获得 ZonedDateTime

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

instantzdt对象都代表同一时刻,时间轴上的同一点。

精彩瞬间

跟踪时刻、时间轴上的特定点时,切勿使用LocalDateTime。在 Joda-Time 和 java.time 框架中,class 表示带有时间的日期,但缺少任何区域或偏移量的概念。缺少上下文,class 不能代表一个时刻。