Java 为了这个目的,这是我会使用的选项。另一方面,还有其他选择: 在决定如何解析字符串之前,先尝试一下字符串 使用格式模式字符串的可选部分
在我的演示中,我使用了java.time,这是一种现代的java日期和时间API,因为问题中使用的Java 为了这个目的,这是我会使用的选项。另一方面,还有其他选择: 在决定如何解析字符串之前,先尝试一下字符串 使用格式模式字符串的可选部分,java,date,parsing,Java,Date,Parsing,在我的演示中,我使用了java.time,这是一种现代的java日期和时间API,因为问题中使用的date类总是设计得很糟糕,现在已经过时很久了。对于没有时间的日期,我们需要一个java.time.LocalDate 试一试 在java.time中使用try-catch如下所示: public Date parsedate(String date){ if(date !== null){ try{ 1. create a SimpleDateFormat ob
date
类总是设计得很糟糕,现在已经过时很久了。对于没有时间的日期,我们需要一个java.time.LocalDate
试一试
在java.time中使用try-catch如下所示:
public Date parsedate(String date){
if(date !== null){
try{
1. create a SimpleDateFormat object using 'dd-MMM-yy' as the pattern
2. parse the date
3. return the parsed date
}catch(ParseException e){
try{
1. create a SimpleDateFormat object using 'dd/MM/yyy' as the pattern
2. parse the date
3. return parsed date
}catch(ParseException e){
return null
}
}
}else{
return null
}
}
for (Date d: parseWithPatterns(someString, stream("dd/MM/yyyy", "dd-MM-yyyy")) {
// Do something with the date here.
}
DateTimeFormatter ddmmmuuFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ENGLISH);
DateTimeFormatter ddmmuuuuFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String dateString = "07-Jun-09";
LocalDate result;
try {
result = LocalDate.parse(dateString, ddmmmuuFormatter);
} catch (DateTimeParseException dtpe) {
result = LocalDate.parse(dateString, ddmmuuuuFormatter);
}
System.out.println("Date: " + result);
输出为:
日期:2009-06-07
假设我们将字符串定义为:
String dateString = "07/06/2009";
然后输出仍然是一样的
尝尝
如果您希望避免使用try-catch构造,那么很容易进行简单的检查以确定字符串符合哪种格式。例如:
import fj.F; import fj.F2;
import fj.data.Option;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static fj.Function.curry;
import static fj.Option.some;
import static fj.Option.none;
...
F<String, F<String, Option<Date>>> parseDate =
curry(new F2<String, String, Option<Date>>() {
public Option<Date> f(String pattern, String s) {
try {
return some(new SimpleDateFormat(pattern).parse(s));
}
catch (ParseException e) {
return none();
}
}
});
if (dateString.contains("-")) {
result = LocalDate.parse(dateString, ddmmmuuFormatter);
} else {
result = LocalDate.parse(dateString, ddmmuuuuFormatter);
}
结果和以前一样
在格式模式字符串中使用可选部分
这是我最不喜欢的选项,但它很短,并且是为了衡量完整性而提出的
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("[dd-MMM-uu][dd/MM/uuuu]", Locale.ENGLISH);
LocalDate result = LocalDate.parse(dateString, dateFormatter);
方括号表示格式的可选部分。因此Java首先尝试使用dd MMM uu
进行解析。无论成功与否,它都会尝试使用dd/MM/uuu
解析字符串的其余部分。给定两种格式,其中一种尝试将成功,并且您已经解析了日期。结果仍然与上面相同
链接
解释如何使用java.time。在java中检查长度应该比在中搜索字符快。@van:不需要过早优化。如果您决定保留您的解决方案,然后,请仅创建2个SimpleDataFormat实例,并将它们作为常量存储在类中,而不是创建它们130K次。如果确实将它们作为常量存储,请确保它们不会同时从多个线程中使用!我在前面遇到了一些问题,并提供了一个FindBugs检测器,用于查找静态日期格式和日历。它们被记录为非线程安全的,但这很容易被忽略。瞧,@van:别这样。SimpleDateFormat不是线程安全的,因此如果你从多个线程使用该类,事情会在你面前爆发。我想我会听取大家的建议,继续使用try..catch,因为这是一个一次性的应用程序,所以我不会在生产环境中运行它。但我将使功能性Java成为长期解决方案。我觉得很干净。谢谢。由于线程安全问题,我经历了一个漫长的调试过程,我建议使用JODA。它是完全线程安全的,因为所有格式化程序和日期时间都是不可变的。这是一个非常有趣的答案。我一定要查找函数式Java。谢谢。在java8中,尽管docs()没有说它抛出任何东西,但代码表明它确实抛出了一些RuntimeException:(
Option<Date> d = parseWithPatterns(someString,
stream("dd/MM/yyyy", "dd-MM-yyyy"));
if (d.isNone()) {
// Handle the case where neither pattern matches.
}
else {
// Do something with d.some()
}
DateUtils.multiParse("1-12-12");
DateUtils.multiParse("2-24-2012");
DateUtils.multiParse("3/5/2012");
DateUtils.multiParse("2/16/12");
public class DateUtils {
private static List<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();
private Utils() {
dateFormats.add(new SimpleDateFormat("MM/dd/yy")); // must precede yyyy
dateFormats.add(new SimpleDateFormat("MM/dd/yyyy"));
dateFormats.add(new SimpleDateFormat("MM-dd-yy"));
dateFormats.add(new SimpleDateFormat("MM-dd-yyyy"));
}
private static Date tryToParse(String input, SimpleDateFormat format) {
Date date = null;
try {
date = format.parse(input);
} catch (ParseException e) {
}
return date;
}
public static Date multiParse(String input) {
Date date = null;
for (SimpleDateFormat format : dateFormats) {
date = tryToParse(input, format);
if (date != null) break;
}
return date;
}
}
DateTimeFormatter ddmmmuuFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ENGLISH);
DateTimeFormatter ddmmuuuuFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String dateString = "07-Jun-09";
LocalDate result;
try {
result = LocalDate.parse(dateString, ddmmmuuFormatter);
} catch (DateTimeParseException dtpe) {
result = LocalDate.parse(dateString, ddmmuuuuFormatter);
}
System.out.println("Date: " + result);
String dateString = "07/06/2009";
if (dateString.contains("-")) {
result = LocalDate.parse(dateString, ddmmmuuFormatter);
} else {
result = LocalDate.parse(dateString, ddmmuuuuFormatter);
}
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofPattern("[dd-MMM-uu][dd/MM/uuuu]", Locale.ENGLISH);
LocalDate result = LocalDate.parse(dateString, dateFormatter);