不能在日期字段中使用超过“2038”的年份:Java

Can't use year more than "2038" in date field : Java

我在我的应用程序中保存超过 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 but it is not in my case, because i am able to set date in 2038, but wont be able to set more then 2038, I also check with this 但没有帮助。

注意寻找jdk7兼容解决方案

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 class 设置了在解析具有两位数世纪的输入字符串时假定的世纪:SimpleDateFormat::set2DigitYearStart.

但是……你应该停止使用这个 class。

java.time

SimpleDateFormat class 是与 Java 的最早版本捆绑在一起的可怕日期时间 classes 的一部分。这些 classes 现在是遗留的,完全被 JSR 310 中定义的现代 java.time classes 所取代。

LocalDate

LocalDate class represents a date-only value without time-of-day and without time zone or offset-from-UTC.

➥ 此 class 始终使用 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

提示:我发现在商业应用程序中使用 2 位数的年份非常麻烦。 day-of-month 和 month 的歧义很容易造成误解和误解。我建议始终使用 4 位数年份。

跨文化共享数据时,这个问题更严重。然后我建议对文本日期时间值使用 ISO 8601 格式。


关于java.time

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.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

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.