用于将字符串转换为日期的Java库

时间:2018-04-12 11:00:01

标签: java parsing datetime

我参与了一个项目,要求我将字符串解析为日期。我们得到的日期不是任何一个明确定义的格式。

示例:日期字段之间的可变空格,包括单个数字和多个数字日期字段,缺少日期字段,如缺少时间或可选的当前毫秒或区域偏移等。

按日期字段我的意思是:日,月,年,小时,分钟,秒,毫秒,区域偏移,时区等。

一些示例输入:

"2014    :11 :01 00 :49" 
"2015-08-25T00:02:40Z" 
"2016/6/2 19:16:29" 
"2017:10:27 18 :08: 9" 
"2016-04-29T16:10:48 .80+00:00"
"2017:02:11 9:26:16 a. m."
"2017-12-16T08:04:17####"

我决定使用DateTimeFormatter构建器来创建具有多个日期模式的格式化程序。

我想知道是否有任何简单的方法或者一个库对字符串进行类似的模糊匹配/解析到Date。

3 个答案:

答案 0 :(得分:2)

虽然没有明确的方法来解析这种模糊和随机的输入格式,但您可以使用正则表达式来提取实际日期,如果不是以小时和分钟为单位的时间。

您可以使用import java.util.regex.*;导入必要的类,并使用main()方法尝试此操作:

String input = "2014    :11 :01 00 :49"; // Or whatever the input is
String regex = "(\\d+)";
Matcher m = Pattern.compile(regex).matcher(input);

int year = 0, month = 0, date = 0;
if(m.find())
{
    year = Integer.parseInt(m.group(1));
}
if(m.find())
{
    month = Integer.parseInt(m.group(1));
}
if(m.find())
{
    date = Integer.parseInt(m.group(1));
}
System.out.println(year+":"+month+":"+date);

(\\d+)在调用m.find()时会给出下一个或多个数字的位置。

哪个会给2014:11:1,然后你可以解析它。

但是,似乎无法使用随机输入格式提取日期。

答案 1 :(得分:0)

您可以使用任何非数字字符作为分隔符来分割字符串:

String[] parts = input.split("\\D+");

根据项目数量(parts.length),您可以知道有多少字段(如果length为3,您知道它只有年,月和日等等)。

然后你做了一些额外的步骤来检查上午/下午的字符串和偏移量(Z+01:00-03:00等。

要验证所有字段,我会尝试创建一些日期/时间类型以确保所有字段都有效。例如:

// the constructors take nanoseconds as parameter (not milliseconds)
int nanos = ms * 1000000;

// only day, month and year, try to create a LocalDate
LocalDate.of(year, month, day);

// only hours and no offset, try to create a LocalTime
LocalTime.of(hour, min, sec, nanos);

// day, month and year, hours and no offset, try to create a LocalDateTime
LocalDateTime.of(year, month, day, hour, min, sec, nanos);

// *** Don't forget to adjust the hour value when AM/PM is found ***

// when an offset is found, try to create an OffsetDateTime
// offset accepts strings like "Z", "+01:00" or "-03:00"
ZoneOffset offset = ZoneOffset.of(offsetString);
OffsetDateTime.of(year, month, day, hour, min, sec, nanos, offset);

如果值无效(第0天,非闰年2月29日等),上述方法将抛出异常。

答案 2 :(得分:0)

我曾经有过一个任务,我需要将字符串转换为日期格式未提前知道的日期。一般来说,任务是获取一个字符串,如果它是一个日期将其转换为日期。我编写了这样的代码,但没有将其作为开源库发布。但是我写了一篇文章,详细描述了这个想法。以下是文章的链接:Java 8 java.time package: parsing any string to date

简而言之,我们的想法是将属性文件放入您想要支持的所有日期格式,然后逐个采用这些格式,看看您的String是否适合它。格式的顺序很重要,因为有时String可以适合多种格式(美国和欧洲),因此您需要确定哪些格式更可取并将它们放在其他格式之前。在任何情况下,如果您选择或将强制由于缺少库来编写您自己的代码

,请查阅该文章