Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 Date在美国服务器中返回了错误的年份 我正在英国开发代码,我正在编制一个在英国工作正常的日期字段,当我在美国部署服务器时代码错误一年。这是密码 public static void main(String args[]) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); String dateStr = sdf.format(1293840000000L); System.out.println(dateStr); } 在Windows本地的英国本地,该代码正确输出: 2011-01-01T00:00:00Z_Java_Datetime - Fatal编程技术网

Java Date在美国服务器中返回了错误的年份 我正在英国开发代码,我正在编制一个在英国工作正常的日期字段,当我在美国部署服务器时代码错误一年。这是密码 public static void main(String args[]) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); String dateStr = sdf.format(1293840000000L); System.out.println(dateStr); } 在Windows本地的英国本地,该代码正确输出: 2011-01-01T00:00:00Z

Java Date在美国服务器中返回了错误的年份 我正在英国开发代码,我正在编制一个在英国工作正常的日期字段,当我在美国部署服务器时代码错误一年。这是密码 public static void main(String args[]) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); String dateStr = sdf.format(1293840000000L); System.out.println(dateStr); } 在Windows本地的英国本地,该代码正确输出: 2011-01-01T00:00:00Z,java,datetime,Java,Datetime,在美国的服务器上,在linux机器上输出相同的代码 2010-12-31T18:00:00Z 这一定是某个时区的问题吧?差别只有一天。。或者准确地说是几个小时 自2010年12月31日至2011年1月1日。因为英国的时代在我们前面 以毫秒为单位的时间(如1293840000000L)表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。因此,英国和美国的相同值有所不同。您的模式以硬编码的“Z”结尾,这会误导您认为它不是UTC。如果使用实时时区: DateFormat sdf

在美国的服务器上,在linux机器上输出相同的代码

2010-12-31T18:00:00Z

这一定是某个时区的问题吧?

差别只有一天。。或者准确地说是几个小时

自2010年12月31日至2011年1月1日。因为英国的时代在我们前面


以毫秒为单位的时间(如1293840000000L)表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。因此,英国和美国的相同值有所不同。

您的模式以硬编码的“Z”结尾,这会误导您认为它不是UTC。如果使用实时时区:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
Z周围没有引号,您将看到差异只是一个时区偏移

下面是一个重现问题的示例,这是由于SimpleDataFormat使用默认时区造成的:

Date dt = new Date(1293840000000L);

TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
String dateStr = sdf.format(dt);
System.out.println(dateStr); //prints 2010-12-31T18:00:00 -0600

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");
dateStr = sdf.format(dt);
System.out.println(dateStr); //prints 2011-01-01T00:00:00 +0000
警察说

日期表示为日期对象或自1970年1月1日00:00:00 GMT以来的毫秒数


我的。这意味着,如果要将日期指定为毫秒长,则需要负责任何时区计算。

它看起来像是时区差异。美国比英国落后几个小时,具体的差别取决于你在哪里

在这种情况下,相差六个小时。我相信这是CST到GMT,所以你的用户可能有不同的语言环境设置。这意味着字符串是正确的。如果需要相同的字符串,则需要更改区域设置或确保正在打印GMT偏移量


例如,DateFormat sdf=新的SimpleDataFormatyyy MM dd HH:MM:ss Z

这些是什么时区?看起来有几个小时的时间差?T00,T18 T=时区。因此:转换可能是正确的,6小时的时间差听起来对美国东海岸和英国时间来说是正确的。实际上只有6小时。