【问题标题】:Java setting timezone while converting date from Mountain to Eastern to GMTJava设置时区,同时将日期从山区转换为东部到格林威治标准时间
【发布时间】:2014-07-28 16:11:32
【问题描述】:

我正在尝试将山区时间转换为东部时间到格林威治标准时间。但是当我在日期字段“gmtDate”中获得最终日期时,它会回到我当地的山区日期。

这是我的问题:

  • 我预计山区时间与东部时间会有 2 小时的差异。但看到的只是一小时的不同。这里有什么问题?
  • 同样,东部时间与 GMT 时间应该有 6 小时的差异,但这里显示的是 5 小时的差异。怎么了?
  • 最后,我尝试将日期和时间保存为 GMT,但看起来它又回到了山区时间。这里有什么问题?

这是我的最终输出:

DEBUG [main] (MyClass.java:100) - local  : 2014-07-14 10:11:04 MDT
DEBUG [main] (MyClass.java:108) - est    : 2014-07-14 11:11:04 EST
DEBUG [main] (MyClass.java:110) - =================================================
DEBUG [main] (MyClass.java:113) - gmt    : 2014-07-14 16:11:04 GMT
DEBUG [main] (MyClass.java:125) - gmt date : Mon Jul 14 10:11:04 MDT 2014
DEBUG [main] (MyClass.java:127) - =================================================

这是我的示例代码:

private Date testTimeZone(Date date, TimeZone sourceTimeZone, TimeZone targetTimeZone) {

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");

    Date localdate = null;
    try {
        localdate = df.parse("2014-07-14 09:11:04 MST");
    } catch (ParseException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    LOG.debug("local  : " + df.format(localdate));

    df.setTimeZone(TimeZone.getTimeZone("EST"));
    LOG.debug("est : " + df.format(localdate));

    LOG.debug("=================================================");

    df.setTimeZone(TimeZone.getTimeZone("GMT"));
    LOG.debug("gmt : " + df.format(localdate));

    Date gmtDate = null;
    try {
        gmtDate = df.parse(df.format(localdate));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    LOG.debug("gmt date : " + gmtDate);

    LOG.debug("=================================================");

    return gmtDate;
}

【问题讨论】:

  • 您应该使用 "America/New_York" 代表东部,"America/Denver" 代表山区,"UTC" 而不是 GMT。请记住,美国目前处于夏令时,仅指定 "EST" 并未考虑到这一点。

标签: java datetime timezone


【解决方案1】:

所以我运行了你的代码,我得到了gmt date : Mon Jul 14 12:11:04 EDT 2014而不是山区时间

这个时区对应于我的时区,这让我发现 Date.toString() 使用本地时区来格式化日期。根据 Java 日期规范,日期是:

一个毫秒值的瘦包装器,允许 JDBC 将其识别为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00.000 GMT 以来经过的毫秒数。

因此,您处理的整个 DateFormat 代码实际上并没有改变值。重要的是它是如何输出的。基本的毫秒数永远不会真正改变

另外,EST 用于冬季,EDT(东部夏令时间)用于夏季(更改此设置,您的前两个问题已解决)

【讨论】:

  • 改用joda time。这将有助于时区
【解决方案2】:

Java Date 代表一个时刻,不包括内部TimeZone。相反,您使用SimpleDateFormat(例如您已经拥有的!)来执行显示格式。

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
try {
  Date date = df.parse("2014-07-14 09:11:04 MST");
  df.setTimeZone( TimeZone.getTimeZone( "EST" ) );
  System.out.println(df.format(date));
  df.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
  System.out.println(df.format(date));
} catch (ParseException e) {
  e.printStackTrace();
}

哪些输出

2014-07-14 11:11:04 EST
2014-07-14 16:11:04 GMT

您得到gmt date : Mon Jul 14 10:11:04 MDT 2014 的原因是因为与DateFormat 关联的TimeZone 在您解析localdate 时更改为MDT - 在您的示例中为local : 2014-07-14 10:11:04 MDT

【讨论】:

    【解决方案3】:

    默认时区是您的本地时区,因此您应该使用:

    df.setTimeZone(TimeZone.getTimeZone("GMT");
    LOG.debug("gmt date : " + df.format(gmtDate));
    

    您可能想要使用 UCT(通用协调时间).. 这就是您想要存储和检索的内容(如果您使用数据库或其他存储。GMT 现在代表一个实际时区,UCT 是“参考”时间.

    【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2011-10-30
    • 2012-10-29
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多