将没有时区的日期解析为本地时区

Parse date without timezone to local timezone

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

例如:

本地时区 UTC+1
服务器日期“2020-01-31 04:38:00”(UTC
) 格式化为“2020-01-31 05:38:00”

反之亦然
当地时间“2020-01-31 05:38:00” UTC+1
格式化时间将为“2020-01-31 04:38:00”

我试过了

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

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

将您的输入解析为 LocalDateTime

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

您声称确定该字符串表示 UTC 中的时刻,即与 UTC 的偏移量为零小时-分钟-秒。

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

如果你想调整到一个时区,应用一个ZoneId得到一个ZonedDateTime对象。

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

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

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

看到这个code run live at IdeOne.com

odtzdt 都代表同一时刻,时间轴上的同一时间点,但挂钟时间不同。突尼斯人将时钟设置为比 UTC 早一小时。所以在 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秒 中央ヨーロッパ標準時