我有一个包含日期表示的字符串。看起来像:
2006 年 11 月 30 日星期四 19:00:00 EST
我正在尝试使用 SimpleDateFormat 创建一个 Date 对象,但有两个问题。
1.)我无法弄清楚将解决方案硬编码到 SimpleDateFormat 构造函数中的模式
2.)我找不到可以使用 API 解析字符串以确定模式的方法,因此我可以将其重用于不同的日期输出模式
如果有人知道使用 API 的解决方案或自定义解决方案,我将不胜感激。
可以在http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html中查找传递给 SimpleDateFormat 的格式
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")
至于您的第二个问题,我不知道有任何 Java 库可以在事先不知道格式是什么的情况下找出日期格式并对其进行解析。
POJava 日期解析器 org.pojava.datetime.DateTime 是一个不可变且健壮的解析器,支持多种语言、时区和格式。
最重要的是,解析器是启发式的,不需要预先存在的“格式”即可工作。您只需将日期/日期时间文本字符串传递给它,然后得到一个 java.util.Date!
我不确定是否有任何简单的方法来解析日期并计算出它的模式,但我原以为您发布的模式是:
EEE MMM dd HH:mm:ss zzz yyyy
如果您想做除了解析或格式化日期之外的任何事情,那么处理模式本身的方法并不多。前一段时间,我正在编写一个 Swing 组件,用于将日期输入到格式化的文本字段中。您提供了一个模式,它将文本输入光标移动到该模式的元素中,只允许有效值。
作为其中的一部分,我编写了一个 DateFormatParser,可在此处获得,作为 OpenHarmonise 开源项目的一部分。
将日期解析为模式将是一个非常有趣的问题。您必须做出某些假设(例如使用 : in time 而不是 date),但您将面临 2 位数年份和日/月或月/日安排的永恒问题。
值得知道的是,您提供的日期格式不是任意的。它是内置 Date.toString() 方法的输出(至少在英国和美国地区)。并非巧合,它也是 unix 'date' 命令的格式(至少在 linux 上,我也相信其他实现) - 虽然是迂腐的,但 Date.toString() 用零填充一位数字的日期unix 日期没有。
这意味着当您将未格式化的日期输出到用户可修改的字段(例如 HTML INPUT 字段)中并在未修改的情况下接收回来时,您可能会收到这种输入格式。因此,仅仅因为输入以这种格式出现,并不意味着用户将输入一千种其他任意格式。
当然,他们仍然可能。我通常处理日期输入的方式是使用一堆 try/catch 块,我在其中尝试一种格式,然后是另一种格式,然后是另一种格式。默认情况下,我们的标准框架现在最多有 20 种不同的格式。当然,它仍然不完美;前几天我发现有人输入“03 Sept”作为日期(非标准月份缩写,没有年份),我们没有处理这种情况。
请参阅 Apache Commons 的DateUtils。有一种parseDate
方法可以让您String
和多个模式尝试并吐出一个Date
实例。
正如其他人所说,模式看起来应该是
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"
至于解析任意格式的日期,我不知道有任何库在 Java 中执行此操作。如果你热衷于开发这样的东西,我会从 perl str2time函数开始。
我必须说我发现另一个问题很有趣。但是有一个严重的问题 - 解析这个:08/07/06!如果您将自己限制在预期格式的一个子集上,您可能可以通过使用正则表达式来解决问题,您可以构建一堆预期的模式,然后在空格或其他任何东西上打破字符串,并逐部分匹配。
您只是在询问给定日期的模式吗?如果是这样,我认为应该这样做:
"EEE MMM d HH:mm:ss z yyyy"
或者您是否尝试采用任何格式化的日期,并推断格式并解析它?
怎么样:
EEE MMM dd HH:mm:ss zzz yyyy
只需将字符串传递给 SimpleDateFormat 的构造函数即可。要使用该对象,只需调用传入要转换为日期的字符串的 parse 方法。
你可以看看:
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
这并不完全相同,但您可能想查看JChronic 之类的东西,它可以对日期进行自然语言处理。因此,输入日期可能类似于“明天”或“从下周二开始的两周”。
这可能对您的应用程序根本没有帮助,但话又说回来,它可能会。