代码之家  ›  专栏  ›  技术社区  ›  Anton Konikov

转换为单一时区的日期[重复]

  •  0
  • Anton Konikov  · 技术社区  · 7 年前

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

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

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

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

    3 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    5 年前

    如果在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。

    它应该能更好地处理时区。

        2
  •  2
  •   Clint L    7 年前

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

        3
  •  1
  •   Anonymous    7 年前

    是否有人知道如何在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的偏移量,我们无法明确地确定时区,因为许多时区都使用此偏移量。