【问题标题】:How to set Date object to point to different time zone in java如何在java中设置Date对象指向不同的时区
【发布时间】:2016-01-12 16:12:02
【问题描述】:

在下面的代码中,我使用日历对象将时区初始化为 GMT 并相应地获取时间,但是当我放回日期对象时,它会自动转换为我的本地时区,即 IST。

Calendar gmt = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
Date dt=gmt.getTime();

任何人都可以提出一种方法,通过它我也可以在日期对象中保留 GMT 格式。

【问题讨论】:

    标签: java date datetime time timezone


    【解决方案1】:

    它会自动转换为我的本地时区,即 IST

    不,不是。 Date 对象没有时区 - 它只是一个瞬间。

    如果您在Date 上调用toString(),您将看到系统本地时区,因为不幸的是Date.toString() 所做的...但是时区不是存储在@ 中的信息的一部分987654325@.

    如果您想在特定时区查看 Date 的文本表示,请使用 DateFormat 并设置您要使用的时区。

    【讨论】:

    • 我想这是我第一次打败你,乔恩! \o/
    • 当我调试时,在 cdate 中它代表的 zoneinfo 具有 ID“亚洲/加尔各答”。它不与 Date 对象链接吗?
    • @sunder:它不是Date 对象中逻辑数据的一部分,不。这是一个实现细节,用于在某些情况下避免一些算术,但没有 - 没有“时区 X 中的 Date”之类的东西。最好忽略该实现细节,因为它显然会误导您。
    【解决方案2】:

    java.time

    其他答案都是正确的。 toString 方法静默应用您的 JVM 当前的默认时区。这是旧日期时间类中许多糟糕的设计选择之一。转储那些旧课程。继续使用 Java 8 及更高版本中内置的 java.time 框架。

    Instant 是 UTC 时间线上的时刻。

    Instant now = Instant.now();
    

    将时区 (ZoneId) 应用于 Instant 以获得 ZonedDateTime

    如果Instant 已经是UTC,我们为什么还要费心在UTC 中创建ZonedDateTime?因为 ZonedDateTime 使您可以灵活地格式化日期时间值的字符串表示形式。 java.time.format 包不适用于Instant 对象。

    ZoneId 的子类 ZoneOffset 有一个 UTC 常量。

    ZonedDateTime zdtUtc = ZonedDateTime.ofInstant(  ZoneOffset.UTC );
    

    调整到任何所需的时区。

    ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
    ZonedDateTime zdtKolkata = ZonedDateTime.ofInstant( instant , zoneId );
    

    使用正确的时区名称

    避免使用 3-4 个字母的时区代码。它们既不标准化也不独特。 IST 是指印度标准时间还是爱尔兰标准时间

    使用standard time zone names。大多数是大陆/地区的格局。对于印度,Asia/Kolkata。对于爱尔兰,Europe/Dublin

    【讨论】:

    • 很好的补充。我还没有弄清楚时区命名的“标准”到底是什么:IANA、TZ、Olson、TimeZoneInfo?您声称 TZ 是标准,但我怀疑这已经解决了。
    【解决方案3】:

    Date 类不代表时区。它的 toString 方法使用默认的平台时区来输出人类可读的时间戳,在内部它只是一个很长的时间。

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多