我的日期格式为' yyMdd'其中' M'是月份编号的十六进制编码(1
是1月,C
是12月)。如何将其解析为java.util.Date
?这与here的格式相同,但需要Java解决方案。当然我可以自己编写一个简单的函数,但有没有处理这种格式的现有解析器?
答案 0 :(得分:2)
您应该尝试使用java.text中的SimpleDateFormat:
首先,我会替换A,B和B的日期字符串值。 C等价物10,11& 12:
String yourDate = "14A07";
String day = StringUtils.substring(yourDate, 0, 2);
String month = StringUtils.substring(yourDate, 2, yourDate.length()-2);
month = month.replaceAll("A", "10").replaceAll("B", "11").replaceAll("C", "12");
if (month.length() == 1) {
month = "0".concat(month);
}
String year = StringUtils.substring(yourDate, yourDate.length()-2, yourDate.length());
String adaptedDate = new StringBuilder(
.append(day)
.append(month)
.append(year)
.toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
Date date = sdf.parse(adaptedDate);
答案 1 :(得分:2)
使用类SimpleDateFormat
,您将被迫进行一些文本预处理。
String input = "12B17T"; // according to the other SO-post
String month = input.substring(2, 3);
if (month.equals("A")) {
month = "10";
} else if (month.equals("B")) {
month = "11";
} else if (month.equals("C")) {
month = "12";
} else {
month = "0" + month;
}
String date = input.substring(0, 2) + month + input.substring(3, 5);
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
Date d = sdf.parse(date);
使用Joda-Time的另一种解决方案可能如下:
String input = "12B17T"; // according to the other SO-post
int pivotYear = 2032;
DateTimeParser monthParser =
new DateTimeParser() {
@Override
public int estimateParsedLength() {
return 1;
}
@Override
public int parseInto(DateTimeParserBucket bucket, String text, int position) {
DateTimeField field = ISOChronology.getInstance().monthOfYear();
char c = text.charAt(position);
if (c >= '1' && c <= '9') {
int value = c - '0';
bucket.saveField(field, value);
return position + 1;
}
switch (c) {
case 'A' :
bucket.saveField(field, 10);
break;
case 'B' :
bucket.saveField(field, 11);
break;
case 'C' :
bucket.saveField(field, 12);
break;
default :
return ~position;
}
return position + 1;
}
};
DateTimeFormatter f =
new DateTimeFormatterBuilder().appendTwoDigitYear(pivotYear - 50).append(monthParser)
.appendDayOfMonth(2).appendLiteral('T').toFormatter();
LocalDate date = f.parseLocalDate(input);
System.out.println(date); // output: 2012-11-17
当然,这种方法并不简单或简单,但具有不变性和线程安全性的优势。当然,同样的方案也可以应用于基于不可变类型的其他时间库。