【发布时间】:2019-09-05 08:48:56
【问题描述】:
在我的应用程序中保存日期超过 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兼容解决方案
【问题讨论】:
-
你确定它在 Java 方面被破坏了(而不是在 Javascript 代码中)?
-
..您是否声称可以安全地设置日期
after 03:14:07 UTC on 19 January 2038? -
在发送到 servlet 之前客户端是否正确接收?
-
80/20 规则。 为了使用缩写年份模式(“y”或“yy”)进行解析,SimpleDateFormat 必须解释相对于某个世纪的缩写年份。它通过将日期调整为创建 SimpleDateFormat 实例之前的 80 年和之后的 20 年来实现这一点。例如,使用“MM/dd/yy”模式和 1997 年 1 月 1 日创建的 SimpleDateFormat 实例,字符串“01/11/12”将被解释为 2012 年 1 月 11 日,而字符串“05/04/ 64" 将被解释为 1964 年 5 月 4 日。 from the docs.
-
在 SimpleDateFormat 中,您可以设置开始日期以确定如何解释 2 位数年份。见docs.oracle.com/javase/7/docs/api/java/text/…