Java将日期从Mountain转换为Eastern到GMT时设置时区

时间:2014-07-28 16:11:32

标签: java datetime timezone

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

以下是我的问题:

  • 我期待从山区到东部时间看到2小时的差异。但只能看到一些差异。这有什么问题?
  • 从东部时间到格林威治标准时间,应该有六个小时的差异,但这里显示的是5个小时的差异。有什么问题?
  • 最后,我试图将日期和时间保存为格林尼治标准时间,但看起来它正在回到山区时间。这有什么问题?

这是我的最终输出:

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;
}

3 个答案:

答案 0 :(得分:2)

所以我运行了你的代码而不是登山时间,我得到了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(东部夏令时)(更改此问题并解决前两个问题)

答案 1 :(得分:1)

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的原因是因为当您解析TimeZone时,与DateFormat相关联的localdate会更改为MDT - local : 2014-07-14 10:11:04 MDT示例

答案 2 :(得分:0)

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

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

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