Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MM/dd/yy简单日期DateTimeFormatter在大于2037年的时间内不起作用_Java_Date_Jodatime - Fatal编程技术网

Java MM/dd/yy简单日期DateTimeFormatter在大于2037年的时间内不起作用

Java MM/dd/yy简单日期DateTimeFormatter在大于2037年的时间内不起作用,java,date,jodatime,Java,Date,Jodatime,实际上,我发现MM/dd/yy日期格式有问题: 如果输入的年份大于37,则年份格式反映为1937 i、 e,如果我以02/05/37的形式输入输入,那么当我将此日期打印到控制台时,日期将变为02/05/1937 如果他输入的值小于02/05/37,则工作正常 Date startDate = new SimpleDateFormat("dd/MM/yy").parse("01/01/47"); System.out.println(startDate); 假设您使用的是SimpleDateFo

实际上,我发现
MM/dd/yy
日期格式有问题: 如果输入的年份大于
37
,则年份格式反映为
1937

i、 e,如果我以
02/05/37
的形式输入输入,那么当我将此日期打印到控制台时,日期将变为
02/05/1937

如果他输入的值小于
02/05/37
,则工作正常

Date startDate = new SimpleDateFormat("dd/MM/yy").parse("01/01/47");
System.out.println(startDate);

假设您使用的是
SimpleDateFormat
:02/05/37解析为02/05/1937是符合规范的。至少在接下来的一年左右


Java必须决定您的日期应该在哪个世纪。它通过将日期调整为创建SimpleDataFormat实例前80年和创建SimpleDataFormat实例后20年。2037年距离当前日期(2016年)不到80年,因此它使用的是过去的时间。

如果您不提供世纪信息,那么它必须做出一个假设,并且它相当合理地假设您希望大部分日期在过去,未来日期也有一定的范围,但不会太远,因为您更可能希望提前日期,比如出生日期等等,人们通常活到80岁左右。根据这一假设,对于任何给定的当前日期,过去的日期将远远多于未来的日期

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

否则,将应用特定于日历系统的表单。两者皆有 格式化和解析,如果模式字母数为4或更多, 使用特定于日历的长格式。否则,特定于日历的 使用缩写形式


因此,如果你想做些什么,那么你需要检查格式化日期是否早于今天(或你选择的其他截止日期),如果你只希望有未来的日期或超过与默认日期不同的截止日期,只需在给定日期的基础上加100年。

其他答案是正确的。您需要了解
SimpleDateFormat
行为,以假设您的预期目标

您正在使用过时的旧类。新推荐的类在此问题上有不同的行为

java.time java 8和更高版本中内置的java.time框架取代了旧的java.util.Date和SimpleDataFormat类

关于世纪的行为是不同的。在课堂上,两位数的世纪被解释为21世纪,导致2000年至2099年(含)的一年

java.time类包括
LocalDate
,用于表示只包含日期的值,而不包含一天中的时间和时区

String input = "02/01/47";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yy" );
LocalDate localDate = LocalDate.parse( input , formatter );
2047-01-02


顺便提一下,一个提示:尽可能避免两位数年份。由此产生的混乱和麻烦不值得节省两个字节和一点墨粉。

请向我们展示您的代码您在这里试图实现什么?格式02/0/37并不明确。我想这是一个关于你使用哪个世纪的定义的问题。你使用的是标题中所说的
DateTimeFormatter
,还是
SimpleDateFormat
?我使用的是DateTimeFormatter joda time如果“01/01/47”,那么我会得到Wed Jan 01 00:00:00 IST2047@BhushanUniyal
if(date.getTime()<0){date.setYear(date.getYear()+100));}
我请求在最后一点上有所不同,哪怕只是一点点。如果有一百万人每天要使用您的GUI数百次,并且您知道日期总是在未来50年内,那么只要您知道如何按照要求处理输入,用户输入两位数而不是四位数,您就可以节省$$。当然,你应该为你的客户和用户做最好的事情。就我自己而言,我曾与许多簿记员和会计师共事,他们中没有一个人喜欢两位数的工作年限。四位数字更容易识别为一个单词而不是一个数字,便于阅读。也许对一些人来说,最好的选择可能是组合:2位数的年份用于数据输入,4位数用于显示。