SimpleDateFormat似乎忽略了TimeZone

时间:2014-01-14 21:42:00

标签: java datetime calendar timezone simpledateformat

我正在尝试格式化Calendar对象以返回特定格式的时间。 但是,SimpleDateFormatter忽略了Calendar obj的TimeZone和它自己的TimeZone属性并进行了不必要的时间转换。我的电脑在EST,我在“PST”中传递Calendar obj。传递的时间是:1月14日星期二10:28:49,我期待返回值为“PST太平洋时间上午10:28:49”。但是,返回的值是“太平洋标准时间上午07:28:49”。为什么在格式化程序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;
    }

3 个答案:

答案 0 :(得分:1)

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

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

因此,无论TimeZone具有CalendarDate对象在调用其toString()方法时都将使用系统的默认值。

EST比PST快3小时。


来自您的代码段中的评论,

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()来电。

答案 1 :(得分:1)

更改时区而不更改日期数字的最佳选择是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

答案 2 :(得分:0)

这看似按照应有的方式运作。如果date.toString();"Tue Jan 14 10:28:49 EST 2014",则date代表的时间在PST中确实为7:28:49,在EST中为10:28:49Date变量表示特定时刻,而不是小时,分钟,秒和时区的特定值集。

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