هل هناك أي طريقة لاستخدام وظيفة تشبه STRFTIME للتواريخ قبل 1900 في بيثون؟

StackOverflow https://stackoverflow.com/questions/1643967

سؤال

لم أكن أدرك هذا، ولكن على ما يبدو وظيفة 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، ولكن هناك الكثير من الاختلاف. وبعبارة أخرى، قد تكون أو لا تكون ميكروثانية أو قد أو قد لا يكون لها توقيت. هل هناك أي حل لهذا؟

إذا أنه يحدث فرقا، وأنا أفعل هذا حتى أستطيع أن إرسال البيانات إلى ملف نصي وتحميله في قاعدة بيانات باستخدام أوراكل SQL * لودر.

وانتهى الأمر به أساسا الجواب أليكس مارتيلي و. وهنا تنفيذ أكثر اكتمالا:

>>> 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(' ').

هل كانت مفيدة؟

المحلول

isoformat يعمل على الحالات datetime ث / س الحد من نطاق:

>>> 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، مع نقطة وميكروثانية التالية حذفت إذا ميكروثانية صفر).

نصائح أخرى

mxDateTime يمكن معالجة التواريخ التعسفية. استخدام time وdatetime حدات بايثون 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

وهذا من في مصدر 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)

وهذا هو "ميزة" من مكتبة ctime (UTF). أيضا قد يكون لديك مشكلة فوق 2038.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top