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

时间:2019-09-05 08:48:56

标签: java date datetime java-7

我在应用程序中保存日期超过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兼容的解决方案

1 个答案:

答案 0 :(得分:2)

tl; dr

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

LocalDate类表示没有日期,没有time zoneoffset-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.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore