어떤 방법을 사용하 strftime 같은 기능을 위해 날짜기 전에는 1900 년에는 파이썬?

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

문제

지 않았다는 이것을 깨닫지만,분명히 파이썬's 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 기능는 이유가있다(그리고 거기에 또한 이유 그것을 지원할 수 없 pre-1900 날짜).내가 필요할 수 있 날짜를 지원하기 1900.나는 그냥 사용 str, 지만,너무 많은 변화이다.다시 말해서,그것은 있지 않을 수 있습 마이크로초 단위로 또는 그것지 않을 수도 있습는 타임존도 있습니다.은 거기에 모든 솔루션을 이?

는 경우에 분명한 차이를 느낄 수 있습니다,나는 이 일을 할 수 있도록 데이터를 쓰기 텍스트 파일로 로드하는 데이터베이스를 사용하여 Oracle 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, 마이크로 초가 0 인 경우 점과 마이크로 초를 따르는 마이크로 초의 경우).

다른 팁

그만큼 문서화는 이것에 대해 매우 명확하게 보입니다.

정확한 해의 범위 strftime() 작품은 플랫폼마다 다릅니다. 플랫폼에 관계없이 1900 년 전 몇 년 전 사용할 수 없습니다.

따라서 사용하는 솔루션이 없습니다. strftime(). 운 좋게도 "손으로"이것을하는 것은 매우 간단합니다.

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

mxDateTime 처리할 수 있는 임의의합니다.Python 의 timedatetime 모듈을 사용하여 내부적으로 유닉스 타임 스탬프,그 이유는 그들이 제한된 범위에 있습니다.

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)

이것은 CTIM 라이브러리 (UTF)의 "기능"입니다. 또한 2038 년 이상 문제가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top