有没有办法在Python中使用日期的的strftime般的功能在1900年之前?(Is there

2019-09-02 06:00发布

我没有意识到这一点,但显然Python的strftime功能并不在1900年之前支持日期:

>>> from datetime import datetime
>>> d = datetime(1899, 1, 1)
>>> d.strftime('%Y-%m-%d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year=1899 is before 1900; the datetime strftime() methods require year >= 1900

我敢肯定,我可以砍起来自己的东西要做到这一点,但我想的strftime功能是有原因的(有也就是为什么它不能支持1900前日期的原因)。 我需要能够支持1900年之前,我只用日期str ,但有太多的变化。 换句话说,它可以或可以不具有微秒或者其可以或可以不具有一个时区。 有没有解决这个?

如果它的确与众不同,我这样做,这样我可以把数据写入到一个文本文件并将其加载到使用Oracle SQL * Loader的数据库。

我基本上结束了做亚历克斯·马尔泰利的答案。 下面是一个更完整的实现:

>>> from datetime import datetime
>>> d = datetime.now()
>>> d = d.replace(microsecond=0, tzinfo=None)
>>> str(d)
'2009-10-29 11:27:27'

唯一的区别是, str(d)相当于d.isoformat(' ')

Answer 1:

isoformat适用于datetime实例的w / o的范围不限于:

>>> import datetime
>>> x=datetime.datetime(1865, 7, 2, 9, 30, 21)
>>> x.isoformat()
'1865-07-02T09:30:21'

如果你需要一个不同的格式字符串这不是太难切片,切块和你得到字符串的混音作品isoformat ,这是非常一致( YYYY-MM-DDTHH:MM:SS.mmmmmm ,由点及以下微秒省略如果微秒是零)。



Answer 2:

该文件似乎这个非常清楚:

多年的确切范围其中strftime()的作品也跨平台的不同而不同。 不管是什么平台的,不能用1900年之前。

所以不会是使用的解决方案strftime() 幸运的是,这是非常简单的这种“手动”的事情:

>>> "%02d-%02d-%02d %02d:%02d" % (d.year,d.month,d.day,d.hour,d.minute)
'1899-01-01 00:00'


Answer 3:

mxDateTime能够处理任意日期。 Python的timedatetime模块使用UNIX内部时间戳,这就是为什么他们有有限的范围内。

In [5]: mx.DateTime.DateTime(1899)
Out[5]: <mx.DateTime.DateTime object for '1899-01-01 00:00:00.00' at 154a960>

In [6]: DateTime.DateTime(1899).Format('%Y-%m-%d')
Out[6]: 1899-01-01


Answer 4:

这是从matplotlib源 。 可以提供滚动自己一个很好的起点。

def strftime(self, dt, fmt):
    fmt = self.illegal_s.sub(r"\1", fmt)
    fmt = fmt.replace("%s", "s")
    if dt.year > 1900:
        return cbook.unicode_safe(dt.strftime(fmt))

    year = dt.year
    # For every non-leap year century, advance by
    # 6 years to get into the 28-year repeat cycle
    delta = 2000 - year
    off = 6*(delta // 100 + delta // 400)
    year = year + off

    # Move to around the year 2000
    year = year + ((2000 - year)//28)*28
    timetuple = dt.timetuple()
    s1 = time.strftime(fmt, (year,) + timetuple[1:])
    sites1 = self._findall(s1, str(year))

    s2 = time.strftime(fmt, (year+28,) + timetuple[1:])
    sites2 = self._findall(s2, str(year+28))

    sites = []
    for site in sites1:
        if site in sites2:
        sites.append(site)

    s = s1
    syear = "%4d" % (dt.year,)
    for site in sites:
        s = s[:site] + syear + s[site+4:]

    return cbook.unicode_safe(s)


Answer 5:

这是的ctime库(UTF)的“功能”。 你也可以有以上2038问题。



文章来源: Is there any way to use a strftime-like function for dates before 1900 in Python?