어떤 방법을 사용하 strftime 같은 기능을 위해 날짜기 전에는 1900 년에는 파이썬?
-
10-07-2019 - |
문제
지 않았다는 이것을 깨닫지만,분명히 파이썬'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 의 time
고 datetime
모듈을 사용하여 내부적으로 유닉스 타임 스탬프,그 이유는 그들이 제한된 범위에 있습니다.
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 년 이상 문제가있을 수 있습니다.