我需要解析一个日期,当我解析一个无效的日期“2007年2月29日”时,它将以dd/MM/yyyy的格式返回给我,作为本地日期2007-02-28,代码如下:
LocalDate birthD = null;
try {
birthD = LocalDate.parse("29/02/2007", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
} catch (DateTimeParseException e) {
e.printStackTrace();
}
System.out.println("birthDStr: " + birthDStr);
System.out.println("parsed birthD: " + birthD);
但是,如果我使用ISO格式(没有DateTimeFormatter)进行解析,则会出现异常,代码如下:
final String birthDStr = "2007-02-29";
LocalDate birthD = null;
try {
birthD = LocalDate.parse(birthDStr);
} catch (DateTimeParseException e) {
e.printStackTrace();
}
System.out.println("birthDStr: " + birthDStr);
System.out.println("parsed birthD: " + birthD);
例外情况:
java.time.format.DateTimeParseException: Text '2007-02-29' could not be parsed: Invalid date 'February 29' as '2007' is not a leap year
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.LocalDate.parse(LocalDate.java:400)
at java.time.LocalDate.parse(LocalDate.java:385)
at com.cchaidoris.quick_test.DateTest.parseTest2(DateTest.java:65)
at com.cchaidoris.quick_test.DateTest.main(DateTest.java:41)
Caused by: java.time.DateTimeException: Invalid date 'February 29' as '2007' is not a leap year
at java.time.LocalDate.create(LocalDate.java:429)
at java.time.LocalDate.of(LocalDate.java:269)
at java.time.chrono.IsoChronology.resolveYMD(IsoChronology.java:560)
at java.time.chrono.IsoChronology.resolveYMD(IsoChronology.java:123)
at java.time.chrono.AbstractChronology.resolveDate(AbstractChronology.java:472)
at java.time.chrono.IsoChronology.resolveDate(IsoChronology.java:492)
at java.time.chrono.IsoChronology.resolveDate(IsoChronology.java:123)
at java.time.format.Parsed.resolveDateFields(Parsed.java:351)
at java.time.format.Parsed.resolveFields(Parsed.java:257)
at java.time.format.Parsed.resolve(Parsed.java:244)
at java.time.format.DateTimeParseContext.toResolved(DateTimeParseContext.java:331)
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1955)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
所以我的问题是,我想考虑一下:
LocalDate.parse("29/02/2007", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
由于无效,我如何使用LocalDate呢。作语法分析
用于测试。
@Test
void test() {
final String birthDStr = "2007-02-27";
LocalDate birthD = null;
try {
birthD = LocalDate.parse(birthDStr);
} catch (DateTimeParseException e) {
e.printStackTrace();
}
}
@Test
void test() {
final String birthDStr = "29/02/2007";
LocalDate birthD = null;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
try {
birthD = LocalDate.parse(birthDStr, formatter);
} catch (DateTimeParseException e) {
e.printStackTrace();
}
}
您的代码正确,日期不正确。无法分析文本“2007-02-29”:日期“2月29日”无效,因为“2007”不是闰年。
您需要更改解析器样式:
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("dd/MM/uuuu")
.withResolverStyle(ResolverStyle.STRICT);
LocalDate.parse("29/02/2007", formatter); // Throws
注意,使用uuuu而不是yyyy来指定年份,而不是年代。(我确信有某种方法可以让yyyy工作起来,并设想一个广告时代,但我不确定如何立即实现。)
请注意,LocalDate.parse
(没有格式化程序)记录为使用DateTimeForware。ISO_LOCAL_DATE
使用STRICT解析器-所以这里没有真正的不一致。
在我刚刚编写的一个测试解析器中,我遇到了一个奇怪的问题,我不太明白。 将其简化为显示问题的最小示例,让我们从以下语法开始: 这是语法的变化: 突然间,相同的测试输入被错误地分解成两个statement_list,每个statement_list都继续到一个带有“missing”;“警告,第一个返回“z=”的不完整的assignment_statement,第二个返回“x+”的不完整的assignm
我正在尝试读取特定格式的日期字符串。 首先,让我们以所需格式生成当前时间的字符串。 现在,让我们尝试将其转换回datetime对象。 错误与格式有关,格式完全相同。 这是怎么回事?
问题内容: 我真的很head头。我使用s已有一段时间了,但现在,使用SimpleDateFormat解析日期(只是有时)是完全错误的。 特别: 打印字符串。有没有搞错?-它甚至都不会一直解析为错误的日期! 更新: 修复得很漂亮。您不知道吗,在其他一些地方也滥用了它。一定喜欢调试别人的代码:) 问题答案: 我认为您要使用格式,而不是’hh’,以便您使用00-23之间的小时数。“ hh”采用12小时增
我编写了下面的代码来弄清楚onTextChanged()方法是如何工作的: 我注意到:当我只打字时,计数非常简单: 现在,如果我添加3个(或更多)数字,然后继续键入字母,就会发生以下情况: 对我来说,输入3位数字似乎会以某种方式改变TextWatcher的行为,使其将之后的所有内容视为Char而不是CharSequence。 对这种行为有什么解释吗?
我正在尝试解析此站点的表。我用蟒蛇靓汤来做这个。虽然它在我的Ubuntu 14.04机器上产生了正确的输出,但在我朋友的windows机器上却产生了错误的输出。我将代码片段粘贴到此处: 你知道这里会出什么问题吗?我试过使用和不使用lxml。 提前谢谢。