题
我有一个包含日期表示形式的字符串。看起来像:
2006 年 11 月 30 日星期四 19:00:00 美国东部时间
我正在尝试使用 SimpleDateFormat 创建一个 Date 对象,但有两个问题。
1.)我无法找出将解决方案硬编码到 SimpleDateFormat 构造函数中的模式
2.) 我找不到使用 API 解析字符串以确定模式的方法,因此我可以将其重用于不同的日期输出模式
如果有人知道使用 API 的解决方案或自定义解决方案,我将不胜感激。
解决方案
可以查看传递给 SimpleDateFormat 的格式 http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html
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 开源项目的一部分可在此处获取.
将日期解析为模式将是一个非常有趣的问题。您必须做出某些假设(例如用于 :时间而不是日期),但您将面临 2 位数年份和日/月或月/日安排的永恒问题。
值得一提的是,您给出的日期格式不是任意的。它是内置 Date.toString() 方法的输出(至少在英国和美国语言环境中)。并非巧合的是,它也是 unix 'date' 命令的格式(至少在 Linux 上,我也相信其他实现) - 尽管很迂腐,Date.toString() 用零填充一位数的日期数字,而Unix 日期没有。
这意味着当您将未格式化的日期输出到用户可修改的字段(例如,HTML INPUT 字段)并按原样接收它。因此,仅仅因为输入采用这种格式,并不意味着用户将输入上千种其他任意格式。
当然,他们仍然可能。我处理日期输入的方式通常是使用一堆 try/catch 块,我在其中尝试一种格式,然后是另一种格式,然后是另一种格式。我们的标准框架现在默认支持大约 20 种不同的格式。当然它还不是完美的;前几天我发现有人输入“03 Sept”作为日期(非标准月份缩写,没有年份),但我们没有处理这种情况。
参见 Apache Commons 的 日期工具. 。有一个 parseDate
方法需要你的 String
以及多种模式来尝试并吐出 Date
实例。
正如其他人所说,该模式看起来应该是这样
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"
至于解析任意格式的日期,我不知道有任何库可以在 Java 中执行此操作。如果你热衷于开发这样的东西,我会首先看看 perl 字符串2时间 功能。
我必须说我发现另一个问题非常有趣。但有一个严重的问题 - 解析这个:08/07/06!如果您将自己限制在预期格式的子集上,那么您可能可以通过使用正则表达式来解决问题,您可以构建一堆预期模式,然后在空格或其他地方打破字符串,并部分匹配。
您只是询问给定日期的模式吗?如果是这样,我认为应该这样做:
"EEE MMM d HH:mm:ss z yyyy"
或者您是否尝试获取任何格式化日期,推断格式并解析它?
怎么样:
EEE MMM dd HH:mm:ss zzz yyyy
只需将字符串传递到 SimpleDateFormat 的构造函数中即可。要使用该对象,只需调用解析方法,传入要转换为日期的字符串。
你可以看一下:
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
这实际上并不相同,但您可能想看看类似的东西 慢性病杂志, ,它可以对日期进行自然语言处理。因此,输入日期可能类似于“明天”或“下周二后两周”。
这可能对您的应用程序没有任何帮助,但话又说回来,它可能会。