我有一个模式的简单 yyyy-M-d", ,以及以下情况:

String str = "02-03-04";        
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d");
f.setLenient(false);
System.out.println(f.parse(str));

输出是 Sat Mar 04 00:00:00 EST 2

我的目标是仅在2004-02-03之类的格式下捕获日期,而忽略02-03-04。我认为模式中的Yyyy需要4位数年,但显然不是这样。谁能解释为什么这不会引发解析例外?我想...

有帮助吗?

解决方案

好吧,我可以从 文档:

对于解析,如果图案字母的数量超过2个,则本年度的解释是从字面上解释的,无论数字数量如何。因此,使用模式“ mm/dd/yyyy”,“ 01/11/12”解析至1月11日,第12 AD

可能 乔达时间 会更严格 - 总体上是更好的API,IMO ...

如果解析后的一年少于1000年,您总是会抛出例外...

其他提示

tl; dr

使用 Java.Time, ,正如您预期的那样,使用该格式模式的输入失败。

LocalDate
.parse(
    "02-03-04" ,
    DateTimeFormatter.ofPattern ( "uuuu-M-d" )
)

…扔 java.time.format.DateTimeParseException

Java.Time

您正在使用的课程现在已被现代所取代 Java.Time JSR 310中定义的类,内置在Java 8和更高版本中。

LocalDate 班级代表只有日期的价值,没有日期和没有时间的时间 时区 或者 从UTC偏移.

按照您的要求定义自定义格式模式。使用 DateTimeFormatter 班级。

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu-M-d" );

尝试解析您的输入。

String input = "02-03-04";
LocalDate localDate = LocalDate.parse ( input , f );

我们遇到一个 DateTimeParseException, ,在输入年份失踪的世纪失败。正如您所期望的那样。

线程“ main” java.time.format.datetimeparseexception:text '02 -03-04'的异常无法在索引0上解析


关于 Java.Time

Java.Time 框架内置在Java 8及以后的框架中。这些班级取代了麻烦的旧 遗产 日期时间课,例如 java.util.Date, Calendar, & SimpleDateFormat.

要了解更多,请参阅 Oracle教程. 。并搜索堆栈溢出以获取许多示例和解释。规格是 JSR 310.

乔达时间 项目,现在 维护模式, ,建议迁移到 Java.Time 课程。

您可以交换 Java.Time 直接使用数据库对象。用一个 JDBC驱动程序 符合 JDBC 4.2 或以后。不需要琴弦,不需要 java.sql.* 课程。

从哪里获得Java.Time课程?

Threeten-Extra 项目扩展Java.Time提供其他类。该项目是可能将来在Java.Time中增加的遗嘱。您可能在这里找到一些有用的课程,例如 Interval, YearWeek, YearQuarter, , 和 更多的.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top