适用于Java的智能日期/时间解析器

时间:2010-11-18 15:05:45

标签: java datetime

是否有一些适用于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"));

7 个答案:

答案 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和我一样吗?
  • 如果代码在具有不同区域设置的不同时区运行会发生什么?
  • 它应该遵循一些well established标准还是完全发明它?

您的问题的答案是

答案 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)

java.time

您可以使用 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