java - 在日期字段 : Java 中不能使用超过 "2038"的年份

标签 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 时,我会获取过去的值,例如如果我设置日期 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 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.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 future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和 more .

关于java - 在日期字段 : Java 中不能使用超过 "2038"的年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801728/

相关文章:

java - 如何将 URL 中的图像保存到内部或外部存储中?

java - 使用 JAXRS 返回子 ID

java - 文件系统与数据库下的附件?

r - 使用 lubridate 进行矢量化时区转换

python - 从 pandas DataFrame 中的多个字符串列中删除子字符串

java - 执行简单的算术运算并将结果显示在同一个jsp页面上

javascript - 存储日期并从本地存储中检索

c# - 如何在C#中计算每月的第二个星期五

ruby-on-rails - Rails - 将 DateTime 与 DateTime.now 进行比较

python - 如何在 Python 中读取 Excel 格式的日期?