在Java中区分和解析日期

时间:2011-05-19 12:02:04

标签: java parsing date-format

我知道这个话题并不新鲜,但我必须再次挖掘它。 我已经多次搜索过网络(包括一些关于stackoverflow的线程)但到目前为止还没有找到令人满意的答案。

(其中我查了一下 Parsing Ambiguous Dates in Javahttp://www.coderanch.com/t/375367/java/java/Handling-Multiple-Date-Formats-Elegantly

我目前正在用Java编写一个Dateparser,它接受一个日期并生成一个format-String,SimpleDateFormat可以使用它来解析日期。

日期是通过正则表达式解析的(是的,它是一个丑陋的xD)来自Logfiles(IBM Websphere,Tomcat,Microsoft Exchange,......)。因为我们在(至少2个)不同的Locales中有客户,所以没有办法简单地“抛出”String来解决SimpleDateFormat的parse方法并期望它正常工作。

此外,日期和月份的位置存在问题(即格式“dd / MM / yyyy”或“MM / dd / yyyy”)如果我没有至少两个数据集,则无法解决天数已经改变..

所以我目前的方法是将安装在特定客户系统中的特定软件的日期格式存储在数据库(mysql / xml / ...)中,并强制用户至少指定customername和softwarename,以便有足够的上下文分解可能给出格式的可能性数量。

然后,此“子集”将用于尝试解析指定软件的日志文件。 (子集以HashMap的形式存储在HashMap中 的HashMap>地图; Integer-Key是formatstring的长度,第二个Hashmap的String Key指定仅包含分隔字符的datesignature。 (即“.. ::。”表示格式为“dd.MM.yyyy 11:11:11.111”的日期)

我还考虑了数字的值,即数字> 12必须是一天,因为没有第13个月。但这仅适用于Date-Strings,而不是一个月的12月。

是否有机会避免实现有关日志文件所带来的环境的先验知识,从而使解析器能够可靠地解析一个日期而无需引用第二个日期字符串进行比较?

我现在已经坚持了将近3个月--.-

任何建议都会非常受欢迎=)

修改

好的,这个帖子可以关闭。我现在为我的具体问题想出了一个不同的解决方案。对于那些感兴趣的人: 我正在用Java编写一个Logreader。由于我们有定期维护,我必须阅读许多日志文件。 但这不仅仅是文件中写入的纯文本信息。 想象一下,服务器刚刚崩溃,这是星期天晚上,下一个要注意的人是客户IT部门的负责人。然后在第二天我必须维护并检查日志文件。从内容来看,一切似乎都没问题,没什么不寻常的。发送维护报告后半小时,我收到一封邮件,上面提到的dpt咆哮,服务器已经崩溃,似乎没有引起注意。

关键是,您无法跟踪数千行的日志文件的内容和时间戳。所以我开发了一个组件,它读取日志文件并计算两个不同日志之间的时间。每个日志都被解析为java.util.Date,以便稍后将Date作为时间戳,以获得有关日志间隔的高分辨率。然后我将这些差异扔到线图上,这使得两个日志之间的较长超时可见为与文件其余部分相关的大峰值。

我现在的解决方案是完全抛弃String的日期 - 一半并插入带有预定义格式的dummy-Date。如果小时和分钟接近23:59,则日期必须改变。 之后的原始日期显示在图表上,下面是“假数据”。

我感谢你们所有人的建议和反馈=) (我希望到目前为止我的英语已经可以理解了;)

3 个答案:

答案 0 :(得分:1)

我的建议是将所有日期存储为“模棱两可”的日期。直到可以解决歧义的时间。 (这假定特定客户将始终以相同的格式提供数据。)只要您从客户那里获得了可以明确标识日期格式的日志,您就可以将此格式追溯应用于以前的文件

为此,您需要一个表,将每个客户映射到其日期格式,并使用一些标记(例如NULL)来指示尚未建立格式。您可能还需要创建自己的日期表示,以便可以对这些模糊日期进行建模。

因此,举例来说,如果可能的日期格式是:

dd/mm/yyyy
mm/dd/yyyy
yyyy/mm/dd
yyyy/dd/mm

考虑到日期,您应该始终能够识别年份(允许两位数的年份会使这个问题变得更加困难)。所以你应该能够按如下方式映射日期:

25/01/2011 -> UNAMBIGUOUS_DD_MM_YYYY
12/01/2011 -> AMBIGUOUS_XX_XX_YYYY
2011/03/03 -> AMBIGUOUS_YYYY_XX_XX
03/30/2011 -> UNAMBIGUOUS_MM_DD_YYYY

答案 1 :(得分:0)

如果可能,您可以要求客户传递dateformat字符串及其实际日期字符串。

即。在他们的日志文件中,他们需要再增加一列

.....,'03 / 11/2011','MM / DD / YYYY',......

答案 2 :(得分:0)

我认为您要采用的策略(即分析更大的数据集)是您可以获得的最佳策略。 从单行日志文件中你永远不会知道3/5/11是2011年5月3日还是2011年3月5日。(我想也许有可能会在2003年将其解释为5月11日的区域设置。 ..) 我前一段时间遇到过这些问题,而且我也只能通过查看数字> 12或者最快变化(必须是“day”)来尝试介绍某种上下文。但是你已经说过了自己......