使用不同的日期格式解析日期字符串

时间:2016-03-15 11:03:04

标签: java parsing date-format

我正在尝试解析日期字符串,我的问题是这些字符串可以有不同的日期格式取决于他们是否在今天,明天或另一天谈论。

  • 如果他们谈论今天的活动,格式如下:20:45
  • 如果他们谈论明天的活动,格式为:明天20:45
  • 如果他们谈论另一天的格式是:2016年5月10日

所以我想知道我是否可以使用相同的DateFormat解析其中的三个,如果不是最好的方法。

DateFormat format = new SimpleDateFormat("EEEE d ' de' MMMM ' de' yyyy", locale);

3 个答案:

答案 0 :(得分:-1)

你不能使用相同的SimpleDateFormat来解析所有类型,并且不会是一个好的练习,不可读和更复杂不添加任何特殊值,我会尝试这样的事情:

private static final SimpleDateFormat formatHHMM = new SimpleDateFormat("hh:mm");
private static final SimpleDateFormat formatOther = new SimpleDateFormat("MMM dd yyyy");

private static String convertDate(Date curDate) {
    if (isToday(curDate)) {
        return formatHHMM.format(curDate);
    }
    else if (isTomorrow(curDate)) {
        return "Tomorrow " + formatHHMM.format(curDate);
    }
    return formatOther.format(curDate);
}

private static boolean isToday(Date curDate) {
    Date today = Calendar.getInstance().getTime();
    return today.equals(curDate);
}

private static boolean isTomorrow(Date curDate) {
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 1);
    Date tomorrow = calendar.getTime();
    return tomorrow.equals(curDate);
}
//Check the code with this
public static void main( String[] args )
{
    Date curDate = new Date();
    System.out.println( convertDate(curDate));

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 1);
    Date tomorrow = calendar.getTime();
    System.out.println( convertDate(tomorrow));

    calendar = Calendar.getInstance();
    calendar.add(Calendar.DATE, 15);
    Date other = calendar.getTime();
    System.out.println( convertDate(other));
}

答案 1 :(得分:-1)

我认为用同一格式化程序解析3种格式是不可能的。尽管可能只用一个格式化程序解析前两个,但意义的差异(今天或明天)将意味着一个不同的逻辑,这是单个格式化程序无法获得的。

我建议你分别处理每个案件,一个接一个地尝试:

    try {
        return LocalDate
                .now()
                .atTime(LocalTime.parse(date));
    } catch (DateTimeParseException e) {
        try {
            return LocalDate
                    .now()
                    .plusDays(1)
                    .atTime(LocalTime.parse(date, DateTimeFormatter.ofPattern("'tomorrow' HH:mm")));
        } catch (DateTimeParseException e1) {
            return LocalDate
                    .parse(date, DateTimeFormatter.ofPattern("MMMM dd yyyy", Locale.ENGLISH))
                    .atStartOfDay();
        }
    }
但是,我不确定控制流程的清晰度。如果输入格式的数量增加,则可能需要将重构更清晰。

答案 2 :(得分:-2)

if (DateFormat.charAt(0).isDigit() && DateFormat.charAt(1).isDigit() && DateFormat.charAt(2).isLetterOrDigit()==false  .... {
new String SimpleDateFormat= '15.03.2016';
else {

if (DateFormat.charAt(0).isLetter('t') &&  DateFormat.charAt(1).isLetter('o') &&   and so on 
 { SimpleDateFormat='16.03.2016'

您可以将1个字符的条件更改为匹配所有类型的数据格式