Java 如何制作日期格式?

Java 如何制作日期格式?,java,datetime,Java,Datetime,我正在尝试将“dd-MM-yy”格式的字符串解析为日期对象。问题是它试图猜测日期的世纪 当从01到31指定时,年份被解释为2000年代(21世纪),32 t0 99被认为是1900年代(20世纪) 有人能帮我吗?我怎样才能明确说明我只在21世纪工作。我并不是在寻找一些技巧,比如操纵字符串或根据条件改变日期。来自: 对于使用缩写年模式(“y”或“yy”)进行解析,SimpleDataFormat必须解释相对于某个世纪的缩写年。它通过将日期调整为创建SimpleDataFormat实例前80年和创建

我正在尝试将“dd-MM-yy”格式的
字符串
解析为
日期
对象。问题是它试图猜测日期的世纪

当从01到31指定时,年份被解释为2000年代(21世纪),32 t0 99被认为是1900年代(20世纪)

有人能帮我吗?我怎样才能明确说明我只在21世纪工作。我并不是在寻找一些技巧,比如操纵字符串或根据条件改变日期。

来自:

对于使用缩写年模式(“y”或“yy”)进行解析,SimpleDataFormat必须解释相对于某个世纪的缩写年。它通过将日期调整为创建SimpleDataFormat实例前80年和创建SimpleDataFormat实例后20年。例如,使用“MM/dd/yy”模式和1997年1月1日创建的SimpleDataFormat实例,字符串“01/11/12”将解释为2012年1月11日,而字符串“05/04/64”将解释为1964年5月4日。在解析过程中,只有由Character.isDigit(char)定义的两位数字组成的字符串才会被解析为默认值。任何其他数字字符串,如一位字符串、三位或更多位字符串或并非全部数字的两位字符串(例如“-1”),都会按字面解释。因此,“01/02/3”或“01/02/003”被解析,使用与公元前3年1月2日相同的模式。同样,“01/02/-3”被解析为公元前4年1月2日

它似乎没有提到任何调整
[-80;+20]
范围的方法。我想你最好的办法是将两位数的年份扩展为四位数:

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");

您可以使用该方法更改用于解释2位数据输入的世纪


将于2040年3月17日出版。

愿API祝福我们理解这些神圣的话语。阿门,我明白这一点,但它并没有真正回答我的问题。我们是否可以用一种简洁的方式告诉JVM我们是否在特定的环境中工作century@Edge当前位置请参见我答案底部的段落。我不认为使用SimpleDateFormat。你完全可以使用你要编写的EdgeDateFormat类来解决这个问题…@Edge:它回答了你问题的标题。它做什么的问题与改变它做什么的问题大不相同。我相信如果你想指定所有的日期都在21世纪,你实际上最好做一个愚蠢的字符串操作
s/([0-9]{2}-[0-9]{2})-(0-9]{2})/$1-20$2/
。我很好奇为什么输入是短年格式。你能得到长年份格式的输入吗?另一个选项是在解析日期之前,使用正则表达式在年份字段中添加“20”。(.replaceFirst(“-(?!-)”,“-20”)我只通过字符串操作实现了它。我只是认为可能有api方法来实现它+1-很好的发现。希望向上投票的火车回来:)我实际上是在找这个。虽然看起来很混乱(可能我只是要坚持字符串操作)但它回答了我原本不知道的关于get2DigitYearStart()的问题。Thanxi如果你只计算2000年一次,并将其保存在工厂中,你就可以消除日历操作的成本并隐藏混乱。两种方法都有效!
datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
String aDate = "03/17/40";
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, 2000);
dateFormat.set2DigitYearStart(cal.getTime());
System.out.println(dateFormat.get2DigitYearStart());
System.out.println(dateFormat.parse(aDate));