JAVA SimpleDateFormat错误2位数年份

时间:2018-04-11 07:11:01

标签: java date simpledateformat

我试图在java中验证一个日期,一切都很好,除了它不会让我把2位数年。我尝试使用“yyyy”格式和“y”,但不起作用。

编辑:有些人误解了我的意思。我想要得到的是输入日期“1/1/55”并获得日期“1/1/55”而不是“1/1/1955”,所以我不打算使用“yy”作为日期格式,即使你可以改变世纪,我也希望把一年的数字放在2位以上。

问题在于验证(如果)。 TestDate是FechaString的解析,但当我比较两者时,当FechaString为“1/1/55”时,testDate的值为例如“1/1/0055”,并且它不会将它们识别为相等。

SimpleDateFormat df = new SimpleDateFormat("d/M/y");
        Date testDate = null;
        String FechaString;
        int dia,mes,anno;
        boolean error=false;

        do{

        System.out.println("Introduzca la fecha de nacimiento (dd/mm/aaaa)");
        FechaString = entrada.nextLine();
        try{
            testDate = df.parse(FechaString);
        } catch (ParseException e){ System.out.println("Formato no válido");}

        if (!df.format(testDate).equals(FechaString)){
            System.out.println("\nFECHA NO PERMITIDA!!");
            error=true;
        } else {
            System.out.println("\nFecha: OK");
            error=false;
        }
        }while (error);

        FechaNac = df.parse(FechaString);

5 个答案:

答案 0 :(得分:3)

使用yy作为年度,查看setTwoDigitYearStart方法。你需要告诉它哪个世纪你想要将这一年视为。

答案 1 :(得分:2)

根据java docs

  

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

因此,该行为已在文档中清楚地解释。但是,您可以使用century此方法更改默认SimpleDateFormat#set2DigitYearStart()的设置。

答案 2 :(得分:1)

您可以使用yy代替y。

**SimpleDateFormat s=new SimpleDateFormat("dd/MM/yy");
        String format = s.format(new Date());
     System.out.println(format);**  

答案 3 :(得分:1)

您想要的是直接来自java.time,现代Java日期和时间API。让我演示一下:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d/M/u");

    for (String dateString : new String[] { "1/1/5", "1/1/55", "1/1/755", "1/1/1955" }) {
        LocalDate date = LocalDate.parse(dateString, dtf);
        System.out.println(date);
        String formattedBack = date.format(dtf);
        System.out.println(formattedBack);
        System.out.println("Equal to original string? " + formattedBack.equals(dateString));
    }

打印

0005-01-01
1/1/5
Equal to original string? true
0055-01-01
1/1/55
Equal to original string? true
0755-01-01
1/1/755
Equal to original string? true
1955-01-01
1/1/1955
Equal to original string? true

现代API(通常也)可以更好地使用。所以我建议你把麻烦的SimpleDateFormat和其他过时的日期时间类别抛到一边。

唯一需要注意的是现代课程使用Proleptic Gregorian日历。它的日期并不总是与老式班级用于旧日期的儒略历一致。

链接

答案 4 :(得分:0)

@PixelFox简单日期格式应该与此"dd/MM/yyyy"

类似

试试这个希望它的帮助...

进口

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

 try {
        SimpleDateFormat simpledate = new SimpleDateFormat(format);
        testDate = df.parse(FechaString);
        if (!FetchString.equals(sdf.format(testdate))) {
            testdate = null;
        }else{}
    } catch (ParseException ex) {
        ex.printStackTrace();
 }