字符串到日期;输入格式各不相同

时间:2011-06-25 21:21:18

标签: java date date-format simpledateformat string-conversion

对于我正在处理的项目,我需要将 String 转换为 Date 。不幸的是,在需要转换的所有字符串中,日期和时间的格式不同。在当前值中,我们经常会看到类似 2011-06-25T22:44:12 2011-06-25 22:49:01 (请注意T?)。

我知道如何使用 SimpleDateFormat String 转换为 Date ,但由于我不知道输入的格式是什么这似乎不是正确的方法。我想知道是否有办法将一些'格式'添加到 DateFormat 对象中,或者可能有一个 DateFormat 类可以自动检测格式?

我想到的另一种方法是在 String 上使用一些if / else语句和正则表达式来确定使用的格式并使用 SimpleDateFormat 类与它匹配,但我很确定应该有一个更简单的方法。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

T inside是因为它是日期http://en.wikipedia.org/wiki/ISO_8601的标准ISO格式。但是请注意,这种带有'T'的格式只是日期为ISO 8601时可能会看到的几种变体中的一种(其中一种变化被剥离时间,另一种变量具有以下时区特征)。

如果您知道您的日期符合ISO 8601标准(这通常适用于明确指定的XML - 当您使用XSD日期字段符合ISO 8601时),那么Java的SimpleDateFormat是不够的 - 它太简单了...您可能会转而使用JodaTime库 - Joda Time已经准备好使用ISO 8601格式化程序: http://joda-time.sourceforge.net/api-release/org/joda/time/format/ISODateTimeFormat.html

编辑:我不会实现任何复杂的正则表达式匹配 - 从长远来看,它会使代码难以维护和理解(特别是如果你可以有许多格式的许多来源)

建议是 - 找出哪个提供者使用哪种格式并采用策略模式:formatter = DateFormatterStrategyChooser.getFormatter(String source)。划分et impera。

如果您不是100%确定哪个来源带来了什么样的日期 - 您仍然可以使用UmbrellaFormatter(Collection)并按顺序浏览每个格式化程序,直到成功为止。这最好是可维护性而不是依赖于模糊和复杂的规则。

答案 1 :(得分:0)

测试是否存在'T',如果存在,则解析字符串并用空格替换。现在,您可以使用Date Formatter创建Date对象。

答案 2 :(得分:0)

如果你有几个变体,不只是一个有'T'而另一个带有空格,我相信if / then / else有几个正则表达式和匹配的SimpleDateFormats是可行的方法。