在Java中将IST转换为GMT时出现问题

在Java中将IST转换为GMT时出现问题,java,Java,在将IST转换为GMT时,我遇到了一个奇怪的问题。除了下午5:30和6:30之外,转换可以24小时正常工作。在这段时间内,不是将时间转换为12:00:00,而是转换为00:00:00,所以我猜IST是指印度标准时间;i、 格林尼治标准时间+5:30 因此,下午5:30 IST将是格林尼治标准时间中午12:00,使用传统的24小时时钟是12:00:00。(或者他们过去称之为“铁路时间”) 如果没有您进一步的输入,我最好的猜测是您的时间处理代码中有一些错误(例如,输入时间不是您认为的时间),或者区域

在将IST转换为GMT时,我遇到了一个奇怪的问题。除了下午5:30和6:30之外,转换可以24小时正常工作。在这段时间内,不是将时间转换为12:00:00,而是转换为00:00:00,所以我猜IST是指印度标准时间;i、 格林尼治标准时间+5:30

因此,下午5:30 IST将是格林尼治标准时间中午12:00,使用传统的24小时时钟是12:00:00。(或者他们过去称之为“铁路时间”)


如果没有您进一步的输入,我最好的猜测是您的时间处理代码中有一些错误(例如,输入时间不是您认为的时间),或者区域设置有一些奇怪的东西影响了时间的显示方式。

我在这个答案中使用24小时时钟来保持清晰

你确定你是从17:30转换过来的吗?如果你真的转换为05:30(即早上五点半),那就是格林威治标准时间的午夜。在一个24小时的时钟中,午夜是00:00,所以所有这些加起来

然而,这并不能解释06:30的转换,也就是格林威治标准时间01:30。

tl;博士 2017-01-23T12:00:00Z

信息不足 如果不看到有问题的代码,就不可能准确地回答这个问题。但我可以使用java.time类向您展示正确的现代代码

使用java.time “IST”是指印度标准时间、爱尔兰标准时间还是伊朗标准时间?根据示例数据,我在猜测

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

要通过UTC镜头查看同一时刻,请提取一个
瞬间
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

看这个

此时,印度时间比UTC提前五个半小时。因此,将加尔各答下午5:30调整为UTC意味着减去5小时30分钟,这将使我们回到UTC的中午。从结果中可以看出

zdt.toString():2017-01-23T17:30+05:30[亚洲/加尔各答]

instant.toString():2017-01-23T12:00:00Z


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

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

请向我们展示您正在使用的代码。@Pablo中午12:00PM,午夜00:00am。
ZonedDateTime.of( 2017 , 1 , 23 , 17 , 30 , 0 , 0 , ZoneId.of( "Asia/Kolkata" ) ) 
             .toInstant()
ZoneId z = ZoneId.of( "Asia/Kolkata" );

LocalDate localDate = LocalDate.of( 2017 , 1 , 23 );
LocalTime localTime = LocalTime.of( 17 , 30 ); // 5:30 PM.

ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , z );
Instant instant = zdt.toInstant();