Kotlin 如何在特定时区将即时UTC转换为Pochmilli
编辑:对不起,也许我的问题不对 我正在尝试将UTC时间戳转换为JavaKotlin中的本地时间戳 f。exm UTC时间18:00德国当地时间是20:00我需要UTC时间戳中的德国当地时间Kotlin 如何在特定时区将即时UTC转换为Pochmilli,kotlin,time,timezone,utc,instant,Kotlin,Time,Timezone,Utc,Instant,编辑:对不起,也许我的问题不对 我正在尝试将UTC时间戳转换为JavaKotlin中的本地时间戳 f。exm UTC时间18:00德国当地时间是20:00我需要UTC时间戳中的德国当地时间 fun getLocalizedTime(locationId: Long, utcTimeInMs: Long? ): Long{ val instant = Instant.ofEpochMilli(utcTimeInMs?:Instant.now().toEpochMilli()
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转换为Pochmilli历元毫秒以UTC为单位
没有“特定时区内的toEpochMilli”这样的东西,如果你按照传统的定义去做的话就没有了。从历元引用开始的毫秒计数始终为UTC
从一个历元算起的毫秒数以UTC为单位。java.time和Unix/POSIX使用的历元参考是UTC 1970年的第一个时刻,1970-01-01T00:00Z。末尾的Z表示UTC,发音为“Zulu”。如今,各种信息系统使用了几十种其他的历代参考资料
所以说“时区的百万纪元”毫无意义
如果在UTC中有自1970年第一个时刻以来的毫秒计数,请将其解析为瞬间
要通过特定地区的人使用的挂钟时间查看同一时刻,请调整到时区以获得ZoneDateTime
Instant和ZoneDateTime都表示相同的同时时刻、时间线上的相同点、自历元引用以来的相同毫秒数
您可以从ZoneDateTime中提取一个瞬间,从epoch返回到原始计数
long millisecondsSinceEpoch = zdt.toInstant().toEpochMilli() ;
您会发现毫秒和毫秒的秒长整数是相同的数字
您的代码instant.atZonezoneId.toInstant没有意义。从瞬间开始,转换为ZoneDateTime,然后再转换回瞬间。所有三个对象都表示相同的时刻,即自epoch引用以来的相同毫秒数。你的那些电话没有完成任何有用的工作
德国时间到UTC
关于进一步的澄清,你说:
我需要UTC timestam格式的德国当地时间
定义你的特定时区
ZoneId z = ZoneId.of( "Europe/Berlin" ) ;
捕捉当前时刻,如图所示
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
通过提取一个瞬间来调整UTC
如果绝对需要,询问毫秒数
long milliseconds = instant.toEpochMilli() ; // Beware of data loss, as any microseconds/nanoseconds are ignored.
我不建议将时间作为历元的计数进行通信,因为分辨率毫秒与整秒、微秒与纳秒与其他事物的对比并不明显,历元参考也不明显。相反,以标准格式以文本形式传达时刻。在生成/解析文本时,java.time类默认使用ISO 8601格式。因此,无需指定格式化模式
如果只需要毫秒,请截断任何现有的微秒或纳秒
String output = instant.truncatedTo( ChronoUnit.MILLIS ).toString() ; // Generate text in standard ISO 8601 format.
看这个
zdt.toString:2020-05-09T23:57:35.363701+02:00[欧洲/柏林]
瞬变时间:2020-05-09T21:57:35.363701Z
毫秒:1589061455363
输出:2020-05-09T21:57:35.363Z
0对不起,可能是我的问题不对。。。。我正在尝试将UTC时间戳转换为JavaKotlin f中的本地时间戳。exm。UTC时间18:00德国当地时间是20:00我需要UTC时间戳中的德国当地时间…@DimitriRubinsteinTSS小心“本地”这个词。在java.time中,类名中的local一词表示任何或所有位置,而不是任何一个特定的位置。LocalDate、LocalTime和LocalDateTime类故意缺少时区或UTC偏移量的概念。@DimitriRubinsteinTSS请编辑您的问题,以便更清楚地说明您的问题和目标。在未来的岁月里,这一页可能会被成千上万的人阅读。@DimitriRubinsteinTSS将来,在发布前彻底搜索堆栈溢出。所有这些都已经被讨论过很多次了。
Instant instant = zdt.toInstant() ;
long milliseconds = instant.toEpochMilli() ; // Beware of data loss, as any microseconds/nanoseconds are ignored.
String output = instant.truncatedTo( ChronoUnit.MILLIS ).toString() ; // Generate text in standard ISO 8601 format.