Java 设置时区,同时将日期从山地转换为东部到格林威治标准时间

标签 java datetime timezone

我正在尝试将山地时间转换为东部时间再转换为 GMT 时间。但是,当我在日期字段“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;
}

最佳答案

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

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

A thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE value. A milliseconds value represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT.

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

此外,EST 用于冬季,EDT(东部夏令时)用于夏季(改变这个,您的前两个问题就解决了)

关于Java 设置时区,同时将日期从山地转换为东部到格林威治标准时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24999482/

相关文章:

java - 如何为单个 Spring Boot 应用程序创建两个日志文件

java - Sonar 想要关闭 Stream

java - 如何使用 Java 流计算两个聚合函数?

java - 美国/马萨特兰时区无法解析的日期

elasticsearch - Elasticsearch 聚合中的动态时区偏移量?

java - 使用单个低位数字时,最小值和最大值不能正常工作

java - Joda时间(Java): Hijri to Gregorian conversion inaccurate?

datetime - 如何使用NodaTime保存时间戳?

javascript - 不同的日期值

php - 在 PHP 中为巴基斯坦设置时区