题
我有一个模式的简单 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位数年,但显然不是这样。谁能解释为什么这不会引发解析例外?我想...
其他提示
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课程?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11, ,后来 - 标准Java API的一部分,具有捆绑的实现。
- Java 9添加了一些次要功能和修复。
- Java SE 6 和 Java SE 7
- 大部分的 Java.Time 功能后重新输入到Java 6和7 Threeten-Backport.
- 安卓
- 以后版本的Android捆绑包实现 Java.Time 课程。
- 对于早期的Android(<26), 三分 项目适应 Threeten-Backport (上文提到的)。看 如何使用Threetenabp….
这 Threeten-Extra 项目扩展Java.Time提供其他类。该项目是可能将来在Java.Time中增加的遗嘱。您可能在这里找到一些有用的课程,例如 Interval
, YearWeek
, YearQuarter
, , 和 更多的.