我遇到了一个应用程序的问题我正在测试,它会从用户那里获取几个日期参数,而测试我注意到如果我输入2034年或之前的日期,一切正常但是一旦我从21/08/34开始到21/08/35这一年回归到1935年,而不是2035年。
我使用java.util.Date类存储输入的数据,有什么想法吗?是否有可能导致此类问题的Date类的任何已知限制?
谢谢
答案 0 :(得分:2)
我在Lotus Notes开发中遇到了同样的问题。我实际上认为这是理想的行为 它可能是一个时间跨度(从现在起80年),快捷方式(34..35..70)被认为是您可能想要使用的年份。
即。你说自70年代,但意思是1970年,而不是2070年。如果你从35岁开始说话,你可能意味着1935年,因为它距离今天不太远。但是,如果你从18岁开始说话,那么你可能意味着未来,因为它超出了80年的时间跨度,但在未来的近期。
它可能在某处定义,但这只是一个假设。
如果您从用户那里得到日期,请确保您获得YYYY日期,这样就不会出错。
修改强>
我的假设似乎是正确的:
public class Main{
public static void main(String[] args){
String first = "August 22, 34";
String second = "August 21, 34";
try {
Date date = new SimpleDateFormat("MMMM dd, yy",Locale.ENGLISH).parse(first);
Date date2 = new SimpleDateFormat("MMMM dd, yy",Locale.ENGLISH).parse(second);
System.out.println(date);
System.out.println(date2);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出为:
Wed Aug 22 00:00:00 BST 1934
Mon Aug 21 00:00:00 BST 2034
答案 1 :(得分:2)
当您使用SimpleDateFormat并以缩写形式输入年份(即不是完整的4位数表示)时会发生这种情况。
如果自创建SimpleDateFormat实例以来的过去80年(过去几年)中的任何一年,包含您输入的最后两位数字的年份,那么该年份将被视为已解析的值。如果过去80年不包含今年,则接下来的20年(未来年)将用于表示此值。
自1934年8月21日以来,从今天(2014年8月21日)起超过80年限制的一天,未来20年,即“2034年8月21日”被视为解析价值。
您可以参考以下链接:SimpleDateFormat
(请参阅上面链接中“年度”部分下的第三个要点。)
答案 2 :(得分:0)
问题位于将日期从String转换为Date的代码中。 我可以推测你使用SimpleDateFormat和错误的格式字符串。