我正在尝试格式化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;
}
答案 0 :(得分:1)
Calendar#getTime()
实现为(Oracle JDK7)
public final Date getTime() {
return new Date(getTimeInMillis());
}
因此,无论TimeZone
具有Calendar
,Date
对象在调用其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:49
。 Date
变量表示特定时刻,而不是小时,分钟,秒和时区的特定值集。
当您在SimpleDateFormatter
中设置时区时,您会说,“当我们格式化此日期时,请显示PST中的小时,分钟和秒数,对应于日期所代表的任何时刻”。因此,不要将此视为将时间从EST转换为PST - 将其视为输出特定时刻的小时,分钟和秒,而是根据特定时区进行操作。