我的日期字符串类似于:
“2014-04-10T00: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
答案 0 :(得分:3)
我相信日期模式的正确语法是"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
。这样就可以使用Z
。
答案 1 :(得分:3)
虽然其他答案都是正确的,但答案和问题都很难解决。
相关字符串的格式“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 );
如果该字符串代表Québec而不是UTC的壁挂时刻,则指定解析时应该理解字符串的时区。
DateTime dateTime = new DateTime( "2014-04-10T00:00:00.000", timeZoneMontréal );
根据Meno Hochschild的注释,您可能更愿意指定传入String的预期格式。 Joda-Time内置了许多预定义的formatters,并允许您定义自己的内容。在这种情况下,我们的字符串在结尾处缺少时区偏移,因此我们指定称为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
†Wall-Time =某些地方某些墙上某些时钟上常见的时间。
答案 2 :(得分:1)
关于使用模式" yyyy-MM-dd' HH:mm:ss.SSSZ"并且遇到Z-input的解析问题,显然是版本问题,请看这里:
开Joda-Time-release-notes for change 1.6 to 2.0 =>
"允许' Z'和' ZZ'在格式模式中解析' Z'作为' +00:00' [2827359]"
因此解决方案是使用最新版本的Joda-Time。请注意,使用模式符号Z比仅使用文字符号Z更强大。在模式表达式中,因为任何与ISO-8601兼容的字符串可能不仅包含" Z"在最后,但也抵消像" + 0200"。如果偏移量可能包含冒号(示例" +05:30"),那么您应该在模式中使用双ZZ。
评论您的编辑以删除模式符号Z:
在这种情况下,我没有看到版本2.1的任何异常。 Joda-Time将把输入解释为系统时区中的本地时间,并添加适当的时区偏移量。无论如何,你必须使你的模式适应预期的输入,而不是其他方面。