我有一个简单的问题。如何将ISO-8601日期转换为字符串?
我正在使用以下格式的日期:2019-02-05T08:21:15.000+01:00
,并且想要将此日期对象转换为字符串。我尝试了以下方法:
String startString = (String) jsonObjectMap2.get("created_on");
//startString = "2019-02-21T09:47:58.699004+00:00"`
DateTime start = ISODateTimeFormat.dateTimeParser().parseDateTime(startString);
DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.SSSZ+|-hh:mm");
String formatedStartString = dateFormat.format(start);`
但是Iam遇到以下错误:
java.lang.IllegalArgumentException:无法将给定对象格式化为日期。
DateFormat的正确格式是什么?希望您能帮助我,谢谢。
答案 0 :(得分:2)
为什么不对DateTime对象使用toString()?
答案 1 :(得分:2)
java.time.OffsetDateTime.parse( "2019-02-21T09:47:58.699004+00:00" )
DateTime
是什么课程?如果您使用的是Joda-Time,请知道Joda-Time项目现在处于维护模式。它的创建者Stephen Colbourne继续领导JSR 310并实现了Java中内置的 java.time 类。
您的输入字符串为标准ISO 8601格式。解析/生成字符串时, java.time 类默认使用ISO 8601格式。
String input = "2019-02-21T09:47:58.699004+00:00" ; // Standard ISO 8601 format.
OffsetDateTime
您的输入字符串表示offset-from-UTC,而不是时区。因此,代表此值的合适的类是OffsetDateTime
。
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:1)
正如Thomas在评论中提到的,DateTime.format()
使用Date
对象,而不是DateTime
对象;因此IllegalArgumentException
。从日期格式来看,您可以尝试使用内置的startString
类来解析java.time.ZonedDateTime
:
ZonedDateTime dateTime = ZonedDateTime.parse(startString) //it can parse ISO-8601 date-times
然后,您可以使用dateTime
的静态java.time.DateTimeFormatter
方法格式化ofPattern()
对象,该方法采用String
模式应用于您的日期时间并返回格式化的日期作为字符串:
String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZ+|-hh:mm"));
编辑
正如Basil所指出的,OP的DateTime
对象包含一个时间偏移量,它不一定是时区偏移量,正如ZonedDateTime
类所表示的那样。因此,在这种情况下最适合使用的类是OffsetDateTime
,它提供相同的功能,但更适合给定的用例。参见Basil Bourque's answer
答案 3 :(得分:0)
我不确定这是否可以解决您的问题, 但是mm应该是大写,即MM, 因为MM表示月份,而mm表示分钟。
请参见以下代码:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ+|-
hh:mm");
答案 4 :(得分:0)
我发现以下对我有用的
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS[XXX]");
String formatted = zonedDateTime.format(dateTimeFormatter);