【问题标题】:SimpleDateFormat ignores TimeZoneSimpleDateFormat 忽略 TimeZone
【发布时间】:2015-05-16 03:58:15
【问题描述】:

我已经阅读了很多关于此的帖子,但是,我显然遗漏了一些东西。我有日期字符串和时区。我正在尝试按如下方式实例化一个日期对象:

        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
        java.util.Date dateObj = sdf.parse("2013-10-06 13:30:00");
        System.out.println(dateObj);

打印的内容是: Sun Oct 06 09:30:00 EDT 2013

我想要的是 UTC 格式的日期对象。没有人转换为 EDT。我做错了什么?

谢谢。

【问题讨论】:

    标签: java simpledateformat


    【解决方案1】:

    这是因为Date 对象不存储任何时区信息。 Date 基本上只存储自纪元(1970 年 1 月 1 日)以来的毫秒数。默认情况下,日期将使用与 JVM 关联的时区。为了保留时区信息,您应该继续使用您已经拥有的 DateFormat 对象。

    见 DateFormat#format(Date): http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#format(java.util.Date)

    以下内容应为您提供所需的内容:

    System.out.println(sdf.format(dateObj));
    

    【讨论】:

    • 这是零意义,因为您还需要时区信息进行解析......如果我在时区 A 中解析 14:30,我应该得到有效的日期对象,时间为 x:30 CEST,而不是 14: 30 CEST 或您默认的任何时区,这是错误的!
    【解决方案2】:

    试试下面的代码,你会发现第一次解析的日期与设置时区后解析的日期不同。实际上,日期是在正确的时区按预期解析的。它在打印时为您提供机器的默认 TZ。 您可以打印 dateObj.toGMTString() 来检查相同的内容,但这已被弃用。

        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        Date dateObj = sdf.parse("2013-10-06 13:30:00");
        System.out.println(dateObj.toString());
    
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        dateObj = sdf.parse("2013-10-06 13:30:00");
        System.out.println(dateObj.toString());
    

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多