Bagaimana cara mendapatkan waktu UTC dengan Python?

113

Saya telah mencari banyak solusi di StackExchange tetapi tidak ada yang dapat memenuhi kebutuhan saya. Dalam JavaScript, saya menggunakan yang berikut ini untuk menghitung waktu UTC sejak 1 Januari 1970:

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;
}

Apa yang akan menjadi kode Python yang setara?

James Clarke
sumber
Tunggu, apakah Anda menggunakan Python atau JavaScript?
CheetSheatOverlode

Jawaban:

179

Coba kode ini yang menggunakan datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Untuk tujuan Anda ketika Anda perlu menghitung jumlah waktu yang dihabiskan antara dua tanggal, yang Anda butuhkan hanyalah mengurangi tanggal akhir dan mulai. Hasil substraksi tersebut adalah objek timedelta.

Dari dokumen python:

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

Dan ini berarti bahwa secara default Anda bisa mendapatkan bidang apa pun yang disebutkan dalam definisinya - hari, detik, mikrodetik, milidetik, menit, jam, minggu. Juga timedelta instance memiliki metode total_seconds () yang:

Kembalikan jumlah total detik yang terkandung dalam durasi. Setara dengan (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 dihitung dengan pembagian true diaktifkan.

Artsiom Rudzenka
sumber
2
Kejutan yang mungkin tidak menyenangkan tentang datetime.utcnow () adalah tidak mengembalikan objek yang sadar zona waktu meskipun namanya. Ini menurut saya masalah besar, itulah sebabnya saya lebih suka jawaban saya di bawah ini. Lihat "objek datetime tanpa zona waktu harus dianggap sebagai" bug "dalam aplikasi." julien.danjou.info/python-and-timezones
Tim Richardson
1
Konsep yang disebut objek datetime naif (yaitu, tidak ada informasi zona waktu yang disetel) memang memiliki tujuan: Saya ingin jam alarm saya berdering pada pukul 06:00:00 setiap hari di mana pun saya berada. Juga memungkinkan untuk "jam virtual" dalam permainan komputer katakanlah: Sekarang jam 5 sore di dunia fantasi saya. Memaksakan zona waktu ke objek datetime akan terasa canggung, terutama dengan aritmatika timedelta.
DustByte
42

Dalam bentuk yang paling dekat dengan aslinya:

import datetime

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

Jika Anda perlu mengetahui jumlah detik dari 1970-01-01 daripada Python asli datetime, gunakan ini sebagai gantinya:

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

Python memiliki konvensi penamaan yang bertentangan dengan apa yang mungkin biasa Anda gunakan dalam Javascript, lihat PEP 8 . Selain itu, fungsi yang hanya mengembalikan hasil dari fungsi lain agak konyol; jika itu hanya masalah membuatnya lebih mudah diakses, Anda dapat membuat nama lain untuk suatu fungsi hanya dengan menetapkannya. Contoh pertama di atas bisa diganti dengan:

utc_now = datetime.datetime.utcnow
Mark Ransom
sumber
1
Saya suka jawaban Anda lebih baik daripada yang berperingkat lebih tinggi dari atas. Terima kasih atas kedalamannya di sini.
Jordan Dea-Mattson
@Jordan, melihat kembali jawaban saya, saya menyadari bahwa saya membuat kesalahan gaya dengan memasukkan impor ke dalam fungsi daripada di tingkat global, saya akan memperbaikinya sekarang.
Mark Ransom
8
Mungkin Anda harus mempertimbangkan untuk membungkus UtcNow () di fungsi lain. Itu terlalu sederhana. Juga tetap tidak menggunakan garis bawah. PEP 8 sangat membosankan ...
vcarel
1
Jelas tidak perlu menulis fungsi untuk mengembalikan satu baris sederhana ... datetime.datetime.utcnow ()
cpreid
1
@TimRichardson Saya tidak setuju, tetapi pada saat jawaban ini ditulis tidak ada alternatif - Python tidak menyertakan tzinfoobjek apa pun , bahkan untuk UTC.
Markus Tebusan
31

Sederhana, hanya perpustakaan standar, untuk python modern. Memberikan datetime sadar zona, tidak seperti datetime.utcnow(). datetimestanpa zona waktu adalah kecelakaan yang menunggu untuk terjadi.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
sumber
5
Menurut dokumentasi Python 3, ini adalah cara yang disarankan untuk melakukannya.
roskakori
Bersih dan mudah! Harus menjadi cara yang disukai.
Menikah35
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) 
MikeL
sumber
10

Dari datetime.datetime, Anda sudah dapat mengekspor ke cap waktu dengan metode strftime. Mengikuti contoh fungsi Anda:

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

Jika Anda menginginkan mikrodetik, Anda perlu mengubah string ekspor dan cast menjadi float seperti: return float(now.strftime("%s.%f"))

hectorcanto.dll
sumber
Apa gunanya mengonversi menjadi string dan kemudian kembali ke angka ketika Anda bisa mendapatkan nomornya secara langsung?
Mark Ransom
Intinya adalah Anda mungkin ingin mengubah sesuatu pada fungsi dan untuk alasan itu lebih baik tetap menggunakan objek datetime, tidak menggunakan time.time(), Anda juga bisa menggunakan time.mktime (now.timetuple ()) untuk mengonversi langsung ke int. Bagaimanapun, untuk kasus sederhana time.time()ini juga merupakan opsi yang valid. Yang saya anggap aneh, adalah melalui timedelta untuk menemukan detik.
hectorcanto
Catatan, itu strftime("%s")tergantung platform dan tidak berfungsi di Windows. (Setidaknya itu tidak untuk saya di Windows 10).
Julian Kirsch
8

Sadar zona waktu tanpa ketergantungan eksternal:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Cesar Canassa
sumber
-4

Di Python 3 menggunakan ekspresi lambda, coba;

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

dan panggil fungsi tersebut secara normal;

print(utc_now())
UANG JALAN
sumber
2
jadilah baik sekarang anak-anak; ^)
Demis