Java SimpleDataFormatter似乎忽略了时区
我正在尝试格式化日历对象,以便以特定格式返回时间。 但是,SimpleDataFormatter忽略了Calendar obj的时区及其自己的时区属性,并进行了不必要的时间转换。我的电脑在EST,我正在通过“PST”中的日历obj。过去的时间是:1月14日星期二10:28:49,我希望返回值为“太平洋标准时间上午10:28:49”。但是,返回的值是“太平洋标准时间07:28:49 AM”。当格式化程序obj设置为PST时,为什么要进行时区计算?另外,如何防止从EST到PST的tz转换 代码如下:Java SimpleDataFormatter似乎忽略了时区,java,datetime,calendar,timezone,simpledateformat,Java,Datetime,Calendar,Timezone,Simpledateformat,我正在尝试格式化日历对象,以便以特定格式返回时间。 但是,SimpleDataFormatter忽略了Calendar obj的时区及其自己的时区属性,并进行了不必要的时间转换。我的电脑在EST,我正在通过“PST”中的日历obj。过去的时间是:1月14日星期二10:28:49,我希望返回值为“太平洋标准时间上午10:28:49”。但是,返回的值是“太平洋标准时间07:28:49 AM”。当格式化程序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;
}
Calendar#getTime()
实现为(Oracle JDK7)
因此,无论Calendar
的时区如何,Date
对象在调用其toString()
方法时将使用系统的默认值
美国东部时间比太平洋标准时间早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"**
一切似乎都很好。您正在将表示为2014年1月14日星期二10:28:49 EST的时间格式化为PST值。时间本身是完全一样的。代表性是不同的
如果您不想将其显示为PST,请省略setTimeZone()
调用。这似乎是它应该的工作方式。如果date.toString()
是“2014年1月14日星期二10:28:49美国东部时间”
,那么在PST中用日期表示的时间实际上是7:28:49
,或者在美国东部时间中是10:28:49
。Date
变量表示时间中的特定时刻,而不是小时、分钟、秒和时区的特定值集
当您在
SimpleDataFormatter
中设置时区时,您的意思是,“当我们格式化此日期时,以PST显示小时、分钟和秒,对应于日期所代表的任何时刻”。因此,不要认为这是将一个时间从EST转换为PST——把它看作是输出一个特定时刻的小时、分钟和秒,但要按照一个特定的时区进行操作。在不更改日期的情况下更改时区的最佳选择是lib的WithZoneReainfields()
属于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
更多细节。我想知道的是如何防止tz从EST转换为PST?@Neeraj请看我的评论。也许我误解了您的担忧。
2014-01-15T12:00:51.324+05:30
2014-01-15T12:00:51.324-08:00