我使用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。
答案 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)
ZonedDateTime.parse(
"Mon, 30 Sep 2002 01:56:02 GMT" ,
DateTimeFormatter.RFC_1123_DATE_TIME
)
2002-09-30T01:56:02Z
您的字符串格式(例如Mon, 30 Sep 2002 01:56:02 GMT
)在过时的标准RFC 1123& RFC 822。
顺便说一句,这是一种糟糕的格式。将日期时间值序列化为文本时,请改用ISO 8601标准格式。您现在可以找到采用ISO 8601格式的更新标准和协议。
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 );
zdt.toString():2002-09-30T01:56:02Z
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。