Java joda DateTimeFormatter失败,文本格式为0
预计上述信息将返回日期2018-01-01。但有例外Java joda DateTimeFormatter失败,文本格式为0,java,parsing,numbers,jodatime,literals,Java,Parsing,Numbers,Jodatime,Literals,预计上述信息将返回日期2018-01-01。但有例外 import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class DateTest { public static void main(String[] args) { DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.for
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class DateTest {
public static void main(String[] args) {
DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy0MMdd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("201800101"));
}
}
您需要为每个报价单使用一个报价单
DateTimeFormatter DF_YYYY_0MM_DD=DateTimeFormat.forPattern(“YYYY'0'MMdd”)代码>
虽然很奇怪,但在我的测试中,它仍然不起作用,因为库中似乎有一个bug-基本上,joda的DateTimeFormat
中的isNumericToken(字符串标记)
没有考虑数字文字。这最终导致joda期望年数为9位数,而不是4位数
因此,作为一种解决方法,您可以这样做来构建格式化程序(而不是直接从字符串模式创建):
或者,在日期前加上5个零(因此该年份现在有9位数字)
或者使用分隔符
DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("00000201800101"));
谢谢Vasan,我只是想确认一下。我认为在这种情况下,第一种选择是最好的解决办法<代码>DateTimeFormatter DF_YYYY_0MM_DD=新的DateTimeFormatterBuilder().appendYear(4,4).appendLiteral(“0”).appendMonthOfYear(2).appendDayOfMonth(2).toFormatter()代码>是的,它是最干净的。除非你有一个限制,比如模式来自你无法控制的其他地方,你可以这样做。
DateTimeFormatter DF_YYYY_0MM_DD = new DateTimeFormatterBuilder().appendYear(4,4).appendLiteral("0").appendMonthOfYear(2).appendDayOfMonth(2).toFormatter();
DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("00000201800101"));
DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy-0-MM-dd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("2018-0-01-01"));