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