Java 将gmt转换为ist不可解析日期异常

Java 将gmt转换为ist不可解析日期异常,java,android,android-studio,Java,Android,Android Studio,我想将格式为“2020-03-16T18:50:39.656Z”的GMT时间转换为与GMT格式相同的IST时间,但我遇到了不可解析的异常在createdAt值末尾的Z是一个ISO 8601时区符号。要解析它,需要在日期格式字符串中包含X,而不是Z。将日期格式字符串更改为“yyyy-MM-dd'T'HH:MM:ss.SSSX”,程序将正常运行 或者,您可以在日期格式字符串中保留Z,但将输入作为“2020-03-16T18:50:39.656+0000”——也就是说,使用四位数字表示输入中的时间偏移

我想将格式为“
2020-03-16T18:50:39.656Z
”的GMT时间转换为与GMT格式相同的IST时间,但我遇到了不可解析的异常在
createdAt
值末尾的
Z
是一个ISO 8601时区符号。要解析它,需要在日期格式字符串中包含
X
,而不是
Z
。将日期格式字符串更改为
“yyyy-MM-dd'T'HH:MM:ss.SSSX”
,程序将正常运行

或者,您可以在日期格式字符串中保留
Z
,但将输入作为
“2020-03-16T18:50:39.656+0000”
——也就是说,使用四位数字表示输入中的时间偏移,而不是
Z

tl;博士 java.time 您正在使用可怕的日期时间类,这些类在几年前被采用JSR310的现代java.time类所取代

ISO 8601 您的输入字符串采用标准ISO 8601格式。末尾的
Z
表示UTC(零小时分秒的偏移量),发音为“Zulu”

默认情况下,java.time类使用ISO8601格式。因此,无需指定格式化模式

Instant
将输入解析为一个
瞬间
,表示UTC中的一个时刻

Instant
.parse(
    "2020-03-16T18:50:39.656Z"
)
.atZone(
    ZoneId.of( "Asia/Kolkata" )
)
ZoneDateTime
适应印度时间

String input = "2020-03-16T18:50:39.656Z" ;
Instant instant = Instant.parse( input ) ;

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

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

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

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(请添加您试图转换的createdAt,
      Z
      是一个常量:
      yyy-MM-dd'HH:MM:ss.SSS'Z'
      否,
      Z
      表示时区。不要在其周围放置
      '
      。如果最低Android级别为5,该使用什么。0@ashishvyas请参阅“关于java.time”第一节添加到答案的底部。
      String input = "2020-03-16T18:50:39.656Z" ;
      Instant instant = Instant.parse( input ) ;
      
      ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
      ZonedDateTime zdt = instant.atZone( z ) ;