我必须输入输入日期并将其转换为通用日期格式。 为此我创建了一个函数(不是通用函数),下面是函数的示例代码。
public class ConvertTimestampFormat{
public void evaluate(String dateInString) {
if (!StringUtils.isEmpty(dateInString)) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
try {
Date date = formatter.parse(dateInString);
System.out.println(date);
System.out.println(formatter.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ConvertTimestampFormat obj = new ConvertTimestampFormat();
obj.evaluate("2014-06-14-12:58");
}
}
如果示例代码中有错误,请更正。
这里我对输入日期格式2014-06-14-12:58
进行了硬编码。在这里,我将获得不同类型的日期格式,例如2014/06/14-12:58
,2014-Mar-14-12:58
(这样我现在将获得5到6种格式)。我想用if if来检查格式然后根据格式为每种格式编写单独的代码。但如果将来出现新的日期格式,它将会失败。
我的输出格式应始终为yyyy-MM-dd hh:mm:ss
。
请建议我使用通用方式(通用功能)。
答案 0 :(得分:2)
有两种方法可以做到这一点。您要么为格式化程序字符串提供日期,要么提供硬编码和链接(非常难看)您要使用的每种格式。我建议将链式解决方案分解为多种方法。
解决方案1:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
public class ConvertTimestampFormat {
private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
private Date dateObject;
public void evaluate(String dateString, String dateFormat) {
if (!StringUtils.isEmpty(dateString)) {
SimpleDateFormat inputFormat = new SimpleDateFormat(dateFormat);
try {
dateObject = inputFormat.parse(dateString);
} catch (ParseException e) {
//Parse failed. String does not match the formatter.
}
if(dateObject != null) {
System.out.println(outputFormat.format(dateObject));
}
}
}
public static void main(String[] args) {
ConvertTimestampFormat obj = new ConvertTimestampFormat();
obj.evaluate("2014-03-14-12:58", "yyyy-MM-dd-hh:mm");
obj.evaluate("2014-Mar-14-12:58", "yyyy-MMM-dd-hh:mm");
}
}
丑陋的解决方案:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
public class ConvertTimestampFormat {
private SimpleDateFormat inputFormat1 = new SimpleDateFormat("yyyy-MM-dd-hh:mm");
private SimpleDateFormat inputFormat2 = new SimpleDateFormat("yyyy-MMM-dd-hh:mm");
private SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
private Date dateObject;
public void evaluate(String dateInString) {
if (!StringUtils.isEmpty(dateInString)) {
try {
dateObject = inputFormat1.parse(dateInString);
} catch (ParseException e) {
try {
dateObject = inputFormat2.parse(dateInString);
} catch (ParseException e1) {
//String didn't match either formatters. You'll want to do something about this!
}
}
if(dateObject != null) {
System.out.println(outputFormat.format(dateObject));
}
}
}
public static void main(String[] args) {
ConvertTimestampFormat obj = new ConvertTimestampFormat();
obj.evaluate("2014-03-14-12:58");
obj.evaluate("2014-Mar-14-12:58");
}
}
答案 1 :(得分:2)
目前,似乎没有任何神奇的"处理Java中所有可能的日期格式的方法。
你能做的最好,正如另一个答案(need flexible datetime conversion with joda)所建议的那样,是这样的:
private static final SimpleDateFormat[] FORMATTERS = new SimpleDateFormat[] {
new SimpleDateFormat("yyyy-MM-dd hh:mm"),
new SimpleDateFormat("yyyy/MM/dd-hh:mm"),
[...]};
private static Date parseDate(String dateInString) {
Date date = null;
for (int i = 0; i < FORMATTERS.length; i++) {
try {
date = FORMATTERS[i].parse(dateInString);
break;
} catch (ParseException e) {
// Nothing to do, try the next one
}
}
return date;
}
要使用此代码,您只需使用日期字符串调用parseDate
即可。
要添加新格式,请将其添加到FORMATTERS
数组。
这不是你最终可以得到的最漂亮的代码。通过异常和断开循环处理代码可能是一种不好的做法。请参阅link1,link2。
为了增强您的代码,您可以考虑使用Joda-Time(Java&lt; = 7)或Java 8 java.time类:DateTimeFormat / DateTimeFormatter和{{3} } / LocalDateTime(joda)提供LocalDateTime(java8)超过标准/旧标准:
使用Java 8 java.time类:
private static final DateTimeFormatter[] FORMATTERS = new DateTimeFormatter[] {
DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"),
DateTimeFormatter.ofPattern("yyyy/MM/dd-hh:mm"),
[...]};
private static Optional<LocalDateTime> parseDate(String dateInString) {
Optional<LocalDateTime> date = Optional.empty();
for (int i = 0; i < FORMATTERS.length; i++) {
try {
date = Optional.of(LocalDateTime.parse(dateInString, FORMATTERS[i]));
break;
} catch (DateTimeParseException e) {
// Nothing to do, try the next one
}
}
return date;
}
如果无法解析dateInString
而不是enhanced API null
,我还添加了一些Optional来处理结果的空白。
答案 2 :(得分:1)
obj.evaluate("2014-06-14 12:58");
所以,字符串应该像SimpleDateFormat()
硬编码字符串应该与{{1}}
中提到的格式完全相同