问题描述
我有没有 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()
解决方法
将您的输入解析为 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 ) ;
我不知道你为什么涉及Locale
。 Locale
类与日期时间值无关。 Locale
仅当您在生成文本以表示日期时间值、确定月份或星期几的名称以及大小写、标点符号、缩写、部分顺序问题时进行本地化时才需要。
Locale locale = Locale.JAPAN ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale ) ;
String output = zdt.format( f ) ;
看到这个code run live at 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秒 中央ヨーロッパ標準時