SimpleDateFormat解析表现不同?

时间:2012-03-30 11:51:28

标签: java

我试图了解java中的日期是如何被解析的,我似乎无法绕过我需要传递的参数来获得一致的输出,无论我在哪个时区。

我写了这个测试类:

import java.util.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.text.DateFormat;

public class TimeTest {

public static void main(String [] args) throws Exception
{

    String dateString = "2012-03-28 11:45:00 +0200";
    String dateString1 = "2012-03-28 11:45:00 +0000";
    Timestamp timestamp= null;
    Timestamp timestamp1= null;
    DateFormat planningDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
    Date date = planningDateFormat.parse(dateString);
    Date date1 = planningDateFormat.parse(dateString1);
    timestamp = new Timestamp(date.getTime());
    timestamp1 = new Timestamp(date1.getTime());
    System.out.println("Time value passed in was: " + dateString);
    System.out.println("Date value after parse: " + date);  
    System.out.println("Time stamp value is: " + timestamp);

    System.out.println("Time value passed in was: " + dateString1);
    System.out.println("Date value after parse: " + date1); 
    System.out.println("Time stamp value is: " + timestamp1);
}
}

给出以下输出:

Time value passed in was: 2012-03-28 11:45:00 +0200
Date value after parse: Wed Mar 28 10:45:00 IST 2012
Time stamp value is: 2012-03-28 10:45:00.0
Time value passed in was: 2012-03-28 11:45:00 +0000
Date value after parse: Wed Mar 28 12:45:00 IST 2012
Time stamp value is: 2012-03-28 12:45:00.0

现在让我解释为什么这个没有任何意义:

在第一次传球中,我在11:45的时间内以+0200偏移传球,它给我的时间IST是爱尔兰标准时间10:45。

任何人都可以向我解释那里发生了什么以及它如何得出这个结论?时间从11:45过去,这表示当地时间11:45 UTC或11:45(对于偏移量为+0200的国家/地区)。从我看来,在我看来,时间代表当地时间。

另一个问题是:
如果我在爱尔兰,冬天是+0000,夏天是+0100。根据我查询的日期,传入“Z”的值会改变吗?或者不应该java自动知道这取决于日期传递的时间?

我真的不知道发生了什么事。

2 个答案:

答案 0 :(得分:1)

格式模式中的Z表示与UTC的绝对偏移量。当您说11:45:00 +0200时,它等于09:45:00 UTC所代表的时间;即比UTC的时间提前2小时。由于IST是UTC + 1,我们有:

  

11:45:00 +0200 == 09:45:00 UTC == 10:45:00 IST

如果使用时区别名(例如Europe/Dublin)而不是绝对偏移量,Java将根据您提供的日期部分自动处理夏令时规则。

答案 1 :(得分:0)

是的,传入的时间是当地时间。通过说2012-03-28 11:45:00 +0200你实际上说“11:45在时区中对于UTC +02:00”。当然,时间以当地时间显示(由于DST,它与UTC相比为+01:00,因此从通过的时间减去一小时)。

Date方法确实遵守夏令时。尝试更改本地系统日期,您会看到返回的时间也会发生变化。或者尝试输入CDT,CST,MDT,MST和Date类支持的类似timezome字符串 - 他们都知道夏令时。