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

问题描述

我有没有 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 ) ;

我不知道你为什么涉及LocaleLocale 类与日期时间值无关。 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 都代表同一时刻,时间线上的同一同时点,但它们的挂钟时间不同。突尼斯人的时钟比世界协调时间提前一小时。因此,在 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秒 中央ヨーロッパ標準時

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...