无法解析的日期:java中的“2014-02-24T00:54:12.417-06:00”

时间:2014-02-25 11:33:13

标签: java java-ee

我想将日期:2014-02-24T00:54:12.417-06:00转换为IST格式。

直到我做到了:

    String s = "2014-02-24T00:54:12.417-06:00";
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZ");
    Date d = formatter.parse(s);


    TimeZone tx=TimeZone.getTimeZone("Asia/Calcutta");
    formatter.setTimeZone(tx);
    System.out.println("Formatted date in IST = " + formatter.format(d));
    String istDateFormat = formatter.format(d);
    //Date da=formatter.format(d);
    return istDateFormat;  

但我收到错误:

Unparseable date: "2014-02-24T00:54:12.417-06:00"  

4 个答案:

答案 0 :(得分:3)

DateFormat formatter = new SimpleDateFormat(""yyyy-MM-dd'T'HH:mm:ss.SSSXXX"");

这是简单的工作,请查看Java Doc中的示例。您的TimeZone之间有:

您的模式适合2001-07-04T12:08:56.235-0700格式。

答案 1 :(得分:2)

java.util.Date& .Calendar&与Java捆绑在一起的SimpleDateFormat类非常麻烦。避免它们。

备选方案Joda-TimeJava 8的新java.time package可以用更少的代码解决您的问题。无需担心格式化程序和解析,因为它们都直接采用ISO 8601格式化字符串。

注意一个很大的区别:虽然java.util.Date对象没有时区(实际上是UTC / GMT),但在Joda-Time(DateTime)和java.time(ZonedDateTime)中,日期时间对象知道它自己的已分配时区和偏移。

约达时间

String input = "2014-02-24T00:54:12.417-06:00";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" ); 
DateTime dateTimeIndia = new DateTime( input, timeZone );  // Parse as a -06:00 value, then adjust 11.5 hours to India +05:30 time zone.
DateTime dateTimeUtc = dateTimeIndia.withZone( DateTimeZone.UTC ); // For comparison.

转储到控制台...

System.out.println( "input: " + input );
System.out.println( "dateTimeUtc: " + dateTimeUtc );  
System.out.println( "dateTimeIndia: " + dateTimeIndia );   

跑步时......

input: 2014-02-24T00:54:12.417-06:00
dateTimeUtc: 2014-02-24T06:54:12.417Z
dateTimeIndia: 2014-02-24T12:24:12.417+05:30

java.time(Java 8)

String input = "2014-02-24T00:54:12.417-06:00";
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTimeIndia = ZonedDateTime.parse( input ).withZoneSameInstant( zoneId );  // Parse as a -06:00 value, then adjust 11.5 hours to India +05:30 time zone.
ZonedDateTime zonedDateTimeUtc = zonedDateTimeIndia.withZoneSameInstant( ZoneOffset.UTC ); // For comparison.

转储到控制台...

System.out.println( "input: " + input );
System.out.println( "zonedDateTimeUtc: " + zonedDateTimeUtc );
System.out.println( "zonedDateTimeIndia: " + zonedDateTimeIndia );

跑步时......

input: 2014-02-24T00:54:12.417-06:00
zonedDateTimeUtc: 2014-02-24T06:54:12.417Z
zonedDateTimeIndia: 2014-02-24T12:24:12.417+05:30[Asia/Kolkata]

答案 2 :(得分:1)

使用以下格式:“yyyy-MM-dd'T'HH:mm:ss.SSSX”

答案 3 :(得分:0)

您使用RFC time zone notation作为日期格式。

但您的日期字符串为ISO formatted

所以它无法解析你的约会。

执行以下任一操作

  • 将格式化程序更改为ISO格式(即将ZZZ更改为XXX
  • 或者更改日期字符串,如2014-02-24T00:54:12.417 -0600