【发布时间】:2009-01-27 18:51:02
【问题描述】:
我知道 java 有 SimpleDateFormat,它看起来相当强大,但你需要提前知道格式才能正确使用它。
TCL的时钟扫描功能似乎是我见过的最简单最强大的。
例如时钟扫描“2009 年 1 月 8 日上午 12:33:01”将同样有效
时钟扫描“2009 年 1 月 8 日 12:33:01”
编辑:好的,消除它必须是内置功能的想法。 Perl 和 Python 是最好的吗?
【问题讨论】:
我知道 java 有 SimpleDateFormat,它看起来相当强大,但你需要提前知道格式才能正确使用它。
TCL的时钟扫描功能似乎是我见过的最简单最强大的。
例如时钟扫描“2009 年 1 月 8 日上午 12:33:01”将同样有效
时钟扫描“2009 年 1 月 8 日 12:33:01”
编辑:好的,消除它必须是内置功能的想法。 Perl 和 Python 是最好的吗?
【问题讨论】:
Python 没有内置库,但出色的 dateutil 库提供了一个非常适合的 parse() 方法。
从简单(假设今天是 9/25):
>>> parse("Thu Sep 25 2003")
datetime.datetime(2003, 9, 25, 0, 0)
>>> parse("Sep 25 2003")
datetime.datetime(2003, 9, 25, 0, 0)
>>> parse("Sep 2003", default=DEFAULT)
datetime.datetime(2003, 9, 25, 0, 0)
>>> parse("Sep", default=DEFAULT)
datetime.datetime(2003, 9, 25, 0, 0)
>>> parse("2003", default=DEFAULT)
datetime.datetime(2003, 9, 25, 0, 0)
模棱两可:
>>> parse("10-09-2003")
datetime.datetime(2003, 10, 9, 0, 0)
>>> parse("10-09-2003", dayfirst=True)
datetime.datetime(2003, 9, 10, 0, 0)
>>> parse("10-09-03")
datetime.datetime(2003, 10, 9, 0, 0)
>>> parse("10-09-03", yearfirst=True)
datetime.datetime(2010, 9, 3, 0, 0)
致全体员工:
>>> parse("Wed, July 10, '96")
datetime.datetime(1996, 7, 10, 0, 0)
>>> parse("1996.07.10 AD at 15:08:56 PDT", ignoretz=True)
datetime.datetime(1996, 7, 10, 15, 8, 56)
>>> parse("Tuesday, April 12, 1952 AD 3:30:42pm PST", ignoretz=True)
datetime.datetime(1952, 4, 12, 15, 30, 42)
>>> parse("November 5, 1994, 8:15:30 am EST", ignoretz=True)
datetime.datetime(1994, 11, 5, 8, 15, 30)
>>> parse("3rd of May 2001")
datetime.datetime(2001, 5, 3, 0, 0)
>>> parse("5:50 A.M. on June 13, 1990")
datetime.datetime(1990, 6, 13, 5, 50)
在此处查看相关文档:
http://labix.org/python-dateutil#head-c0e81a473b647dfa787dc11e8c69557ec2c3ecd2
【讨论】:
Perl 的 Date::Parse 模块(我不知道它可以被认为是语言的内置模块,但它是一个 CPAN 模块,所以对我来说已经足够好了)在数据转换项目上为我节省了无数时间。来自文档(http://metacpan.org/pod/Date::Parse):
Below is a sample list of dates that are known to be parsable with Date::Parse:
1995:01:24T09:08:17.1823213 ISO-8601
1995-01-24T09:08:17.1823213
Wed, 16 Jun 94 07:29:35 CST Comma and day name are optional
Thu, 13 Oct 94 10:13:13 -0700
Wed, 9 Nov 1994 09:50:32 -0500 (EST) Text in ()'s will be ignored.
21 dec 17:05 Will be parsed in the current time zone
21-dec 17:05
21/dec 17:05
21/dec/93 17:05
1999 10:02:18 "GMT"
16 Nov 94 22:28:20 PST
【讨论】:
日期的问题在于始终存在的国际化问题 - 即使是看着“1/08/2009 12:33:01 AM”的人也会确定它应该是 1 月 8 日或 8 月 1 日。'
我已经看到日期/时间解析器可以接受大量格式,并为您提供各种选项来了解实际含义。您还可以根据区域设置为各种格式分配优先级。不幸的是我现在找不到它。它是作为 C++ 库编写的。我不知道有什么语言可以内置处理这种事情。
【讨论】:
我喜欢 SQL Server,在 2008 年它一直达到 100 纳秒的精度
有关所有可用样式,请参见此处:http://msdn.microsoft.com/en-us/library/ms187928.aspx
您将使用 ISO8601 (yyyy-mm-ddThh:mi:ss.mmm) 这是不依赖于语言或区域设置的安全格式之一
【讨论】:
Java 的SimpleDateFormat 做得很好。是的,我知道,这不是自动的,但为什么会这样呢? IMO 猜测确切的值总是不好的做法。
【讨论】: