是否可以创建一个将两位数年份转换为四位数年份的DateFormatter?

Dan*_*ski 7 java calendar

在我的Java应用程序中,我使用DateFormat实例来解析日期输入.

DateFormat fmt;
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT)  // dd.MM.yyyy for de_DE
Run Code Online (Sandbox Code Playgroud)

问题是用户坚持在表单中输入日期31.12.11.

不幸的是,这被解析为31.12.11.(0011-12-31以ISO格式)相反,我想要解析日期31.12.2011(2011-12-31以ISO格式).

我可以修改日期格式以某种方式解析输入吗?

jos*_*row 11

您必须使用dd.MM.yy格式进行解析,并使用yyyy-MM-dd格式重新格式化

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);
Run Code Online (Sandbox Code Playgroud)

有关设置模式的更多信息,请参阅Java API.

http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

  • `对于使用缩写年份模式("y"或"yy")进行解析,SimpleDateFormat必须解释相对于某个世纪的缩写年份.它通过将日期调整为创建SimpleDateFormat实例之前的80年和20年之后来实现这一点. - 这太棒了.谢谢你的提示. (3认同)

Mik*_*key 5

您的解决方案非常简单,允许使用包含该方法的SimpleDateFormat set2DigitYearStart(Date startDate).也许它看起来像这样.

String userInput = "31.12.11";
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy");
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime());
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31
Run Code Online (Sandbox Code Playgroud)