当前位置: 首页 > 知识库问答 >
问题:

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

周伟泽
2023-03-14

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

我正在尝试将UTC时间戳转换为Java(Kotlin)中的本地时间戳

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

共有1个答案

刘狐若
2023-03-14

没有“特定时区的toEpochMilli”这样的东西,如果你按照传统的定义来定义的话就不会有。从历元引用开始的毫秒计数始终为UTC。

从一个历元算起的毫秒数以UTC为单位。java使用的epoch引用。时间和Unix/POSIX,是UTC 1970年的第一个时刻,1970-01-01T00:00Z。末尾的Z表示UTC,发音为“Zulu”。如今,各种信息系统使用了数十种其他的历代参考资料。

所以说“时区中的百万纪元”毫无意义。

如果在UTC中有自1970年第一个时刻起的毫秒计数,请将其解析为即时

Instant instant = Instant.ofEpochMilli( milliseconds ) ;

要通过特定地区的人使用的挂钟时间查看同一时刻,请调整到时区以获得分区DateTime。

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

InstantZonedDateTime都表示相同的同时时刻、时间线上的相同点、自纪元引用以来的相同毫秒计数。

您可以从ZonedDateTime中提取Instant以返回到原始的count-from-纪元。

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

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

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

关于进一步的澄清,你说:

我需要UTC timestam中的德国当地时间

定义您的特定时区。

ZoneId z = ZoneId.of( "Europe/Berlin" ) ;

捕捉当前时刻,如图所示。

ZonedDateTime zdt = ZonedDateTime.now( z ) ;

通过提取一个瞬间来调整UTC。

Instant instant = zdt.toInstant() ;

如果绝对需要,询问毫秒数。

long milliseconds = instant.toEpochMilli() ;  // Beware of data loss, as any microseconds/nanoseconds are ignored. 

我不建议将时刻作为纪元计数进行通信,因为分辨率(毫秒与整秒、微秒与纳秒与其他东西)不明显,纪元引用也不明显。相反,以标准ISO 8601格式的文本形式传达时刻。java.time类在生成/解析文本时默认使用ISO 8601格式。因此无需指定格式模式。

如果只需要毫秒,请截断任何现有的微秒或纳秒。

    String output = instant.truncatedTo( ChronoUnit.MILLIS ).toString() ;  // Generate text in standard ISO 8601 format.

查看此代码在IdeOne上实时运行。通用域名格式。

zdt。toString():2020-05-09T23:57:35.363701 02:00[欧洲/柏林]

瞬间toString():2020-05-09T21:57:35.363701Z

毫秒:1589061455363

输出:2020-05-09T21:57:35.363Z

 类似资料:
  • 我有当前的毫秒utc/unix时间,现在我想将其转换为特定时区的日期时间,例如EST utc-5(纽约)。 我使用以下方法获得当前的毫秒/ unix时间: 现在我想把这个长值转换成一个特定的时区。 我如何使用 Joda time 做到这一点,因为我听说这是最好的库,但 API 对我来说似乎有点混乱。

  • 由于我们应用程序中的时区问题,我面临一些问题。 我们有一些相互依赖的服务,这些服务给我们提供了最短的时间。我们在EST时区,所以之前没有任何问题。最近,我们转到UTC时区,开始看到这个问题。对于我们来说,我们可能会再次来回(EST/UTC)。 所以我想做的是检查我的JVM时区,如果我的时区是UTC,我想将依赖服务的时间转换为UTC,如果我们在EST中,我什么也不做,因为依赖服务总是用EST响应。我

  • 我做了下面的代码,但我知道它是正确的或不是,请协助我做正确的方式时区转换。 我把UTC日期作为json字符串,转换成用户的时区格式,并显示Android端

  • 我们在本地时区(如EST、PST、CST等)的sql中有多列。我们希望将UTC时区中的所有这些时区转换为考虑到日光节省并将其保存到另一列。 我尝试了下面的查询,但它将UTC转换为当地时区(EST ),但我正在寻找EST到UTC时区。 选择CONVERT(日期时间,SWITCHOFFSET(日期时间字段,日期部分(TZOFFSET,时间区域“东部标准时间”的日期时间字段))

  • 问题内容: 这是我的约会日期“ 15-05-2014 00:00:00” 如何将IST转换为UTC即(到14-05-2014 18:30:00) 基于时区到UTC时区。 我的代码是 如果用户从任何区域输入相同的日期,则将获得UTC时间(例如:从澳大利亚,然后从15-05-2014 00:00:00到14-05-2014 16:00:00) 请任何建议。 问题答案: 您不能将日期值“转换为”其他时区

  • 我有一个日期。它是如何存储在数据库中的。我正在使用并调用此函数。 在这里,我知道我的