关于 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-Time 的
DateTimeZone
,java.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 ) ;
instant
和zdt
对象都代表同一时刻,时间轴上的同一点。
精彩瞬间
跟踪时刻、时间轴上的特定点时,切勿使用LocalDateTime
。在 Joda-Time 和 java.time 框架中,class 表示带有时间的日期,但缺少任何区域或偏移量的概念。缺少上下文,class 不能代表一个时刻。
我有这部分代码可以获取 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-Time 的
DateTimeZone
,java.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 ) ;
instant
和zdt
对象都代表同一时刻,时间轴上的同一点。
精彩瞬间
跟踪时刻、时间轴上的特定点时,切勿使用LocalDateTime
。在 Joda-Time 和 java.time 框架中,class 表示带有时间的日期,但缺少任何区域或偏移量的概念。缺少上下文,class 不能代表一个时刻。