解析;“1/1/00”;给出了1/1/0001表示;年月日;java格式。如何解决?

解析;“1/1/00”;给出了1/1/0001表示;年月日;java格式。如何解决?,java,parsing,date,datetime,Java,Parsing,Date,Datetime,我必须以允许“yyyy”和“yy”的格式解析日期字符串,java支持这种情况。调用SimpleDataFormat.parse()后,我只需在年份中添加“20”或“19”: 添加 Stringparse()年前缀 “1/1/01”->“1/1/0001”->“1/1/2001” “1996年1月1日”->“0096年1月1日”->“1996年1月1日” 这对我来说很好,除了“2000”的问题:字符串“1/1/00”给出的是“0001”年,而不是“0000”。我怎样才能发现年份是“00”,而不是“

我必须以允许“yyyy”和“yy”的格式解析日期字符串,java支持这种情况。调用SimpleDataFormat.parse()后,我只需在年份中添加“20”或“19”:

添加
Stringparse()年前缀
“1/1/01”->“1/1/0001”->“1/1/2001”
“1996年1月1日”->“0096年1月1日”->“1996年1月1日”


这对我来说很好,除了“2000”的问题:字符串“1/1/00”给出的是“0001”年,而不是“0000”。我怎样才能发现年份是“00”,而不是“01”?谢谢

这一点在


对于使用缩写年模式(“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日

要解决“00”年的问题,可以使用严格解析模式(
format.setLenient(false)
)。在这种情况下,解析器将不允许输入“00”值,并将导致异常。因此,对于“2000”年,用户将被迫输入四位数字,而不会得到令人困惑的“01”年。希望它能帮助别人。

使用
MM
一个月。在测试这类东西时,使用除1以外的值可能是一个好主意。Ie 1/2/3或1/2/3000等使错误/误解更加明显。谢谢你,@Jens!“mm”模式已经在这里使用了。@Poldie,谢谢!问题只是关于零年的事情。我认为通过打开严格的包装可以避免另一种误解。谢谢你,诺豪斯!文档中提到了一些通用的,但没有提到零的情况。如果您在2015年创建SimpleDateFormat对象,那么年份“00”应该解释为“2000”(而不是“2100”)。此示例
SimpleDateFormat=new SimpleDateFormat(“mm/dd/yyyy”);解析日期=format.parse(“11/11/00”);System.out.println(已解析)给出的结果为:
太阳1月11日00:11:00 BRT 1
,即“0001”年。所需值为“0000”。非常感谢。我想说,上述行为仅适用于使用“y”或“yy”而不是“yyy”的情况,如文件所述。对于解析,如果模式字母的数量超过2,则不管数字的多少,年份都会按字面解释。因此,使用模式“MM/dd/yyyy”,“01/11/12”解析为公元12年1月11日(直接来自Java8文档)很好。如果您想正确解析两位数和四位数的日期,那么可以将Lenient设置为false,并首先尝试将其解析为四位数的日期,如果解析失败,请尝试使用两位数的日期。