用不同的日期格式解析日期字符串
我想解析日期字符串,我的问题是那些字符串可以有不同的dateformats取决于他们是否谈论今天,明天或其他日子。用不同的日期格式解析日期字符串
- 如果他们谈论今天事件的格式是这样的:20:45
- 如果他们谈论未来事件的格式是:明天20:45
- 而关于另一天的格式,如果他们说话是︰2016年5月10日
所以我想知道如果我可以解析他们三个相同的DateFormat,如果不是什么将是最好的方式。
DateFormat format = new SimpleDateFormat("EEEE d ' de' MMMM ' de' yyyy", locale);
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的条件相匹配的数据格式的所有类型
请至少向OP提供可编译代码。 – Spotted
你不能使用相同的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));
}
我认为OP想要解析**解析**不同的日期格式,而不是**格式**。 – Spotted
我不认为这是可能使用相同的格式解析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();
}
}
我不知道有关控制流的清晰度,但。如果输入格式的数量增加,可能需要重构为更清晰的东西。
那么,我不喜欢通过异常捕获控制流,但那不是你的错(在这里被API限制所强制)。无论如何,表现会受到影响,这是肯定的。 –
我不认为增加异常流程的逻辑是一个明确的解决方案。 – cralfaro
你使用哪个Java版本? – Mirco
不,你不能使用相同的DateFormat实例解析它们,因为这需要解析值以获得给定的格式。如果您确定这些是您可以获得的唯一格式,那么您可以首先检查字符串的长度== 5(如果是今天的话),然后检查字符串是否包含“明天”,如果其中没有一个是真的,则可以格式化它与DateFormat。 –