[python] Python에서 datetime.time에 N 초를 추가하는 표준 방법은 무엇입니까?

datetime.timePython 에 값이 주어지면 정수 초를 추가하는 표준 방법이 있습니까? 예를 들어 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


답변

여기에 다른 사람들이 말했듯이 전체 날짜 시간 객체를 사용할 수 있습니다.

from datetime import datetime, date, time, timedelta
sometime = time(8,00) # 8am
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산술 기능으로 확장 되는 작은 클래스를 작성했습니다 . 자정이 지나면 0이됩니다. 이제 “현재 몇시, 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(파이썬의 날짜와 시간이 더 낫습니다).

sometime = arrow.now()
abitlater = sometime.shift(seconds=3)