-2

我想在java中将格式从“yyyyMMdd”转换为“ccyyMMdd”simpledateformat。我在java中得到“c”作为非法字符。请帮助我找到在 java Simpledateformat 中转换为“ccyyMMdd”格式的解决方案

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

4

3 回答 3

2

SimpleDateFormatc支持Century. _ 但如果你只是想要一个 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));

旧:20190415

正如所指出的,您还应该切换到新的Java 日期/时间 API,但您会发现同样的问题,DateTimeFormatter没有任何“世纪”功能。

//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));

新:20190415

于 2019-04-15T08:01:21.103 回答
1

像其他人一样,我假设这cc是一个世纪。所以ccyy是一样的yyyy。存在接受ccCC世纪的其他语言的格式化程序,而不是 Java。

编辑:无需转换

既然ccyy是手段yyyy,就没有从 to 做的yyyyMMdd转换ccyyMMdd。您已经获得yyyyMMdd格式的字符串也是您想要的字符串。

原始答案

最初您要求从yyMMddto转换ccyyMMdd。例如,今天的日期将从 转换19041520190415

要正确进行转换,您需要知道打算使用哪个世纪。如果日期是演唱会门票的销售日期,您可以放心地假设该年份在未来 20 年内(包括当年)。如果这是一个活人的生日,那你已经搞砸了,对不起,因为它可能是过去 110 年或更长时间,所以你不知道是1504151915 年还是 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);
    }

今天运行时的输出是:

字符串 921126 被重新格式化为 19921126

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

字符串 200430 被重新格式化为 20200430

日期 240430 超出范围

您想要的格式yyyyMMdd与内置BASIC_ISO_DATE格式一致,所以我只是使用它来格式化日期。

我建议你不要使用SimpleDateFormat. 这个类是出了名的麻烦,幸运的是已经过时了。也SimpleDateFormat不允许您像我上面那样控制对 2 位数年份的解释。相反,我正在使用DateTimeFormatter现代 Java 日期和时间 API java.time 中的其他类。

链接: Oracle 教程:解释如何使用 java.time 的日期时间。

于 2019-04-15T09:11:27.547 回答
0

cc意味着世纪。

无法转换yyMMddccyyMMdd,因为您在初始日期没有全年。例如,日期190415可能是 21 世纪,也可能是 20 世纪。

于 2019-04-15T07:32:04.393 回答