Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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日历时区_Java_Date_Time_Calendar - Fatal编程技术网

Java日历时区

Java日历时区,java,date,time,calendar,Java,Date,Time,Calendar,我试图将时间戳(毫秒)转换为另一个时区(GMT-7:00美国/洛杉矶),但转换后得到的时间不是我期望的时间。有人能向我解释为什么会发生这种情况,以及我如何才能正确地做到这一点吗?我的本地时区是“GMT+5:30” 您提供的时间(毫秒)为2019年9月5日星期四格林尼治标准时间21:00:00+5:30,实际上是2019年9月5日星期四UTC标准时间15:30:00。现在你只是把这个时间转换成洛杉矶时区。这将为您提供2019年9月5日星期四GMT-7:00的08:30:00 每当时间以毫秒表示时,

我试图将时间戳(毫秒)转换为另一个时区(GMT-7:00美国/洛杉矶),但转换后得到的时间不是我期望的时间。有人能向我解释为什么会发生这种情况,以及我如何才能正确地做到这一点吗?我的本地时区是“GMT+5:30”


您提供的时间(毫秒)为2019年9月5日星期四格林尼治标准时间21:00:00+5:30,实际上是2019年9月5日星期四UTC标准时间15:30:00。现在你只是把这个时间转换成洛杉矶时区。这将为您提供2019年9月5日星期四GMT-7:00的08:30:00

每当时间以毫秒表示时,它实际上是从历元开始的UTC毫秒时间。报告明确指出了这一点

时间上的一个瞬间可以用毫秒值表示,毫秒值是从1970年1月1日00:00:00.000 GMT(格里高利)开始的历元偏移量


您提供的时间(毫秒)为2019年9月5日星期四格林尼治标准时间21:00:00+5:30,实际上是2019年9月5日星期四UTC标准时间15:30:00。现在你只是把这个时间转换成洛杉矶时区。这将为您提供2019年9月5日星期四GMT-7:00的08:30:00

每当时间以毫秒表示时,它实际上是从历元开始的UTC毫秒时间。报告明确指出了这一点

时间上的一个瞬间可以用毫秒值表示,毫秒值是从1970年1月1日00:00:00.000 GMT(格里高利)开始的历元偏移量


阿迪蒂·古普塔已经说过,8:30是正确的。21:00+05:30等于UTC 15:30,而UTC又等于08:30-07:00,这与洛杉矶的太平洋夏令时一致。您还可以使用在线历元转换器进行检查,例如1567697400(seoncds)等于2019年9月5日星期四15:30:00 UTC。我相信你的期望是从当地时间减去7小时,而不是从UTC时间减去7小时

我建议您不要使用
时区
日历
。这些课程设计拙劣,早已过时。而是使用
Instant
ZoneDateTime
ZoneId
,所有这些都来自java.time,即现代java日期和时间API。有关转换的正确和现代方式,请参见(例如,您的问题可能被视为与其他问题的重复,这取决于您如何看待它)


不要使用
GMT+5:30
GMT-07:00
作为时区。在一年中的标准时间内,后者不适用于洛杉矶。使用更适合您所在地区的
亚洲/科伦坡
亚洲/加尔各答
,然后使用
美国/洛杉矶
。它们能更好地传达你的意图,并且在历史和现在的日期全年都能正常工作。

正如阿迪蒂·古普塔所说,8:30是正确的。21:00+05:30等于UTC 15:30,而UTC又等于08:30-07:00,这与洛杉矶的太平洋夏令时一致。您还可以使用在线历元转换器进行检查,例如1567697400(seoncds)等于2019年9月5日星期四15:30:00 UTC。我相信你的期望是从当地时间减去7小时,而不是从UTC时间减去7小时

我建议您不要使用
时区
日历
。这些课程设计拙劣,早已过时。而是使用
Instant
ZoneDateTime
ZoneId
,所有这些都来自java.time,即现代java日期和时间API。有关转换的正确和现代方式,请参见(例如,您的问题可能被视为与其他问题的重复,这取决于您如何看待它)

不要使用
GMT+5:30
GMT-07:00
作为时区。在一年中的标准时间内,后者不适用于洛杉矶。使用更适合您所在地区的
亚洲/科伦坡
亚洲/加尔各答
,然后使用
美国/洛杉矶
。它们能更好地传达你的意图,并且在历史日期和现在日期全年都能正常工作。

tl;博士 细节 另外两个答案和答案都是正确的。我将添加一些示例代码

您正在使用一年前被java.time类取代的糟糕的日期时间类

Instant
我正在尝试转换时间戳(毫秒)

如果您的毫秒计数是从UTC中1970年第一个时刻的历元引用开始计算的,请将其解析为
瞬间

long input = 1_567_697_400_000L ;  // Count of milliseconds since 1970-01-01T00:00:00Z.
Instant instant = Instant.ofEpochMilli( input ) ;
instant.toString():2019-09-05T15:30:00Z

时区 到另一个时区(GMT-7:00美国/洛杉矶)

使用而不仅仅是UTC的偏移量

将时区(
ZoneId
)应用于您的
即时
以调整到时区,从而生成一个
ZonedDateTime
对象

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
zdt.toString():2019-09-05T08:30-07:00[美国/洛杉矶]

始终指定时区 我的本地时区是“GMT+5:30”

您自己的本地时区应该与日期时间处理无关,JVM的默认时间也是如此

在java.time中,时区和偏移量参数是可选的。如果省略,则隐式应用JVM的当前默认时区。在我看来,这是java.time设计中为数不多的缺陷之一——这些区域参数应该是必需的。我建议您始终明确指定所需/预期时区

如果你愿意,我们可以调整到你自己的时区明确询问JVM的当前默认时区,让读者清楚地了解代码的意图

ZoneId zDefault = ZoneId.systemDefault() ;
ZonedDateTime zdtDefault = zdt.withZoneSameInstant( zDefault ) ;
zdtDefault.toString():2019-09-05T21:00+05:30[亚洲/加尔各答]

IdeOne.com演示 看看这一切


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

项目
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
ZoneId zDefault = ZoneId.systemDefault() ;
ZonedDateTime zdtDefault = zdt.withZoneSameInstant( zDefault ) ;