我在应用程序中保存超过 2038 年的日期时遇到问题,在 jsp 页面上我从日历中获取输入,例如 -
registry.byId('endDateCal').set('value', dojo.date.locale.parse('<c:out value="${empty taskForm.endDate ? taskForm.defaultDate : taskForm.endDate}"/>', { datePattern: '<%=datePattern%>', selector: "date" }));
datePattern 我在我的 jsp 页面上全局设置,如
SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance(DateFormat.SHORT, I18nUtility.getLanguageLocaleForCurrentUser());
String datePattern = dateFormat.toPattern();
当这个值发送到我的 servlet 时,我会获取过去的值,例如如果我设置日期 2040 年 9 月 30 日,那么它会将日期值发送到 servlet 9/30/1941。
我看到了2038问题Year 2038 problem但我的情况并非如此,因为我可以将日期设置为 2038 年,但无法设置超过 2038 年,我还检查 this但没有帮助。
注意寻找jdk 7兼容解决方案
最佳答案
tl;博士
LocalDate // Modern class for representing a date-only value without time-of-day and without time zone.
.parse(
"1/23/40" ,
DateTimeFormatter.ofPattern( "M/d/uu" ) // Defaults to century 20xx.
) // Returns a `LocalDate` object.
.toString() // Generate text in standard ISO 8601 format.
2040-01-23
指定默认世纪
SimpleDateFormat
类有一个设置,用于在解析具有两位数世纪的输入字符串时假定哪个世纪: SimpleDateFormat::set2DigitYearStart
.
但是……你应该停止使用这个类。
java.time
那个 SimpleDateFormat
类是与最早版本的 Java 捆绑在一起的糟糕的日期时间类的一部分。这些类现在已成为遗留类,完全被 JSR 310 中定义的现代 java.time 类所取代。
本地日期
LocalDate
类表示仅日期值,没有日期时间,也没有 time zone或offset-from-UTC .
➥ 此类解析具有两位数年份的输入字符串,始终使用 20xx 世纪。
String input = "1/23/40" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uu" ) ;
LocalDate localDate = LocalDate.parse( input , f ) ;
查看此code run live at IdeOne.com .
localDate.toString(): 2040-01-23
提示:我发现在商业应用程序中使用两位数年份非常麻烦。日期和月份的含糊性很容易造成误解和沟通不畅。我建议始终使用 4 位数年份。
当跨文化共享数据时,这个问题更加严重。那么我建议使用ISO 8601文本日期时间值的格式。
<小时/>关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .
Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用JDBC driver符合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 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- Android 的更高版本捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。请参阅How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和 more .
关于java - 在日期字段 : Java 中不能使用超过 "2038"的年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801728/