Kotlin 如何在特定时区将即时UTC转换为Pochmilli

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()

编辑:对不起,也许我的问题不对

我正在尝试将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())
        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.