我需要获得系统日期时间,但不需要使用以下代码的[America/New_York]。有什么建议吗?
String timestampAtGMT = DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneId.systemDefault()).format(Instant.now());
String dateInAmerica = timestampAtGMT.trim();
System.out.println("In 'GMT-04:00' Time Zone:" + dateInAmerica);
代码输出:在"GMT-04:00"时区:2020-03-23T21:39:49.419-04:00[美国/纽约]
预期输出:在"GMT-04:00"时区:2020-03-23T21:39:49.419-04:00
一种解决方案是删除.withZone(ZoneId.systemDefault())
,然后将Instant.now()
更改为OffsetDateTime.now()
。有了这个,你的新片段看起来像:
String timestamp = DateTimeFormatter.ISO_DATE_TIME.format(OffsetDateTime.now());
System.out.println("In 'GMT-04:00' Time Zone: " + timestamp);
输出为:
In 'GMT-04:00' Time Zone: 2020-03-23T21:52:10.794463-04:00
默认情况下,OffsetDateTime#now
使用系统时钟的默认时区,因此无需指定
我认为您想要的是一个OffsetDateTime
,而不是格式化程序。简单地说:
String dateInAmerica
= OffsetDateTime.now(ZoneId.systemDefault()).toString();
System.out.println("In 'GMT-04:00' Time Zone:" + dateInAmerica);
当我把JVM的时区设置为America/New_York时,我得到的输出是:
在"GMT-04:00"时区:2020-03-24T15:53:11.948127-04:00
OffsetDateTime
是具有偏移量(例如-04:00(的日期和时间,但没有时区(例如America/New_York(。因此,此时您可以在不获取时区的情况下获得时区的正确偏移量。
从技术上讲,我们可以省略ZoneId.systemDefault()
,但我更愿意在那里声明它,告诉读者和我自己,我已经考虑过我想要哪个时区,并有意识地选择了依赖JVM默认值。