将没有时区的日期解析为本地时区
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 ) ;
我不知道你为什么参与Locale
。 Locale
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。
odt
和 zdt
都代表同一时刻,时间轴上的同一时间点,但挂钟时间不同。突尼斯人将时钟设置为比 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秒 中央ヨーロッパ標準時
我有没有 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 ) ;
我不知道你为什么参与Locale
。 Locale
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。
odt
和 zdt
都代表同一时刻,时间轴上的同一时间点,但挂钟时间不同。突尼斯人将时钟设置为比 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秒 中央ヨーロッパ標準時