Java中日期的识别与解析

Java中日期的识别与解析,java,parsing,date-format,Java,Parsing,Date Format,我知道这个话题并不新鲜,不过我得再把它挖掘出来。 我已经在网上搜索了很多次(包括stackoverflow上的一些帖子),但到目前为止还没有找到满意的答案 (我查了一下 和 我目前正在用Java编写一个Dateparser,它接受一个日期并生成一个格式字符串,SimpleDataFormat可以使用它来解析日期 日期是通过regex从日志文件(IBM Websphere、Tomcat、Microsoft Exchange等)解析的(是的,这是一个丑陋的xD)。因为我们有(至少2)个不同地区的客

我知道这个话题并不新鲜,不过我得再把它挖掘出来。 我已经在网上搜索了很多次(包括stackoverflow上的一些帖子),但到目前为止还没有找到满意的答案

(我查了一下 和

我目前正在用Java编写一个Dateparser,它接受一个日期并生成一个格式字符串,SimpleDataFormat可以使用它来解析日期

日期是通过regex从日志文件(IBM Websphere、Tomcat、Microsoft Exchange等)解析的(是的,这是一个丑陋的xD)。因为我们有(至少2)个不同地区的客户,所以无法简单地将字符串“抛出”SimpleDataFormat的解析方法,并期望它正常工作

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

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

然后,该“子集”将用于尝试解析指定软件的日志文件。 (子集存储在HashMap中的HashMap中,格式为 HashMap>map; 整数键是formatstring的长度,第二个Hashmap的字符串键指定仅包含分隔字符的datesignature。 (即“:”格式为“dd.MM.yyyy 11:11:11.111”的日期)

我还考虑了数字的值,即大于12的数字必须是一天,因为没有第13个月。但这仅适用于晚于12个月的日期字符串

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

我已经坚持了将近3个月了

欢迎提出任何建议=)

编辑:

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

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

我现在的解决方案是完全扔掉字符串中日期的一半,插入一个具有预定义格式的虚拟日期。只有当小时和分钟接近23:59时,日期才需要更改。 之后的原始日期显示在图表上,下面是“假数据”

感谢大家的建议和反馈=)
(我希望我的英语到目前为止是可以理解的;)

如果可能的话,您可以要求客户将dateformat字符串与实际的日期字符串一起传递

i、 e.在他们的日志文件中,他们需要多出一列


2011年11月3日、年月日……

我的建议是将所有日期存储为“不明确”,直到可以解决不明确的问题。(这假设特定客户将始终以相同的格式提供数据。)一旦您从客户处获得一份日志,您可以明确地确定该日志的日期格式,您就可以将该格式追溯应用于以前的文件

要做到这一点,您需要一个表,将每个客户映射到他们的日期格式,并使用一些标记(例如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

我认为你所采用的策略(即分析更大的数据集)是你能得到的最佳策略。 从一行日志文件中,你永远不会知道3/5/11是2011年5月3日还是2011年3月5日。(我想也有一些地方可能会将此解释为2003年5月11日……)
不久前我自己也遇到了这些问题,我也只能通过查看大于12的数字或变化最快的内容(必须是“天”)来尝试引入某种上下文。但是你已经说过你自己…

。。。大于12的数字必须是一天,因为没有第13个月。-我不想给你们的游行泼冷水,但有些日历上有十三个月。我自己对使用这些“公理”(即说“Digit>12=Day”的规则)不太满意,但对于这条规则,我可以保证给定的数据总是以12是当月最高值的形式表示-