【问题标题】:SimpleDateFormatter seems to be ignoring TimeZoneSimpleDateFormat 似乎忽略了 TimeZone
【发布时间】:2014-02-03 03:57:43
【问题描述】:

我正在尝试格式化日历对象以返回特定格式的时间。 但是,SimpleDateFormatter 忽略了 Calendar obj 的 TimeZone 和它自己的 TimeZone 属性,并进行了不必要的时间转换。我的电脑在 EST 中,我在“PST”中传递日历 obj。传入的时间是:Tue Jan 14 10:28:49,我期待返回 val 为“10:28:49 AM PST”。然而,返回的值是“07:28:49 AM PST”。当格式化程序 obj 设置为 PST 时,为什么要进行时区计算?另外,如何防止从 EST 到 PST 的 tz 转换?

代码如下:

public static String formatDateToString(Calendar cal) {
        if (cal != null) {
            TimeZone tz = cal.getTimeZone();
            String tzId = tz.getID();**//"PST"**

            Date date = cal.getTime();
            String str = date.toString();**//"Tue Jan 14 10:28:49 EST 2014"**
            final SimpleDateFormat sdFormatter = new SimpleDateFormat("hh:mm:ss a zzz");

            sdFormatter.setTimeZone(TimeZone.getTimeZone(tzId));
            String calStr = sdFormatter.format(cal.getTime());**//"07:28:49 AM PST"**

            return calStr;
        }

        return null;
    }

【问题讨论】:

    标签: java datetime calendar timezone simpledateformat


    【解决方案1】:

    Calendar#getTime() 实现为(Oracle JDK7)

    public final Date getTime() {
        return new Date(getTimeInMillis());
    }
    

    所以不管TimeZone 和Calendar 有什么,当您调用toString() 方法时,Date 对象将使用系统的默认值。

    EST 比 PST 早 3 小时。


    从你的代码 sn-p 中的 cmets,

    String tzId = tz.getID();**//"PST"**
    ...
    String str = date.toString();**//"Tue Jan 14 10:28:49 EST 2014"**
    final SimpleDateFormat sdFormatter = new SimpleDateFormat("hh:mm:ss a zzz");
    
    sdFormatter.setTimeZone(TimeZone.getTimeZone(tzId));
    String calStr = sdFormatter.format(cal.getTime());**//"07:28:49 AM PST"**
    

    一切似乎都很好。您正在将表示为 Tue Jan 14 10:28:49 EST 2014 的时间格式化为 PST 值。时间本身是完全一样的。表示方式不同。

    如果您不想将其显示为 PST,请忽略 setTimeZone() 调用。

    【讨论】:

    • 我想知道的是如何防止tz从EST转换为PST?
    • @Neeraj 查看我的评论。也许我误解了你的担忧。
    【解决方案2】:

    在不更改 日期 数字的情况下更改 时区 的最佳选择是 joda time lib 的 withZoneRetainFields() DateTime 类:

     Calendar cal = GregorianCalendar.getInstance();
     DateTime dt = new DateTime(cal);
     DateTime dtz = dt.withZoneRetainFields(DateTimeZone.forID("US/Pacific"));
    
     System.out.println(dt.toString());     
     System.out.println(dtz.toString());
    

    虽然 Calendar 类将在 EST 中包含您当前的实例,但您将获得相同的时间数字转换为 PST(无自我计算)。

    输出:

    2014-01-15T12:00:51.324+05:30
    2014-01-15T12:00:51.324-08:00
    

    更多详情here.

    【讨论】:

      【解决方案3】:

      这似乎正在按应有的方式工作。如果date.toString(); 是"Tue Jan 14 10:28:49 EST 2014",那么date 表示的时间在PST 中确实是7:28:49,或者在EST 中是10:28:49。 Date 变量代表一个特定的时刻,而不是一组特定的小时、分钟、秒和时区值。

      当您在SimpleDateFormatter 中设置时区时,您的意思是,“当我们格式化此日期时,在 PST 中显示小时、分钟和秒,对应于日期所代表的任何时刻”。因此,不要将其视为将时间从 EST 转换为 PST - 将其视为输出特定时刻的小时、分钟和秒,而是根据特定时区执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 2016-09-30
        • 2016-03-16
        • 2012-03-11
        • 2013-09-07
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多