解析时区并删除Java中的国家/地区



我需要获得系统日期时间,但不需要使用以下代码的[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默认值。

相关内容

最新更新