如何在Java中将“ yyyyMMdd”日期格式转换为“ ccyyMMdd” simpledateformat

时间:2019-04-15 07:19:46

标签: java date simpledateformat date-formatting 2-digit-year

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

Java中“ cc”和“ yy”之间的区别是什么?

3 个答案:

答案 0 :(得分:2)

export default function Router({categoriesWithSub, handleChange}) //or export default function Router(props){ const {categoriesWithSub, handleChange} = props; } 不支持SimpleDateFormat的{​​{1}}。但是,如果您只是想要4位数字的年份,则可以使用c

您可以找到SimpleDateFormat官方文档中支持的完整列表

Century
  

OLD:20190415

如前所述,您还应该切换到新的Java Date/Time API,但是您会发现相同的问题,yyyy没有任何“世纪”功能。

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

NEW:20190415

答案 1 :(得分:1)

我和其他人一样,假设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);
    }

今天运行时的输出是:

  

字符串921126重新格式化为19921126

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

  

字符串200430重新格式化为20200430

     

日期240430超出范围

您想要的格式yyyyMMdd与内置的BASIC_ISO_DATE格式一致,因此我只用它来格式化日期。

我建议您不要使用SimpleDateFormat。那个班级众所周知是麻烦的,幸运的是已经过时了。另外,SimpleDateFormat不允许您像我上面那样控制两位数年份的解释。相反,我使用的是DateTimeFormatter和java.time中的其他类,它是现代Java日期和时间API。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 2 :(得分:0)

cc表示世纪。

无法将yyMMdd转换为ccyyMMdd,因为您在初始日期没有完整的年份。 例如,日期190415可能同时在21世纪和20世纪。