如何在特定时区将即时时间UTC转换为EpochMilli

问题描述 投票:0回答:1
>     fun getLocalizedTime(locationId: Long, utcTimeInMs: Long? ): Long{
>         val instant = Instant.ofEpochMilli(utcTimeInMs?:Instant.now().toEpochMilli())
>         val zoneIdAsString = locationDataService.locationData.locations[locationId]?.timeZone
>                 ?: "UTC"
>         val zoneId = ZoneId.of(zoneIdAsString)
>        val zonedDateTime = ZonedDateTime.ofInstant(instant, zoneId)
> 
>         return  instant.atZone(zoneId).toInstant().toEpochMilli()
>     } }

返回UTC时间:(

如何在特定时区将即时时间UTC转换为EpochMilli

time timezone utc instant
1个回答
0
投票

没有“在特定的timeZone中的toEpochMilli”之类的东西,如果您要遵循常规定义,则不会。来自mepoch参考的毫秒数始终为UTC。

从一个纪元开始的毫秒计数是在UTC中完成的。 java.time和Unix / POSIX使用的纪元参考是1970 in UTC的第一时刻,1970-01-01T00:00Z。末尾的Z表示UTC,并发音为“ Zulu”。到今天,各种信息系统使用了许多其他时代参考。

所以说“时区的毫秒数”是没有意义的。

如果您从1970年1月1日起以毫秒为单位,以毫秒为单位,则解析为Instant

Instant instant = Instant.ofEpochMilli( milliseconds ) ;

要查看特定地区的人们在墙上钟表中使用的同一时刻,请调整到一个时区以获得ZonedDateTime

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

InstantZonedDateTime都表示相同同时时刻,时间轴上的相同点,自历元参考以来的毫秒数相同。

您可以从Instant中提取ZonedDateTime以返回到原始的从时期算起。

long millisecondsSinceEpoch = zdt.toInstant().toEpochMilli() ;  

您会发现millisecondsmillisecondsSinceEpoch长整数是相同的数字。

您的代码instant.atZone(zoneId).toInstant()没有意义。您从Instant开始,转换为ZonedDateTime,然后转换回Instant。自纪元参考以来,所有三个对象都代表着相同的时刻,相同的毫秒数。您的电话没有完成任何有用的工作。

我无法理解您在代码段中要完成的工作。也许如果您编辑问题以更清楚地说明您的问题和目标,我可以提供具体建议。

© www.soinside.com 2019 - 2024. All rights reserved.