문제

주어진 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.datetimedatetime.timedelta.시간 부분만 원하는 경우 다음을 호출할 수 있습니다. time() 결과에 대한 방법 datetime.datetime 그것을 얻기 위해 반대합니다.

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