在日期时间字符串中解析日期的序数指示符(st,nd,rd,th)

hao*_*hao 18 java date-parsing simpledateformat

我检查了SimpleDateFormatjavadoc,但是我无法找到一种方法来解析日期格式的序数指示符,如下所示:

 Feb 13th 2015 9:00AM
Run Code Online (Sandbox Code Playgroud)

我试过了"MMM dd yyyy hh:mma",但是这个日子必须要有数字才能正确吗?

是否可以使用a解析"第13"日期SimpleDateFormat而不必截断字符串?

Boh*_*ian 22

Java的SimpleDateFormat不支持序数后缀,但序数后缀只是眼睛糖果 - 它是多余的,可以轻松删除以允许简单的解析:

Date date = new SimpleDateFormat("MMM dd yyyy hh:mma")
    .parse(str.replaceAll("(?<=\\d)(st|nd|rd|th)", ""));
Run Code Online (Sandbox Code Playgroud)

替换正则表达式非常简单,因为这些序列不会出现在有效日期的任何其他位置.


要处理任何语言,将任何语言的任意长度的序数指示符作为后缀附加:

Date date = new SimpleDateFormat("MMM dd yyyy hh:mma")
    .parse(str.replaceAll("(?<=\\d)(?=\\D* \\d+ )\\p{L}+", ""));
Run Code Online (Sandbox Code Playgroud)

有些语言,例如普通话,会在它们的序数指示符前面加上,但也可以使用替换来处理 - 左边作为读者的练习:)

  • @hao 我认为 `SimpleDateFormat` 将来不会得到改进。更有可能的是“他们”在 Java 8 的新 Time/Date 类上工作:http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html。 (2认同)

Ole*_*.V. 5

Java 8答案(和Java 6和7)(因为在2015年提出这个问题时,替换SimpleDateFormat已经出来了):

    DateTimeFormatter parseFormatter = DateTimeFormatter
            .ofPattern("MMM d['st']['nd']['rd']['th'] uuuu h:mma", Locale.ENGLISH);
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, parseFormatter);
Run Code Online (Sandbox Code Playgroud)

随着问题的样本日期,这个yiedls:

2015-02-13T09:00
Run Code Online (Sandbox Code Playgroud)

格式模式[]表示可选部分,''表示文字部分.所以图案说,数字可以跟随st,nd,rdth.

要在Java 6或7中使用它,您需要ThreeTen Backport.或Android for ThreeTenABP.

由于这些后缀对于英语是特殊的,并且其他语言/语言环境完全有其他用于编写日期和时间的用法(也不使用AM/PM),我相信除非您有其他要求,否则您应该尝试实现此英语日期和时间.此外,您应该明确地提供一个说英语的语言环境,以便它可以独立于您的计算机或JVM的语言环境设置工作.

我试图将Hugo我自己的答案的最佳部分组合成一个重复的问题.在那个重复的问题,还有更多的java 8答案.上述代码的一个限制是它没有非常严格的验证:你将侥幸逃脱Feb 13rd甚至Feb 13stndrdth.