【问题标题】:java.text.ParseException: Unparseable date exception at date UTC conversionjava.text.ParseException:日期 UTC 转换时无法解析的日期异常
【发布时间】:2016-01-13 13:33:41
【问题描述】:

我正在尝试将我的日期转换为 UTC 格式,因为我必须使用 SimpleDateFormat 类对其进行解析。但它给了我不可解析的日期异常。我的代码如下:

//My date coming from server:  Wed Dec 23 13:00:00 GMT+04:00 2015

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MM EE- HH:mm:ss yy");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(s1.datefrom + "");

【问题讨论】:

标签: datetime simpledateformat utc unparseable


【解决方案1】:

我相信这应该可行:SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy",Locale.US);

【讨论】:

【解决方案2】:

tl;博士

显然您想解析一个字符串,该字符串表示挂钟时间比 UTC 早四小时的时刻,然后调整为 UTC 挂钟时间。

OffsetDateTime.parse( 
    "Wed Dec 23 13:00:00 GMT+04:00 2015" ,
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US )
)
.toInstant()           // Adjust from four hours ahead of UTC to UTC itself by extracting a `Instant`. 
.toString()

2015-12-23T09:00:00Z

java.time

现代方法使用 java.time 类而不是可怕的旧 java.time 类。

String input = "Wed Dec 23 13:00:00 GMT+04:00 2015" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US ) ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;

odt.toString(): 2015-12-23T13:00+04:00

如果要将其调整为 UTC,最简单的方法是提取 Instant。根据定义,Instant 类始终采用 UTC。

Instant instant = odt.toInstant() ;

或者,要保留OffsetDateTime 的灵活性,请致电withOffsetSameInstant。传递常量ZoneOffset.UTC

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;

如果您必须使用糟糕的遗留类java.util.Date,请从Instant 转换。

java.util.Date d = java.util.Date.from( instant ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多