【问题标题】:What language has the easiest and most robust date parsing?哪种语言具有最简单和最强大的日期解析?
【发布时间】:2009-01-27 18:51:02
【问题描述】:

我知道 java 有 SimpleDateFormat,它看起来相当强大,但你需要提前知道格式才能正确使用它。
TCL的时钟扫描功能似乎是我见过的最简单最强大的。

例如时钟扫描“2009 年 1 月 8 日上午 12:33:01”将同样有效
时钟扫描“2009 年 1 月 8 日 12:33:01”

编辑:好的,消除它必须是内置功能的想法。 Perl 和 Python 是最好的吗?

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      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 
      

      【讨论】:

        【解决方案3】:

        日期的问题在于始终存在的国际化问题 - 即使是看着“1/08/2009 12:33:01 AM”的人也会确定它应该是 1 月 8 日或 8 月 1 日。'

        我已经看到日期/时间解析器可以接受大量格式,并为您提供各种选项来了解实际含义。您还可以根据区域设置为各种格式分配优先级。不幸的是我现在找不到它。它是作为 C++ 库编写的。我不知道有什么语言可以内置处理这种事情。

        【讨论】:

        • 在这种情况下你会使用 ISO8601 yyyy-mm-ddThh:mi:ss.mmm 我总是使用它
        • 但是尝试从不同的地方解析日期是绝对没用的。
        【解决方案4】:

        我喜欢 SQL Server,在 2008 年它一直达到 100 纳秒的精度

        有关所有可用样式,请参见此处:http://msdn.microsoft.com/en-us/library/ms187928.aspx

        您将使用 ISO8601 (yyyy-mm-ddThh:mi:ss.mmm) 这是不依赖于语言或区域设置的安全格式之一

        【讨论】:

        • 我更多地考虑通用脚本或编程语言。
        【解决方案5】:

        Java 的SimpleDateFormat 做得很好。是的,我知道,这不是自动的,但为什么会这样呢? IMO 猜测确切的值总是不好的做法。

        【讨论】:

        • 猜测是不好的做法?这不取决于具体情况吗?我的意思是,如果你有这种能力,你要么强制输入掩码,要么你必须知道你正在解析的数据。要么是语言本身,要么是开发者,是吗?
        猜你喜欢
        • 1970-01-01
        • 2010-09-13
        • 2012-07-18
        • 2013-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        相关资源
        最近更新 更多