如何在 java 中将 "yyyyMMdd" 日期格式转换为 "ccyyMMdd" 简单日期格式

How to convert "yyyyMMdd" date format into "ccyyMMdd" simpledateformat in java

我想在 java 中将格式从 "yyyyMMdd" 转换为 "ccyyMMdd" simpledateformat。我在 java 中得到 "c" 作为非法字符。请帮助我找到在 java Simpledateformat

中转换为 "ccyyMMdd" 格式的解决方案

java中的"cc"和"yy"有什么区别?

cc表示世纪。

无法将 yyMMdd 转换为 ccyyMMdd,因为初始日期中没有完整的年份。 例如,日期 190415 可能是 21 世纪,也可能是 20 世纪。

SimpleDateFormat 不支持 Centuryc。但是如果你只是想要一个 4 位数的年份,你可以使用 yyyy

您可以在 SimpleDateFormat

的官方文档中找到支持的完整列表
//import java.util.Date;
//import java.text.SimpleDateFormat;

String s = "190415";
SimpleDateFormat sdfIn = new SimpleDateFormat("yyMMdd");
SimpleDateFormat sdfout = new SimpleDateFormat("yyyyMMdd");

Date d = sdfIn.parse(s);
System.out.println("OLD : " + sdfout.format(d));

OLD : 20190415

如前所述,您也应该切换到新的 Java Date/Time API,但您会发现同样的问题,DateTimeFormatter 没有任何 "century" 功能。

//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;

String s = "190415";
DateTimeFormatter dtfIn = DateTimeFormatter.ofPattern("yyMMdd");
DateTimeFormatter dtfOut = DateTimeFormatter.ofPattern("yyyyMMdd");

LocalDate ld = LocalDate.parse(s, dtfIn);
System.out.println("NEW : " + dtfOut.format(ld));

NEW : 20190415

和其他人一样,我假设 cc 是世纪。所以 ccyyyyyy 相同。 Java 以外的其他语言的格式化程序接受 ccCC 世纪。

编辑:无需转换

因为 ccyy 表示 yyyy,所以不需要从 yyyyMMddccyyMMdd 的转换。你已经得到的yyyyMMdd格式的字符串也是你想要的字符串。

原回答

最初您要求将 yyMMdd 转换为 ccyyMMdd。例如,今天的日期将从 190415 转换为 20190415

要正确进行转换,您需要知道要使用哪个世纪。如果日期是音乐会门票的销售日期,您可以放心地假设该年份在接下来的 20 年内(包括当年)。如果是活人的生日,那你就完蛋了,对不起,因为它可能是过去 110 年或更长时间,所以你不知道 150415 是指 1915 年还是 2015 年,19 世纪还是 20 世纪。无论如何,我建议您确定一个可接受的日期范围,最好小于 100 年,这样您就有了一些验证并有机会检测某一天是否违反了您的假设。

java.time

为了示例,我们假设日期在过去 30 年或未来 5 年内(这允许我们根据年份获得 19 世纪或 20 世纪)。

    // The base year just needs to be before the minimum year
    // and at most 99 years before the maximum year
    int baseYear = Year.now().minusYears(40).getValue();

    DateTimeFormatter originalDateFormatter = new DateTimeFormatterBuilder()
            .appendValueReduced(ChronoField.YEAR, 2, 2, baseYear)
            .appendPattern("MMdd")
            .toFormatter();
    
    String originalDateString = "921126";
    LocalDate today = LocalDate.now(ZoneId.of("Africa/Bangui"));
    LocalDate date = LocalDate.parse(originalDateString, originalDateFormatter);
    if (date.isBefore(today.minusYears(30)) || date.isAfter(today.plusYears(5))) {
        System.out.println("Date " + originalDateString + " is out of range");
    } else {
        String ccyymmddDateString = date.format(DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("String " + originalDateString + " was reformatted to " + ccyymmddDateString);
    }

今天 运行 时的输出是:

String 921126 was reformatted to 19921126

其他一些原始字符串产生:

String 200430 was reformatted to 20200430

Date 240430 is out of range

你想要的格式,yyyyMMdd,符合内置的BASIC_ISO_DATE格式,所以我就用它来格式化日期。

我建议你不要使用SimpleDateFormat。 class 是出了名的麻烦而且幸运的是早已过时了。另外 SimpleDateFormat 不允许您像我上面那样控制两位数年份的解释。相反,我使用 DateTimeFormatter 和 java.time 中的其他 classes,现代 Java 日期和时间 API.

Link: Oracle tutorial: Date Time 解释如何使用 java.time.