将yyMdd转换为java中的正常日期(十六进制月份数)

时间:2014-10-07 12:04:13

标签: java parsing date hex

我的日期格式为' yyMdd'其中' M'是月份编号的十六进制编码(1是1月,C是12月)。如何将其解析为java.util.Date?这与here的格式相同,但需要Java解决方案。当然我可以自己编写一个简单的函数,但有没有处理这种格式的现有解析器?

2 个答案:

答案 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

当然,这种方法并不简单或简单,但具有不变性和线程安全性的优势。当然,同样的方案也可以应用于基于不可变类型的其他时间库。