我有一个简单的问题。如何将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);`
但是我得到了以下错误:
java.lang.IllegalArgumentException:无法将给定对象格式化为日期。
DateFormat的正确形式是什么?希望您能帮助我,提前谢谢您。
发布于 2019-02-22 03:58:37
tl;dr
java.time.OffsetDateTime.parse( "2019-02-21T09:47:58.699004+00:00" )
java.time
DateTime
是什么类?如果您正在使用Joda-Time,请知道Joda-Time项目现在处于维护模式。它的创建者Stephen Colbourne继续领导JSR310并实现了内置到Java语言中的java.time类。
不需要格式化模式
您的输入字符串为标准ISO 8601格式。在解析/生成字符串时,java.time类默认使用ISO8601格式。
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
框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
现在在maintenance mode中的项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*
类。
从哪里获取java.time类?
中的
项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
和more。
发布于 2019-02-21 23:03:52
为什么不在DateTime对象上使用toString()呢?
发布于 2019-02-21 23:04:36
正如Thomas在评论中提到的,DateTime.format()
使用Date
对象,而不是DateTime
对象;因此使用IllegalArgumentException
。从日期的格式判断,您可以尝试使用内置的java.time.ZonedDateTime
类解析startString
:
ZonedDateTime dateTime = ZonedDateTime.parse(startString) //it can parse ISO-8601 date-times
然后,可以使用java.time.DateTimeFormatter
的静态ofPattern()
方法格式化dateTime
对象,该方法采用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
https://stackoverflow.com/questions/54809767
复制相似问题