PythonでUTC時間を取得する方法は?


112

StackExchangeで束を探して解決策を探しましたが、必要なことをまったく実行できません。JavaScriptでは、1970年1月1日からのUTC時間を計算するために以下を使用しています。

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

同等のPythonコードは何でしょうか?



待って、PythonかJavaScriptを使っていますか?
CheetSheatOverlode

回答:


178

datetime.utcnow()を使用する次のコードを試してください。

from datetime import datetime
datetime.utcnow()

2つの日付の間に費やす時間を計算する必要がある場合の目的は、終了日と開始日を引くことだけです。そのような減算の結果は減算 timedeltaオブジェクトです。

Pythonドキュメントから:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

つまり、デフォルトでは、定義で言及されているフィールド(日、秒、マイクロ秒、ミリ秒、分、時間、週)を取得できます。また、timedeltaインスタンスには、次のようなtotal_seconds()メソッドがあります。

期間に含まれる合計秒数を返します。(td.microseconds +(td.seconds + td.days * 24 * 3600)* 10 * 6)/ 10 * 6に相当し、真の除算を有効にして計算されます。


2
datetime.utcnow()についての厄介な驚きは、名前にもかかわらずタイムゾーン対応オブジェクトを返さないことです。これは私の意見では大きな問題です。そのため、私は以下の私の答えを好みます。「タイムゾーンのないdatetimeオブジェクトは、アプリケーションの「バグ」と見なされます。」を参照してください。 julien.danjou.info/python-and-timezones
Tim Richardson

1
いわゆるナイーブ日時オブジェクト(つまり、タイムゾーン情報が設定されていない)の概念には目的があります。目覚まし時計を、世界のどこにいても毎日06:00:00に鳴らしたいのです。また、たとえばコンピュータゲームで「仮想時計」を使用できるようになりました。今、私のファンタジーの世界では午後5時です。datetimeオブジェクトにタイムゾーンを強制すると、特にtimedelta演算では、扱いにくくなります。
DustByte

42

オリジナルに最も近い形で:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

ネイティブPythonではなく、1970-01-01からの秒数を知る必要がある場合datetimeは、代わりにこれを使用してください:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Pythonは見、あなたはJavascriptでに使用されるかもしれないものと対立している命名規則たPEP 8を。また、別の関数の結果を単に返す関数は、かなりばかげています。アクセスしやすくするだけの場合は、単に割り当てることで、関数に別の名前を付けることができます。上記の最初の例は、次のように置き換えることができます。

utc_now = datetime.datetime.utcnow

1
私はあなたの答えが上からのより高い評価のものよりも好きです。ここに深みをありがとう。
ジョーダンディアマトソン2013

@ジョーダン、私の答えを振り返って、インポートをグローバルレベルではなく関数内に配置することでスタイルの間違いを犯したことに気づきました。これを修正します。
Mark Ransom

8
たぶん、別の関数でUtcNow()をラップすることを検討する必要があります。単純すぎる。また、アンダースコアは使用しないでください。PEP 8はとても退屈です...
vcarel 2014年

1
確かに、単純な1行を返す関数を記述する必要はありません... datetime.datetime.utcnow()
cpreid

1
@TimRichardson同意しませんが、この回答が書かれた時点では代替手段はありませんでした-UTCのtzinfo場合でも、Pythonにはオブジェクトが含まれていませんでした。
Mark Ransom

31

最新のpython用のシンプルな標準ライブラリのみ。とは異なり、タイムゾーンに対応した日時を提供しdatetime.utcnow()ます。datetimesタイムゾーンがないと、事故が起こるのを待っています。

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

4
Python 3のドキュメントによると、これは推奨される方法です。
roskakori

清潔で簡単!推奨される方法である必要があります。
Marry35

21
import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

10

datetime.datetimeから、strftimeメソッドを使用してタイムスタンプにエクスポートできます。あなたの関数の例に従ってください:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

マイクロ秒が必要な場合は、次のようにエクスポート文字列を変更し、浮動小数点数にキャストする必要があります。 return float(now.strftime("%s.%f"))


文字列に変換し、数値を直接取得できるときに数値に戻す意味は何ですか?
Mark Ransom 2017年

重要なのは、関数の設定を変更したい場合があるため、を使用せずにdatetimeオブジェクトに固執するtime.time()ことです。time.mktime(now.timetuple())を使用して直接intに変換することもできます。とにかく、この単純なケースtime.time()でも有効なオプションです。私が奇妙だと思うのは、timedeltaを使って秒を見つけることです。
hectorcanto 2017年

これstrftime("%s")はプラットフォームに依存し、Windowsでは機能しないことに注意してください。(少なくともWindows 10では私には適していません)。
Julian Kirsch

8

外部依存関係なしでタイムゾーンを認識:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

-4

ラムダ式を使用するPython 3で試してください。

from datetime import datetime
utc_now = lambda : datetime.utcnow()

そして、関数を通常どおり呼び出します。

print(utc_now())

2
キッズ・ナイス・キッズ; ^)
デミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.