到目前为止的字符串(格式无效)

时间:2010-06-10 07:30:35

标签: java date calendar jodatime

我使用Joda-Time库将我的String日期转换为实际日期,因为这似乎是最简单的解决方案。我正在使用DateTime对象来执行此操作;

 new DateTime(strValue);

但是当插入某些格式时,它会抛出异常;

java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:56:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:59:01 GMT"
java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:52:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:05:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:09:28 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 15:01:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 23:48:33 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:24:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 11:13:10 GMT"

有没有办法解决这个问题,或者我应该使用其他东西代替DateTime。

3 个答案:

答案 0 :(得分:5)

该构造函数不是某种通用的日期时间字符串解释引擎。它期望将常规ISO日期的变体定义为YYYY-MM-DDTHH:MM:SS.SSSZ

您需要定义一个格式字符串,该字符串描述您可以从中解析的格式。它会像EEE, dd MMM YYYY HH:mm:ss zzz javadoc here!

答案 1 :(得分:1)

如果我没记错的话,你在这里使用的默认解析器需要ISO 8601 - 格式化时间,这不是。否则,您需要自己制作DateTimeFormatter

答案 2 :(得分:0)

TL;博士

ZonedDateTime.parse(
    "Mon, 30 Sep 2002 01:56:02 GMT" ,
    DateTimeFormatter.RFC_1123_DATE_TIME
)
  

2002-09-30T01:56:02Z

RFC 1123

您的字符串格式(例如Mon, 30 Sep 2002 01:56:02 GMT)在过时的标准RFC 1123& RFC 822

顺便说一句,这是一种糟糕的格式。将日期时间值序列化为文本时,请改用ISO 8601标准格式。您现在可以找到采用ISO 8601格式的更新标准和协议。

java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。请参阅Tutorial by Oracle

java.time类DateTimeFormatter具有这种古老格式的内置格式化程序:DateTimeFormatter.RFC_1123_DATE_TIME

String input = "Mon, 30 Sep 2002 01:56:02 GMT";
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME;

使用该格式化程序实例化ZonedDateTime对象。

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

转储到控制台。

String output = zdt.toString() ;  // Generate a string in standard ISO 8601 format.
System.out.println( "zdt.toString(): " + output );

code run live at IdeOne.com

  

zdt.toString():2002-09-30T01:56:02Z

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore