【问题标题】:TimeZone gost haunting my datetime parsingTimeZone 困扰着我的日期时间解析
【发布时间】:2012-03-01 04:45:35
【问题描述】:

我不能使用 Joda。当我尝试从表示 UTC 日期或日期时间的字符串创建日期或日历时,生成的对象具有与之关联的时区...

代码如下:

案例一:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyDDD");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("2012018");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Tue Jan 17 19:00:00 EST 2012 !?!*&#&??

案例 2:

SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("1202011431");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Wed Feb 01 09:31:00 EST 2012 !?!*&#&??

【问题讨论】:

    标签: java date calendar timezone simpledateformat


    【解决方案1】:

    当您打印时间时,它始终以您机器上配置的本地时区打印,这就是您想要的(以 UTC 存储和表示日期/时间,并在演示期间转换为用户特定的时区)。

    【讨论】:

      【解决方案2】:

      是的,Java 中的日期有一个与之关联的时区。 Date 上的 toString 以本地时区打印日期。如果您不想这样,请使用 DateFormat 不显示它。请注意,您需要将 DateFormat 上的时区设置为 UTC 才能得到您想要的。

      【讨论】:

        【解决方案3】:

        java.util.Date 类型的对象是自 Epoch 以来的绝对时间量。当您从日历创建 Date 对象时,它会丢失日历可能一直在使用的任何 TimeZone,并且只会为您提供原始时间量。 EST 与您的 Date 并没有真正“关联”,只是 Date 上的 toString 方法使用 JVM 默认时区来创建人类可读的表示。

        请务必了解,上述代码示例中的 Calendar 的使用完全没有。像这样更改时区只会更改该日历的人类可读表示。在您调用setTimegetTime 之前和之后,自纪元以来的原始毫秒数是相同的。

        (java.util.Date 上与人类可读表示相关的所有方法都已弃用并且无法正常工作,最好只是假装它们不存在。)

        【讨论】:

          猜你喜欢
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多