尽管有“yyyy”,SimpleDateFormat 仍无法拒绝输入年份缺少世纪的输入。在格式化模式中
我有一个带有模式 yyyy-Md"
的 SimpleDateFormat,以及以下场景:
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 位数的年份,但显然情况并非如此,任何人都可以解释为什么这不抛出一个。解析异常?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好吧,我可以从文档中解释它:
可能 Joda Time 会更严格 - 一般来说,它是一个更好的 API,IMO...
如果解析后年份小于 1000,你总是可以抛出异常...
Well, I can explain it from the docs:
It's possible that Joda Time would be stricter - and it's a better API in general, IMO...
You could always throw an exception if the year is less than 1000 after parsing...
tl;dr
使用 java.time,具有该格式模式的输入会失败,正如您所期望的那样。
...抛出 java.time.format.DateTimeParseException
java.time
您使用的类现在已被 JSR 310 中定义并内置于 Java 8 中的现代 java.time 类所取代以及稍后。
LocalDate
类表示仅日期值,没有时间,也没有 时区或与 UTC 的偏移量。根据您的要求定义自定义格式模式。使用
DateTimeFormatter
类。尝试解析您的输入。
我们遇到
DateTimeParseException
,在输入年份缺少世纪时失败。正如你所期望的那样。关于 java.time
java.time< /a> 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
,日历
, &SimpleDateFormat
。要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换java.time对象。使用符合 JDBC 驱动程序 /jeps/170" rel="nofollow noreferrer">JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time 。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如
间隔
,YearWeek
,<代码>YearQuarter,以及更多 。tl;dr
Using java.time, that input with that formatting pattern fails, just as you expected.
…throws
java.time.format.DateTimeParseException
java.time
The classes you were using are now supplanted by the modern java.time classes defined in JSR 310 and built into Java 8 and later.
The
LocalDate
class represents a date-only value without time-of-day and without time zone or offset-from-UTC.Define a custom formatting pattern as you asked. Use the
DateTimeFormatter
class.Try to parse your input.
We encounter a
DateTimeParseException
, failing on the missing century of the year of the input. Just as you expected.About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for
java.sql.*
classes.Where to obtain the java.time classes?
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as
Interval
,YearWeek
,YearQuarter
, and more.