将zoneddatetime转换为字符串

bq9c1y66  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(406)

我正在接收包含以下格式的时间的json对象。

...
"start_time": "2020-12-30T17:30:00Z",
...

我已经分析了它并分配给 ZonedDateTime ```
ZonedDateTime start_time = ZonedDateTime.parse(jsonObject.getString("start_time"));

现在我想把它展示给大家看 `String` 用户设备的本地时区。
我相信json时间在utc区域。所以香港的用户会看到+8偏移,而洛杉矶的用户会看到-8偏移。所以他们会看到如下。
香港用户:2020-12-31 01:30
洛杉矶用户:2020-12-30 09:30
oknrviil

oknrviil1#

如果这些设备已正确配置时区,则可以使用

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm");
System.out.println(start_time.format(formatter.withZone(ZoneId.systemDefault())));

为了得到你的结果

qzlgjiam

qzlgjiam2#

你的意见 "2020-12-30T17:30:00Z" 是标准iso 8601格式。这个 Z “在结尾”表示与utc的偏移量为零小时分秒,发音为“zulu”。我们还将祖鲁日期时间称为“utc”。
您应该将这些输入解析为 Instant ,而不是 ZonedDateTime 从你的问题中可以看出。

Instant instant = Instant.parse( "2020-12-30T17:30:00Z" ) ;

要通过特定地区的人使用的挂钟时间(偏移量)查看同一时刻,请指定时区( ZoneId )生产 ZonedDateTime .

ZoneId zHongKong = ZoneId.of( "Asia/Hong_Kong" ) ;
ZonedDateTime zdtHongKong = instant.atZone( zHongKong ) ;

…还有…

ZoneId zLosAngeles = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdtLosAngeles = instant.atZone( zLosAngeles ) ;

所有三个物体都指向同一时刻,时间线上的同一点。
要生成字符串,请调用 toString .
请在ideone.com上查看此代码的实时运行。
instant.tostring():2020-12-30t17:30:00z
zdthongkong.tostring():2020-12-31t01:30+08:00[亚洲/香港]
zdtlosangeles.tostring():2020-12-30t09:30-08:00[美国/洛杉矶]
要生成特定格式的文本,请使用 DateTimeFormatter 班级。该类还可以自动本地化生成文本。

Locale locale = new Locale( "en" , "HK" ) ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ).withLocale( locale ) ;
String output = zdtHongKong.format( f ) ;

2020年12月31日凌晨1:30
所有这些都已经在堆栈溢出上讨论过很多次了。因此,搜索以了解更多信息。并在发布前彻底搜索堆栈溢出。

相关问题