如何在 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
不支持 Century
的 c
。但是如果你只是想要一个 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
是世纪。所以 ccyy
与 yyyy
相同。 Java 以外的其他语言的格式化程序接受 cc
或 CC
世纪。
编辑:无需转换
因为 ccyy
表示 yyyy
,所以不需要从 yyyyMMdd
到 ccyyMMdd
的转换。你已经得到的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.
我想在 java 中将格式从 "yyyyMMdd" 转换为 "ccyyMMdd" simpledateformat。我在 java 中得到 "c" 作为非法字符。请帮助我找到在 java Simpledateformat
中转换为 "ccyyMMdd" 格式的解决方案java中的"cc"和"yy"有什么区别?
cc
表示世纪。
无法将 yyMMdd
转换为 ccyyMMdd
,因为初始日期中没有完整的年份。
例如,日期 190415
可能是 21 世纪,也可能是 20 世纪。
SimpleDateFormat
不支持 Century
的 c
。但是如果你只是想要一个 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
是世纪。所以 ccyy
与 yyyy
相同。 Java 以外的其他语言的格式化程序接受 cc
或 CC
世纪。
编辑:无需转换
因为 ccyy
表示 yyyy
,所以不需要从 yyyyMMdd
到 ccyyMMdd
的转换。你已经得到的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.