我想在java中将格式从“yyyyMMdd”转换为“ccyyMMdd”simpledateformat。我在java中得到“c”作为非法字符。请帮助我找到在 java Simpledateformat 中转换为“ccyyMMdd”格式的解决方案
java中的“cc”和“yy”有什么区别?
我想在java中将格式从“yyyyMMdd”转换为“ccyyMMdd”simpledateformat。我在java中得到“c”作为非法字符。请帮助我找到在 java Simpledateformat 中转换为“ccyyMMdd”格式的解决方案
java中的“cc”和“yy”有什么区别?
SimpleDateFormat
不c
支持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
像其他人一样,我假设这cc
是一个世纪。所以ccyy
是一样的yyyy
。存在接受cc
或CC
世纪的其他语言的格式化程序,而不是 Java。
既然ccyy
是手段yyyy
,就没有从 to 做的yyyyMMdd
转换ccyyMMdd
。您已经获得yyyyMMdd
格式的字符串也是您想要的字符串。
最初您要求从yyMMdd
to转换ccyyMMdd
。例如,今天的日期将从 转换190415
为20190415
。
要正确进行转换,您需要知道打算使用哪个世纪。如果日期是演唱会门票的销售日期,您可以放心地假设该年份在未来 20 年内(包括当年)。如果这是一个活人的生日,那你已经搞砸了,对不起,因为它可能是过去 110 年或更长时间,所以你不知道是150415
1915 年还是 2015 年,19 世纪还是 20 世纪。无论如何,我建议您确定一个可接受的日期范围,最好比 100 年窄一些,以便您有一些验证并有机会检测某天某个日期是否违反了您的假设。
为了这个例子,我们假设日期在过去 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 的日期时间。
cc
意味着世纪。
无法转换yyMMdd
为ccyyMMdd
,因为您在初始日期没有全年。例如,日期190415
可能是 21 世纪,也可能是 20 世纪。