首页 > 解决方案 > 将没有时区的日期解析为本地时区

问题描述

我有没有 Z 的日期,因为它总是在 UTC 中。我想用本地时间将其解析为 LocalDateTime ,反之亦然

例如:

本地时区 UTC+1
服务器日期“2020-01-31 04:38:00”,UTC
格式将是“2020-01-31 05:38:00”

反之亦然
UTC+1
格式时间中的本地时间“2020-01-31 05:38:00”将是“2020-01-31 04:38:00”

我试过这个

            val formatter = DateTimeFormatter
                .ofPattern(Type.API.formatter)
                .withZone(localTimeZone)

            LocalDateTime.parse(date, formatter).toString()

标签: kotlinjava-timezoneddatetimelocaldatetime

解决方案


将您的输入解析为LocalDateTime.

LocalDateTime ldt = LocalDateTime.parse( "2020-01-31 04:38:00".replace( " " , "T" ) ) ;

您声称肯定知道该字符串表示以 UTC 形式显示的时刻,即与 UTC 的偏移量为零时分秒。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

如果要调整到时区,请应用 aZoneId来获取ZonedDateTime对象。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

我不知道你为什么参与Locale。该类Locale与日期时间值无关。Locale仅当您在生成表示日期时间值的文本时进行本地化时才需要A ,以确定月份或星期几的名称,以及大小写、标点符号、缩写、部分顺序的问题。

Locale locale = Locale.JAPAN ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale ) ;
String output = zdt.format( f ) ;

请参阅在 IdeOne.com 上实时运行的代码

两者odt&zdt代表同一时刻,时间线上的同一同时点,但它们的挂钟时间不同。突尼斯人的时钟比世界标准时间早一小时。因此,zdt我们将一天中的时间视为 5:38 而不是 4:38。

ldt.toString() = 2020-01-31T04:38
odt.toString() = 2020-01-31T04:38Z
zdt.toString() = 2020-01-31T05:38+01:00[Africa/Tunis]
output = 2020年1月31日金曜日 5時38分00秒 中央ヨーロッパ標準時

推荐阅读