将日期字符串转换为Joda Time中的日期时间对象



我有一个类似于的日期字符串

"2014-04-10T000:00:00.000">

所以我需要将其转换为Joda Time DateTime对象。

这是我的代码:

String datePattern = "yyyy-MM-dd'T'HH:mm:ss.SSS";
DateTimeFormatter dateFormatter = DateTimeFormat.forPattern(datePattern);
currentCard.setStartDate("2014-04-10T00:00:00.000");
currentCard.setEndDate("2015-04-10T00:00:00.000");
DateTime startDateTime = dateFormatter.parseDateTime(currentCard.getStartDate());
DateTime endDateTime = dateFormatter.parseDateTime(currentCard.getEndDate());
if (startDateTime.isBeforeNow() && endDateTime.isAfterNow()) {
    currentCard.setActive(true);
} else {
    currentCard.setActive(false);
}

它告诉我string is too short

我相信日期模式的正确语法是"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"。这样Z就可以直接使用了。

虽然其他答案都是正确的,但答案和问题都太难了。

ISO 8601格式

所讨论字符串的格式"2014-04-10T00:00:00.000"是标准ISO 8601格式。Joda Time中的DateTime类有一个内置的ISO 8601解析器/格式化程序,默认情况下使用。因此不需要实例化格式化程序。只需将字符串传递给DateTime的构造函数。

时区

指定用于解释该日期时间值的时区。否则将应用JVM的当前默认时区。

示例:

DateTimeZone timeZoneMontréal = DateTimeZone.forID( "America/Montreal" );

示例代码

一些使用Joda Time 2.5的示例代码。

DateTime dateTime = new DateTime( "2014-04-10T00:00:00.000", DateTimeZone.UTC );

如果该字符串表示魁北克省的壁时间†时刻,而不是UTC,则指定解析时应理解该字符串的时区。

DateTime dateTime = new DateTime( "2014-04-10T00:00:00.000", timeZoneMontréal );

指定格式

根据Meno Hochschild的评论,您可能更喜欢指定传入字符串的预期格式。Joda Time内置了许多预定义的格式化程序,并允许您定义自己的格式化程序。在这种情况下,我们的字符串末尾缺少时区偏移量,因此我们指定了名为dateHourMinuteSecondFraction的格式化程序。

如果传入字符串格式不正确或使用了意外格式,该怎么办?引发异常。对于健壮的代码,捕获该异常。

String input = "2014-04-10T00:00:00.000";
DateTimeZone timeZoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTimeFormatter formatter = ISODateTimeFormat.dateHourMinuteSecondFraction().withZone( timeZoneMontréal );
DateTime dateTime = null;
try {
    dateTime = formatter.parseDateTime( input );
} catch ( IllegalArgumentException e ) {
    System.out.println( "Unexpected format of incoming date-time string: " + input + ". Exception: " + e ); // Handle exception for bad input.
}

调整为UTC进行比较。

DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );

转储到控制台。

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

运行时。

dateTime: 2014-04-10T00:00:00.000-04:00
dateTimeUtc: 2014-04-10T04:00:00.000Z

†墙时间=通常在某个地方某个墙上的某个时钟上看到的时间。

关于您使用模式"yyyy-MM-dd-'TH:MM:ss.SSZ"进行的第一次编辑,并且遇到Z输入的解析问题,这显然是版本问题,请参阅此处:

Joda Time发布说明,将1.6更改为2.0=>

"允许格式模式中的'Z'和'ZZ'将'Z'解析为'+000:00'[22827359]">

因此,解决方案是使用最新版本的Joda Time。请注意,模式符号Z的使用比在模式表达式中仅使用文字"Z"更强大,因为任何ISO-8601兼容的字符串不仅可能在末尾包含"Z",还可能包含"+0200"等偏移量。如果偏移量可能包含冒号(例如"+05:30"(,那么您应该在模式中使用双ZZ。

关于删除图案符号Z:的编辑的评论

在这种情况下,我认为2.1版没有任何异常。Joda Time只会将输入解释为系统时区中的本地时间,并添加适当的时区偏移。无论如何,您必须使您的模式适应预期的输入,而不是其他方面。

相关内容

  • 没有找到相关文章

最新更新