是否有一些适用于Java的智能日期/时间解析器库?智能我的意思是,我不需要指定日期/时间格式。 API应与此类似:
Calendar cal = DateTimeParser.parse("01/06/10 14:55");
cal = DateTimeParser.parse("1 Jan 2009"); // assumes 00:00 time
cal = DateTimeParser.parse("1.2.2010");
cal = DateTimeParser.parse("kygyutrtf"); // throws exception
更新:
// I'm telling the parser: "If unsure, assume US date format"
cal = DateTimeParser.parse("01/02/03", new Locale("en-us"));
答案 0 :(得分:12)
JodaTime非常适合处理日期对象(例如date.plusDays(10))
...但是JChronic是你想要的自然语言日期解析,例如
Chronic.parse("now")
Chronic.parse("tomorrow 15:00")
Chronic.parse("14/2/2001")
Chronic.parse("yesterday")
Chronic.parse("20 Jan 2010")
您的问题类似于this一个。
答案 1 :(得分:3)
不,没有。它应该在“01/02/03”上返回什么? 2003年1月1日,2001年2月3日,或2001年3月2日?
答案 2 :(得分:2)
好奇你要称之为智能,只需考虑以下几点:
1.2.2010
和我一样吗?您的问题的答案是否。
答案 3 :(得分:1)
这实际上不可能,或者至少不够可靠。
例如,字符串10/10/10
代表什么日期?
答案 4 :(得分:1)
如果您需要一个智能日期/时间解析器,请检查这个 https://github.com/zoho/hawking。由 ZOHO ZIA 团队开发。
Hawking Parser 是一个基于 Java 的 NLP 解析器,用于解析日期和时间信息。最流行的解析器,如 Heidel Time、SuTime 和 Natty Date 时间解析器,显然是基于规则的。因此,他们往往难以解析日期/时间信息,因为需要考虑更复杂的因素,如上下文、时态、多个值等。
考虑到这一点,Hawking Parser 旨在解决许多这些挑战,并且与其他可用的日期/时间解析器相比具有许多明显的优势。
它是 GPL v3 下的一个开源库,也是最好的库。要了解为什么它是最好的,请查看这篇详细解释的博客:https://www.zoho.com/blog/general/zias-nlp-based-hawking-date-time-parser-is-now-open-source.html
P.S:我是这个项目的开发者之一
答案 5 :(得分:1)
您可以使用 DateTimeFormatterBuilder
构建解析器,该解析器可以处理不区分大小写的解析、可选模式(在方括号内指定)、默认缺失字段(例如 HOUR_OF_DAY
)等。
演示:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
import java.util.Locale;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
final DateTimeFormatter parser = new DateTimeFormatterBuilder()
.parseCaseInsensitive() // parse in case-insensitive manner
.appendPattern("[M/d/uu[ H:m]][d MMM u][M.d.u][E MMM d, u]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.toFormatter(Locale.ENGLISH);
// Test
Stream.of(
"Thu Apr 1, 2021",
"THU Apr 1, 2021",
"01/06/10",
"1 Jan 2009",
"1.2.2010",
"asdf"
).forEach(s -> {
try {
System.out.println(LocalDateTime.parse(s, parser));
} catch(DateTimeParseException e) {
System.out.println("\"" + s + "\"" + " could not be parsed. Error: " + e.getMessage());
}
});
}
}
输出:
2021-04-01T00:00
2021-04-01T00:00
2010-01-06T00:00
2009-01-01T00:00
2010-01-02T00:00
"asdf" could not be parsed. Error: Text 'asdf' could not be parsed, unparsed text found at index 0
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
答案 6 :(得分:0)
您可以使用org.pojava。这个库足够聪明,可以检测时间格式
import org.pojava.datetime.DateTime;
import java.util.Date;
public class Main{
public static void main(String[] args){
String input1 = "6-Jan-69";
String input2 = "10 Apr 85 12:34:15";
String input3 = "7/Mar/77";
Date date1 = DateTime.parse(input1).toDate();
Date date2 = DateTime.parse(input2).toDate();
Date date3 = DateTime.parse(input3).toDate();
System.out.println(date1);
System.out.println(date2);
System.out.println(date3);
}
}
输出
Mon Jan 06 00:00:00 ICT 1969
Wed Apr 10 12:34:15 ICT 1985
Mon Mar 07 00:00:00 ICT 1977