将DateTime对象转换为字符串

时间:2019-02-21 14:46:46

标签: java date

我有一个简单的问题。如何将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的正确格式是什么?希望您能帮助我,谢谢。

5 个答案:

答案 0 :(得分:2)

为什么不对DateTime对象使用toString()?

答案 1 :(得分:2)

tl; dr

java.time.OffsetDateTime.parse( "2019-02-21T09:47:58.699004+00:00" )

java.time

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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

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

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

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 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);