我在应用程序中保存日期超过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时,例如,我在过去获取值。如果我将日期设置为9/30/2040,则它将日期值发送到servlet 9/30/1941。
我看到了2038问题Year 2038 problem,但在我看来并不是这样,因为我可以在2038年设置日期,但不能再设置2038年的日期,因此我也检查了this但没有帮助。
注意,寻找与jdk 7兼容的解决方案
答案 0 :(得分:2)
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
。
但是……您应该停止使用此类。
该SimpleDateFormat
类是与最早的Java版本捆绑在一起的可怕的日期时间类的一部分。这些类现在已成为旧版,完全由JSR 310中定义的现代 java.time 类取代。
LocalDate
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 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类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。