为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2023-07-13 14:04:39
我在应用程序中保存超过 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"   }));我在 jsp 页面上全局设置 datePattern   SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance(DateFormat.SHORT, I18nUtility.getLanguageLocaleForCurrentUser());       String datePattern = dateFormat.toPattern();当这个值发送到我的 servlet 时,我会获取过去的值,例如,如果我设置日期 9/30/2040,那么它将向 servlet 发送日期值 9/30/1941。
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超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

但是......你应该停止使用这个类。

java.time

该类SimpleDateFormat是与最早版本的 Java 捆绑在一起的糟糕的日期时间类的一部分。这些类现在已成为遗留类,完全被 JSR 310 中定义的现代java.time类所取代。

LocalDate

该类LocalDate表示仅日期值,没有时间、时区或相对于 UTC 的偏移量。

➥ 此类解析具有两位数年份的输入字符串,始终使用 20xx 世纪。

String input = "1/23/40" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uu" ) ;
LocalDate localDate = LocalDate.parse( input , f ) ;

localDate.toString(): 2040-01-23

提示:我发现在商业应用程序中使用 2 位数年份非常麻烦。日期和月份的含糊性很容易造成误解和沟通不畅。我建议始终使用 4 位数年份。

当跨文化共享数据时,这个问题更加严重。


查看完整回答
反对 回复 2023-07-13
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信