Java有一个很好的日期解析器吗?

有没有人知道不同语言/区域设置的好日期解析器。 Java(SimpleDateFormat)的内置解析器非常严格。 它应该用当前日期完成缺失的部分。

例如

  • 如果我不输入年份(仅限日期和月份),则应使用当前年份。
  • 如果年份是08,则它不应解析0008,因为当前年份模式有4位数。

编辑:我想解析用户的输入。 例如,如果用户的区域设置日期格式为“dd.mm.yyyy”,并且用户仅键入“12.11”。 那么解析器应该接受它作为值为“12.11.2008”的有效日期。 目标是良好的可用性。

检查Joda Time及其Freaky Formatters。 http://joda-time.sourceforge.net/userguide.html#Input_and_Output

Java 8包含JSR-310,因此也可以作为解决方案。

从43642开始 ,虽然不一定重复:

请参阅Apache Commons的DateUtils 。 有一个parseDate方法,它使您的String和多个模式尝试并吐出Date实例。

(为清晰起见编辑。)

就个人而言,我认为严格是好的。 许多不同的情况需要围绕宽松解析的不同规则,所以不可能将它全面地放入公共库中。

但是,我彻底推荐Joda Time而不是内置的日期/时间类。 他们的格式化程序和解析器是线程安全的和不可变的,这也有帮助。 Joda Time对轻松解析提供了一些支持,如另一个答案中所示,但您应该自己必须提供一些规则。

如果你正在寻找可以解析自然“模糊”人类输入日期的东西,我会说JChronic 。

我已经使用了JChronic和Chronic(最初的Ruby版本)并取得了巨大的成功。

TL;博士

java.time.format.DateTimeFormatterBuilder::parseDefaulting

java.time

DateTimeFormatter类将字符串解析为日期时间对象。

您可以使用DateTimeFormatterBuilder类创建DateTimeFormatter的自定义实例。 该构建器类使您可以为输入字符串的缺失组件指定默认值。

 DateTimeFormatter f = new DateTimeFormatterBuilder() .appendPattern( "MM-dd" ) .parseDefaulting( ChronoField.YEAR , ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ).getYear() ) .toFormatter() ; String input = "01-23" ; LocalDate ld = LocalDate.parse( input , f ) ; System.out.println( ld ) ; 

ld.toString():2018-01-23

另请参见DateTimeFormatterBuilder,其中包含YEAR字段的指定parseDefaulting冲突


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

SourceForge上的POJava项目有一个DateTime对象,它可以解析多种语言的日期(当月份被指定为名称时),并且可以在MM-DD-YYYY和DD-MM-YYYY之间进行配置。 它启发式地分析日期,挑选最可能的年,月,日,小时,分钟,秒和时区,而不是支持预定义的格式。 jar文件大小约为60K。

对于像“10-08”这样的日期的解释存在模糊性,因为它可以作为“2008-10-08”或“2008年10月”的简写。 如果您接受在示例中给出的那种速记,您可以自己附加年份。

项目: POJava文档: HOWTO使用DateTime

使用DateFormat …目前的标准,直到Joda的欢迎喘息。

日历通常是要走的路,但要明白,如果你想要正确完成,大多数Java Date管理都将由你来处理。 如果您必须管理国际/跨区域信息, 时区是一件好事。 Joda Time也是一个很好的东西,是JSR 310中添加到Java的新建议的Date / Time概念背后的灵感。

希望这有用。

我试着在这个答案 strtotime Java实现可扩展的PHP的strtotime

我不得不为JodaTime说+1。 除了解析之外,Joda还可以更好地完成与日期相关的所有操作。