Python에서 datetime.time에 N초를 추가하는 표준 방법은 무엇입니까?
문제
주어진 datetime.time
Python의 값에 정수 초를 추가하는 표준 방법이 있습니까? 11:34:59
+ 3 = 11:35:02
, 예를 들어?
이러한 명백한 아이디어는 작동하지 않습니다.
>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
결국 나는 다음과 같은 함수를 작성했습니다.
def add_secs_to_time(timeval, secs_to_add):
secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
secs += secs_to_add
return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
그래도 이 작업을 수행하는 더 쉬운 방법이 누락되었다고 생각하지 않을 수 없습니다.
관련된
해결책
전체를 사용할 수 있습니다. datetime
변수 timedelta
, 그리고 더미 날짜를 제공한 다음 다음을 사용하여 time
시간 가치를 얻으려면.
예를 들어:
import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()
3초 간격으로 두 값이 생성됩니다.
11:34:59
11:35:02
더 읽기 쉬운 것을 선택할 수도 있습니다
b = a + datetime.timedelta(seconds=3)
당신이 그렇게 생각한다면.
이 작업을 수행할 수 있는 함수를 찾고 있다면 다음을 사용해 볼 수 있습니다. addSecs
아래에:
import datetime
def addSecs(tm, secs):
fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
fulldate = fulldate + datetime.timedelta(seconds=secs)
return fulldate.time()
a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b
이는 다음을 출력합니다:
09:11:55.775695
09:16:55
다른 팁
여기의 다른 사람들이 언급했듯이 다음 전체에서 전체 날짜/시간 객체를 사용할 수 있습니다.
sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()
그러나 전체 날짜/시간 개체가 필요한 이유를 설명하는 것은 가치가 있다고 생각합니다.오후 11시에 2시간을 추가하면 어떻게 될지 생각해 보세요.올바른 행동은 무엇입니까?오후 11시 59분보다 더 많은 시간을 가질 수 없기 때문에 예외인가요?다시 포장해야 합니까?
프로그래머마다 기대하는 바가 다르기 때문에 그들이 선택한 결과가 무엇이든 많은 사람들을 놀라게 할 것입니다.더 나쁜 것은 프로그래머가 처음 테스트할 때는 잘 작동하는 코드를 작성했지만 나중에 예상치 못한 작업을 수행하여 코드가 중단되는 경우가 있다는 것입니다.이는 매우 나쁜 일이므로 timedelta 객체를 시간 객체에 추가하는 것이 허용되지 않습니다.
한 가지 작은 점은 몇 초 동안 기본값을 재정의하기 위해 명확성을 추가할 수 있습니다.
>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
전체 날짜 시간 사용을 제안한 @Pax Diablo, @bvmou 및 @Arachnid에게 감사드립니다.외부 소스에서 datetime.time 객체를 허용해야 한다면 이것이 대안인 것 같습니다. add_secs_to_time()
기능:
def add_secs_to_time(timeval, secs_to_add):
dummy_date = datetime.date(1, 1, 1)
full_datetime = datetime.datetime.combine(dummy_date, timeval)
added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
return added_datetime.time()
이 장황한 코드는 다음과 같이 한 줄로 압축할 수 있습니다.
(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()
하지만 어쨌든 코드 명확성을 위해 함수로 마무리하고 싶다고 생각합니다.
프로젝트에 다른 파일/종속성을 추가할 가치가 있다면 확장되는 작은 클래스를 방금 작성했습니다. datetime.time
산수를 할 수 있는 능력을 가지고 있습니다.자정이 지나면 영하로 돌아갑니다.이제 "지금부터 24시간은 몇시일까요?"에는 일광 절약 시간, 윤초, 과거 시간대 변경 등을 포함한 많은 코너 케이스가 있습니다.그러나 가끔은 간단한 케이스가 꼭 필요한 경우가 있는데, 이것이 바로 이것이다.
귀하의 예는 다음과 같이 작성됩니다.
>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)
nptime
~로부터 상속받다 datetime.time
, 따라서 이러한 방법 중 하나도 사용할 수 있어야 합니다.
PyPi에서 다음과 같이 사용할 수 있습니다. nptime
("비현학적 시간") 또는 GitHub에서: https://github.com/tgs/nptime
단순히 숫자를 추가할 수는 없습니다. datetime
어떤 단위가 사용되는지 불분명하기 때문입니다.초, 시간, 주...
있다 timedelta
날짜와 시간을 조작하는 클래스입니다. datetime
마이너스 datetime
준다 timedelta
, datetime
...을 더한 timedelta
준다 datetime
, 둘 datetime
두 개라도 개체를 추가할 수 없습니다. timedelta
할 수 있다.
만들다 timedelta
추가하고 추가하려는 시간(초)이 포함된 개체 datetime
물체:
>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)
C++에도 동일한 개념이 있습니다. std::chrono::duration
.
완전성을 위해 다음과 같이 수행하는 방법이 있습니다. arrow
(Python의 경우 더 나은 날짜와 시간):
sometime = arrow.now()
abitlater = sometime.shift(seconds=3)
추가해 보세요 datetime.datetime
에 datetime.timedelta
.시간 부분만 원하는 경우 다음을 호출할 수 있습니다. time()
결과에 대한 방법 datetime.datetime
그것을 얻기 위해 반대합니다.