Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 - Fatal编程技术网

Java SimpleDataFormatter解析的行为有所不同?

Java SimpleDataFormatter解析的行为有所不同?,java,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 [] arg

我试图弄清楚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,这代表UTC 11:45还是当地时间11:45(对于偏移量为+0200的国家)。在我看来,时间代表当地时间

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


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

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


日期方法确实尊重夏令时。尝试更改本地系统日期,您将看到返回的时间也会更改。或者尝试输入Date类支持的CDT、CST、MDT、MST和类似的timezome字符串-它们都知道自己的夏令时。

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

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


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

Fair point但我有点选错了,有时甚至会把我的话弄乱,请立即更改。不用担心。顺便说一句,想出“诵读困难症”这个词的人是一个虐待狂。时间/日期在计算机行业是一团混乱。因此,如果我想在叙利亚当地时间(11:45:00)通过考试,我必须在夏天通过+0300(因为夏天离UTC只有+3小时),在冬天通过+0200(时差离UTC只有2小时)?我能做些什么来避开这个问题吗?我是否可以将偏移量或时区值与日期和时间一起传递,而不管日期在我的机器上的位置(无论是夏季还是冬季),至少IST指向印度,因此使用Olson ID可能会更好。感谢您的解释,但是我在哪里可以找到Java接受的时区别名列表?我知道这与问题无关,但你知道我如何使用JavaScript生成它们(如果存在这种方法的话)?因为我希望能够允许用户选择时间和日期(代表他所在的位置),然后我需要传入时区,以便正确解析日期和时间。您可以签出以获得JVM支持的ID。