我们如何以编程方式从存储在字符串中的日期创建模式?

时间:2020-03-05 18:47:38  来源:igfitidea点击:

我有一个包含日期表示形式的字符串。看起来像:

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!