470

Python で値が指定されたdatetime.time場合、整数の秒数を追加する標準的な方法はありますか?たとえば、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)

しかし、これを行うためのより簡単な方法が欠けていると思わずにはいられません。

関連している

4

10 に答える 10

630

で完全な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秒間隔で2つの値になります。

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
于 2008-09-19T07:54:39.683 に答える
68

ここで他の人が述べているように、全体で完全な日時オブジェクトを使用できます。

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 オブジェクトを time オブジェクトに追加することはできません。

于 2008-09-19T13:47:29.530 に答える
29

ちょっとしたことですが、デフォルト値を秒単位でオーバーライドして明確にすることができます

>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
于 2008-09-19T08:08:10.587 に答える
12

全体を通して完全な日時を使用することを提案してくれた @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()

とにかく、コードをわかりやすくするために、それを関数にまとめたいと思います。

于 2008-09-19T09:40:06.373 に答える
9

datetime、時間、週...

timedelta日付と時刻を操作するためのクラスがあります。datetimeマイナスdatetimeは与えるtimedeltadatetimeプラスtimedeltaは与えるdatetime、2つのdatetimeオブジェクトを追加することはできますが、2つを追加することはできません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.

于 2018-01-18T07:30:26.623 に答える
8

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

于 2011-07-27T03:49:05.383 に答える
0

にを追加してみてdatetime.datetimeくださいdatetime.timedelta。時間の部分だけが必要な場合はtime()、結果のdatetime.datetimeオブジェクトでメソッドを呼び出して取得できます。

于 2008-09-19T07:29:25.143 に答える