【问题标题】:Transformation date to single time zone [duplicate]将日期转换为单个时区 [重复]
【发布时间】:2018-10-17 07:57:50
【问题描述】:

我有两个以毫秒为单位的时间戳,它们是在不同时区创建的,无法转换为同一时区。

Date_1 = 1525694035615 - Mon May 07 2018 11:53:55

Date_2 = 1525686835730 - Mon May 07 2018 09:53:55

是否有人知道如何识别时区并获取 UTC+0 的值?

当我转换这些时间戳时,总是得到这些时间戳具有时区 +0 的值。

【问题讨论】:

  • 时间戳与时区无关。
  • 使用TimeZone (java.util.TimeZone),看看有没有问题
  • @Nephilim 不要使用过时的TimeZone 类。使用java.time, the modern Java date and time API
  • 您提供的值已经是 UTC+0。例如 1525694035615 与 2018 年 5 月 7 日星期一 11:53:55 UTC 的时间点相同。在另一个时区,时间可能(但不确定)是别的。
  • @Compass 更准确地说,此类时间戳采用 UTC(可能)。

标签: java date time


【解决方案1】:

如果您在 Java 中创建毫秒时间戳,它们总是毫秒

UTC 时间 1970 年 1 月 1 日午夜

并且对时区一无所知。

你看到了什么:

2018 年 5 月 7 日星期一 11:53:55

2018 年 5 月 7 日星期一 09:53:55

这些时刻的字符串表示在当前 JVM/计算机时区

如果您需要在 UTC 时区中使用字符串表示形式,那么有很多类可以做到这一点。在所有 JDK 中都有日历实现(例如 GregorianCalendar)。从 Java 8 开始,有受 Joda time 启发的新 API。

它应该更好地处理时区。

【讨论】:

  • 不,java.time-API 并非来自 JodaTime(仅“受启发”)。
  • 好的。我对新的 API 不是很熟悉 :-( 到目前为止,对我来说,对特殊的 DateTime 处理没有特别的需求......
【解决方案2】:

如果您得到 timezone+0,那是因为这是给定任何固定时间(在您的示例中为毫秒)的默认时区。如果您想要与 UTC+0 不同的时区,则必须告诉它您所在的时区。

【讨论】:

  • 我正在寻找更独立的解决方案,因为其中一个时间戳是从一个后端获取的,并且可以根据环境进行更改。其他后端的哪个时区将更难识别。
  • @AntonKonikov 好吧,您无法从任何地方创建信息。几毫秒不包含有关生成它的人使用的时区的信息,因此不可能从中获得准确的时区。如果您需要知道多个来源的时区,除了毫秒数之外,您还需要他们说出他们的时区。
  • @AntonKonikov 您的独立性取决于您提到的“其他后端”。他们必须告诉您他们所在的时区。您无法仅通过以毫秒为单位的时间来弄清楚。您将需要每个系统的映射以及它们对应的时区是什么,或者检索它。
【解决方案3】:

有没有人知道如何……获取 UTC+0 的值?

我先做简单的部分:

    OffsetDateTime dateTime = Instant.ofEpochMilli(1_525_694_035_615L)
            .atOffset(ZoneOffset.UTC);
    System.out.println(dateTime);

打印出来:

2018-05-07T11:53:55.615Z

这与您在问题中所说的一致。最后的Z 表示UTC。

…如何识别时区…

我们不能完全正确。如果您知道时间戳在其生成的时区中对应的时间,我们可以计算偏移量。因为当答案是 UTC 时这很无聊,所以我举一个不同的例子:

    long timestamp = 1_525_708_128_067L;
    LocalDateTime dateTimeInUnknownTimezone = LocalDateTime.of(2018, Month.MAY, 7, 18, 48, 48);

    LocalDateTime utcDateTime = Instant.ofEpochMilli(timestamp)
            .atOffset(ZoneOffset.UTC)
            .toLocalDateTime()
            .truncatedTo(ChronoUnit.SECONDS);

    int offsetInSeconds = (int) ChronoUnit.SECONDS.between(utcDateTime, dateTimeInUnknownTimezone);
    ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetInSeconds);
    System.out.println(offset);

+03:00

由于日期时间仅具有秒精度,因此我还将 UTC 时间截断为秒以使偏移精确。但是,从 +03:00 的偏移量我们无法明确确定时区,因为许多时区都使用此偏移量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2014-06-26
    相关资源
    最近更新 更多