Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormatter似乎忽略了时区_Java_Datetime_Calendar_Timezone_Simpledateformat - Fatal编程技术网

Java SimpleDataFormatter似乎忽略了时区

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转换 代码如下:

我正在尝试格式化日历对象,以便以特定格式返回时间。 但是,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