2016-03-15 255 views
2

我想解析日期字符串,我的问题是那些字符串可以有不同的dateformats取决于他们是否谈论今天,明天或其他日子。用不同的日期格式解析日期字符串

  • 如果他们谈论今天事件的格式是这样的:20:45
  • 如果他们谈论未来事件的格式是:明天20:45
  • 而关于另一天的格式,如果他们说话是︰2016年5月10日

所以我想知道如果我可以解析他们三个相同的DateFormat,如果不是什么将是最好的方式。

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

你使用哪个Java版本? – Mirco

+0

不,你不能使用相同的DateFormat实例解析它们,因为这需要解析值以获得给定的格式。如果您确定这些是您可以获得的唯一格式,那么您可以首先检查字符串的长度== 5(如果是今天的话),然后检查字符串是否包含“明天”,如果其中没有一个是真的,则可以格式化它与DateFormat。 –

回答

-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个字符改变1的条件相匹配的数据格式的所有类型

+2

请至少向OP提供可编译代码。 – Spotted

-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

我认为OP想要解析**解析**不同的日期格式,而不是**格式**。 – Spotted

-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(); 
     } 
    } 

我不知道有关控制流的清晰度,但。如果输入格式的数量增加,可能需要重构为更清晰的东西。

+0

那么,我不喜欢通过异常捕获控制流,但那不是你的错(在这里被API限制所强制)。无论如何,表现会受到影响,这是肯定的。 –

+0

我不认为增加异常流程的逻辑是一个明确的解决方案。 – cralfaro