将您的输入解析为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秒 中央ヨーロッパ標準時