关于 java:您将如何以编程方式从存储在字符串中的日期创建模式?

关于 java:您将如何以编程方式从存储在字符串中的日期创建模式?

How Would You Programmatically Create a Pattern from a Date that is Stored in a String?

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

2006 年 11 月 30 日星期四 19:00:00 EST

我正在尝试使用 SimpleDateFormat 创建一个 Date 对象,但遇到了 2 个问题。

1.) 我无法找出将解决方案硬编码到 SimpleDateFormat 构造函数中的模式

2.) 我找不到一种方法可以使用 API 解析字符串以确定模式,因此我可以将其重用于不同的日期输出模式

如果有人知道使用 API 的解决方案或自定义解决方案,我将不胜感激。


可以在 http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html 中查找要传递给 SimpleDateFormat 的格式

1
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

至于你的第二个问题,我不知道有任何 Java 库可以在事先不知道格式是什么的情况下找出日期格式并对其进行解析。


POJava 日期解析器 org.pojava.datetime.DateTime 是一个不可变且强大的解析器,支持多种语言、时区和格式。

最重要的是,解析器是启发式的,不需要预先存在的a€?formata€?去工作。您只需将日期/日期时间文本字符串传递给它,然后得到一个 java.util.Date!


请参阅 Apache Commons\\' DateUtils。有一个 parseDate 方法可以让你的 String 和多个模式尝试并吐出一个 Date 实例。


值得知道您给出的日期格式不是任意的。它是内置 Date.toString() 方法的输出(至少在英国和美国地区)。并非巧合,它也是 unix \\'date\\' 命令的格式(至少在 linux 上,我也相信其他实现) - 虽然是迂腐的,但 Date.toString() 用一个数字填充一个数字零,而 unix 日期没有。

这意味着当您将未格式化的日期输出到用户可修改的字段(例如 HTML INPUT 字段)并在未修改的情况下接收回来时,您可能会收到这种输入格式。所以仅仅因为输入以这种格式出现,并不意味着用户会输入一千种其他任意格式。

当然,他们仍然可能。我处理日期输入的一般方式是使用一堆 try/catch 块,我在其中尝试一种格式,然后是另一种格式,然后是另一种格式。默认情况下,我们的标准框架现在最多有 20 种不同的格式。当然,它仍然不完美;前几天我发现有人输入"03 Sept"作为日期(非标准月份缩写,没有年份),但我们没有处理这种情况。


如果你想做除了解析或格式化日期之外的任何事情,那么处理模式本身的方法并不多。前一段时间,我正在编写一个 Swing 组件,用于将日期输入到格式化的文本字段中。您提供了一个模式,它通过该模式的元素移动文本输入光标,只允许有效值。

作为其中的一部分,我编写了一个 DateFormatParser,可在此处获得,作为 OpenHarmonise 开源项目的一部分。

将日期解析为模式将是一个非常有趣的问题。您必须做出某些假设(例如使用 : in time 而不是 date),但您将面临 2 位数年和日/月或月/日安排的永恒问题。


我不确定是否有任何简单的方法可以解析日期并计算出它的模式,但我原以为您发布的模式是:

EEE MMM dd HH:mm:ss zzz yyyy


我必须说我觉得另一个问题很有趣。但是有一个严重的问题 - 解析这个:08/07/06!如果您将自己限制在预期格式的子集上,您可能可以通过使用正则表达式来解决问题,您可以构建一堆预期的模式,然后在空格或其他任何地方打破字符串,并逐部分匹配。


正如其他人所说,模式看起来应该是

1
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

至于解析任意格式的日期,我不知道有任何库在 Java 中执行此操作。如果你热衷于开发这样的东西,我会从 perl str2time 函数开始。


这并不完全一样,但您可能想看看 JChronic 之类的东西,它可以对日期进行自然语言处理。因此,输入日期可能类似于"明天"或"从下周二开始的两周"。

这可能对您的应用程序毫无帮助,但话又说回来,它可能会。


怎么样:

EEE MMM dd HH:mm:ss zzz yyyy

只需将字符串传递给 SimpleDateFormat 的构造函数即可。要使用该对象,只需调用传入要转换为 Date 的字符串的 parse 方法。

你可以看看:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html


您只是在询问给定日期的模式吗?如果是这样,我认为应该这样做:

1
"EEE MMM d HH:mm:ss z yyyy"

或者您是否尝试获取任何格式化的日期,并推断格式并解析它?


推荐阅读

    linux命令模式全屏?

    linux命令模式全屏?,系统,工具,电脑,数据,位置,命令,虚拟机,分辨率,字符串,

    linux中回到命令模式?

    linux中回到命令模式?,系统,密码,情况,状态,终端,环境,信息,首页,界面,命令,

    linux怎么用命令模式?

    linux怎么用命令模式?,工作,地址,系统,信息,管理,命令,目录,情况,图形界面,

    linux切换日期命令?

    linux切换日期命令?,时间,系统,信息,命令,城市,终端,时分,日期,窗口,操作系

    linux终端命令行编程?

    linux终端命令行编程?,系统,工作,命令,终端,概念,时间,第一,代码,发行,地方,L

    linux插入命令模式?

    linux插入命令模式?,工作,系统,地址,管理,信息,时间,命令,目录,平均,项目,Lin

    命令行模式登陆linux?

    命令行模式登陆linux?,密码,系统,工作,信息,终端,环境,状态,地址,工具,服务,l

    linux打开命令模式?

    linux打开命令模式?,系统,密码,管理,情况,终端,命令,工具,信息,地方,电脑,LIN

    linux编程调用命令?

    linux编程调用命令?,系统,标准,管理,工作,基础知识,情况,环境,设备,基础,首

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux编程所需的命令?

    linux编程所需的命令?,工作,地址,档案,系统,命令,管理,标准,信息,目录,文件,L

    linux纯命令模式切换?

    linux纯命令模式切换?,系统,密码,状态,电脑,网络,信息,模式,命令,情况,地方,L

    linux命令行编程乱码?

    linux命令行编程乱码?,环境,统一,乱码,中文,状态,软件,数据,系统,字符集,文

    linux命令底行模式?

    linux命令底行模式?,系统,地址,工作,命令,管理,时间,信息,模式,控制台,图形

    linux修改日期命令?

    linux修改日期命令?,时间,系统,命令,信息,工具,工作,服务,代码,日期,终端,lin

    linux打印日期命令?

    linux打印日期命令?,时间,系统,工作,命令,标准,环境,档案,信息,设备,位置,Lin

    linux基本命令日期?

    linux基本命令日期?,时间,系统,命令,管理,工作,网络,工具,基础,标准,环境,详

    linux中进入命令模式?

    linux中进入命令模式?,系统,服务,信息,命令,终端,情况,地址,模式,数据库,选

    linux纯命令行模式?

    linux纯命令行模式?,系统,软件,手机,分析,设计,代码,工具,地方,密码,网络,网

    linux改为命令行模式?

    linux改为命令行模式?,系统,电脑,密码,网络,工作,状态,模式,命令,信息,工具,l