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)
有些语言,例如普通话,会在它们的序数指示符前面加上,但也可以使用替换来处理 - 左边作为读者的练习:)
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,rd或th.
要在Java 6或7中使用它,您需要ThreeTen Backport.或Android for ThreeTenABP.
由于这些后缀对于英语是特殊的,并且其他语言/语言环境完全有其他用于编写日期和时间的用法(也不使用AM/PM),我相信除非您有其他要求,否则您应该尝试实现此英语日期和时间.此外,您应该明确地提供一个说英语的语言环境,以便它可以独立于您的计算机或JVM的语言环境设置工作.
我试图将Hugo和我自己的答案的最佳部分组合成一个重复的问题.在那个重复的问题下,还有更多的java 8答案.上述代码的一个限制是它没有非常严格的验证:你将侥幸逃脱Feb 13rd甚至Feb 13stndrdth.
| 归档时间: |
|
| 查看次数: |
9943 次 |
| 最近记录: |