我想在Java中将格式从“ yyyyMMdd”转换为“ ccyyMMdd” simpledateformat。我在Java中将“ c”作为非法字符。请帮助我找到要在Java Simpledateformat中转换为“ ccyyMMdd”格式的解决方案
Java中“ cc”和“ yy”之间的区别是什么?
答案 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
是一个世纪。因此ccyy
与yyyy
相同。存在Java以外的其他语言的格式器,它们接受cc
或CC
的世纪。
由于ccyy
的意思是yyyy
,因此没有从yyyyMMdd
到ccyyMMdd
的转换。您已经以yyyyMMdd
格式获得的字符串也是您想要的字符串。
您最初要求从yyMMdd
转换为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
不允许您像我上面那样控制两位数年份的解释。相反,我使用的是DateTimeFormatter
和java.time中的其他类,它是现代Java日期和时间API。
链接: Oracle tutorial: Date Time解释了如何使用java.time。
答案 2 :(得分:0)
cc
表示世纪。
无法将yyMMdd
转换为ccyyMMdd
,因为您在初始日期没有完整的年份。
例如,日期190415
可能同时在21世纪和20世纪。