> 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
没有“在特定的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 ) ;
Instant
和ZonedDateTime
都表示相同同时时刻,时间轴上的相同点,自历元参考以来的毫秒数相同。
您可以从Instant
中提取ZonedDateTime
以返回到原始的从时期算起。
long millisecondsSinceEpoch = zdt.toInstant().toEpochMilli() ;
您会发现milliseconds
和millisecondsSinceEpoch
长整数是相同的数字。
您的代码instant.atZone(zoneId).toInstant()
没有意义。您从Instant
开始,转换为ZonedDateTime
,然后转换回Instant
。自纪元参考以来,所有三个对象都代表着相同的时刻,相同的毫秒数。您的电话没有完成任何有用的工作。
我无法理解您在代码段中要完成的工作。也许如果您编辑问题以更清楚地说明您的问题和目标,我可以提供具体建议。