내일 날짜를 얻는 가장 깨끗하고 파이썬적인 방법?


120

내일 날짜를 얻는 가장 깨끗하고 파이썬적인 방법은 무엇입니까? 하루에 하나를 추가하거나 월말에 일을 처리하는 것보다 더 나은 방법이 있어야합니다.

답변:



39

timedelta 일, 초, 마이크로 초, 밀리 초, 분, 시간 또는 주 추가를 처리 할 수 ​​있습니다.

>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2009, 10, 1)
>>> today + datetime.timedelta(days=1)
datetime.date(2009, 10, 2)
>>> datetime.date(2009,10,31) + datetime.timedelta(hours=24)
datetime.date(2009, 11, 1)

의견에서 질문했듯이 윤일에는 문제가 없습니다.

>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1)
datetime.date(2004, 2, 29)
>>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2)
datetime.date(2004, 3, 1)
>>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1)
datetime.date(2005, 3, 1)

7

윤초 처리 없음 tho :

>>> from datetime import datetime, timedelta
>>> dt = datetime(2008,12,31,23,59,59)
>>> str(dt)
'2008-12-31 23:59:59'
>>> # leap second was added at the end of 2008, 
>>> # adding one second should create a datetime
>>> # of '2008-12-31 23:59:60'
>>> str(dt+timedelta(0,1))
'2009-01-01 00:00:00'
>>> str(dt+timedelta(0,2))
'2009-01-01 00:00:01'

꿰매다.

편집-@Mark : 문서는 "예"라고 말하지만 코드는 "별로"라고 말합니다.

>>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")
(2008, 12, 31, 23, 59, 60, 2, 366, -1)
>>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
1230789600.0
>>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 6, 0, 0, 3, 1, 0)
>>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
(2009, 1, 1, 0, 0, 0, 3, 1, 0)

나는 gmtime 또는 localtime이 mktime에 의해 반환 된 값을 취하고 60 초를 사용하여 원래 튜플을 돌려 준다고 생각합니다. 그리고이 테스트는이 윤초가 사라질 수 있음을 보여줍니다.

>>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
>>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S"))
>>> a,b
(1230789600.0, 1230789600.0)
>>> b-a
0.0


이것은 유닉스 시간이 윤초를 처리하지 않기 때문입니다. en.wikipedia.org/wiki/Unix_time#History , mail-archive.com/leapsecs@rom.usno.navy.mil/msg00094.html 및 POSIX 자체를 참조하십시오 .

"매일 정확히 86400 초로 계산됩니다." opengroup.org/onlinepubs/9699919799/basedefs/…

윤년은 태양 년과 심지어 365 일의 차이를 설명하는 반면 윤초는 본질적으로 다르며 지진과 같은 외부 요인으로 인한 차이를 설명합니다. 이것은 그것들을 불규칙하게 만들고 2055 년 3 월 3 일이 도착할 요일을 결정하는 것과 같은 방식으로 결정할 수 없습니다.
David Woods

1
@DavidWoods : 윤초는 UTC를 UT1 (지구 회전)에서 +/- 0.9 초 이내로 유지하는 것입니다. 1972 년부터 2012 년까지 25 번의 윤초가 누적되어 있습니다. 지진은 너무 약해서이를 유발할 수 없습니다 ( 한 번의 지진으로 인해 마이크로 초 변화가 발생할 수 있습니다. 하루 지속 시간의 일반적인 밀리 초 차이 (86400 SI 초 ) 보다 천 배 적음 ).
jfs 2014 년

5

기본 time모듈도이를 처리 할 수 ​​있습니다.

import time
time.localtime(time.time() + 24*3600)

1
이는 미국의 일광 절약 시간 경계에서는 실패합니다. 그 경계에서는 하루가 23 시간이고 하루가 25 시간이기 때문입니다. 이것은 또한 윤초를 고려하지 않습니다.
Charles Wood

@CharlesWood :이 답변은 (일부 시간대에서) 다른 날짜 (내일이 아님)를 반환 할 수 있음을 의미하는 다른 시간을 반환 할 수 있지만 항상 정확히 24 시간 앞선 시간을 반환합니다 (승인 된 답변은 자정 (지금부터 알 수없는 시간)을 반환합니다. )). 23:59:60과 00:00:00이 동일한 타임 스탬프를 갖는 시스템에서 윤초 동안 호출되지 않는 한 윤초가 여기서 결과를 어떻게 변경할 수 있는지 알 수 없습니다.
jfs 2014 년

사실 지금부터는 항상 24 시간이 걸리지 만 그게 문제가 아니 었습니다. OP는 내일 날짜 를 얻는 방법을 알고 싶었습니다 . 윤초 문제는 그냥 nitpicking이었습니다;)
Charles Wood

@CharlesWood : 네. 23, 25 시간이 반환되지 않는다는 것을 방금 명확히했습니다. 예, 잘못된 날짜를 반환 할 수 있습니다 (예 : "브라질 / 동부"시간대의 "2014-10-18 23:00:00"의 경우 내일이 아님). 관련성 : UTC로 현재 시간을 감안할 때 특정 시간대에서 하루의 시작 및 종료 시간을 어떻게 결정합니까? .
jfs 2014 년

@JFSebastian 맞아요, 하루가 항상 24 시간이 아니라는 점을 지적하려고했습니다 . 날짜 작업이 그렇게 어려운 것은 당연합니다. 그들에 대한 의사 소통조차 어렵습니다. : /
Charles Wood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.