Bagaimana cara mendapatkan detik sejak zaman dari waktu + tanggal keluaran gmtime ()?

162

Bagaimana Anda melakukannya terbalik gmtime(), di mana Anda meletakkan waktu + tanggal dan mendapatkan jumlah detik?

Saya memiliki string seperti 'Jul 9, 2009 @ 20:02:58 UTC', dan saya ingin mendapatkan kembali jumlah detik antara zaman dan 9 Juli 2009.

Saya sudah mencoba time.strftimetetapi saya tidak tahu bagaimana menggunakannya dengan benar, atau apakah itu perintah yang benar untuk digunakan.

calccrypto
sumber

Jawaban:

123

Jika Anda sampai di sini karena mesin pencari memberi tahu Anda cara mendapatkan cap waktu Unix, berhenti membaca jawaban ini. Gulir ke bawah satu.

Jika Anda ingin membalikkan time.gmtime(), Anda ingin calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Anda dapat mengubah string menjadi tupel waktu time.strptime(), yang mengembalikan tupel waktu yang dapat Anda lewati calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Informasi lebih lanjut tentang modul kalender di sini

nmichaels
sumber
16
Jika Anda mencari waktu unix epoch saat ini silakan lihat komentar @ DanJ atau jawaban naren, jawaban ini salah!
kosii
639

Gunakan modul waktu :

epoch_time = int(time.time())
naren
sumber
14
@ DanJ: ini adalah jumlah detik yang berlalu sejak Epoch (waktu yang tetap dalam waktu) dan sama di zona waktu mana pun. Padahal jika kita mengabaikan instance waktu sekitar detik kabisat; mudah untuk mengubahnya menjadi UTC jika timemenggunakan Unix epoch (1970).
jfs
42
Perhatikan ini bukan apa yang diminta OP, tapi itu yang saya inginkan. Jadi +1.
fearless_fool
6
itu adalah jawaban untuk apa yang ditanyakan dalam judul: "mendapatkan waktu sejak zaman". +1
AlejandroVD
@ JSFSebastian ini memberikan waktu ke detik. Bagaimana saya bisa mendapatkan resolusi hingga milidetik menggunakan jawaban yang sama di atas?
Marlon Abeykoon
2
untuk memperpanjang komentar saya di atas : time.time()nilai TIDAK tergantung pada zona waktu lokal (jika kita mengecualikan zona waktu "benar" dan sejenisnya) misalnya, jika mengembalikan waktu POSIX (seperti halnya pada kebanyakan sistem) maka itu adalah jumlah detik SI sejak Epoch (1970-01-01UTC) tidak menghitung detik kabisat. Nilai ini dapat dikonversi ke UTC (tidak termasuk detik kabisat) tetapi bukan UTC . @ MarslonAbeykoon: Saya suka jawaban ini
jfs
10

Perhatikan bahwa time.gmtimecap waktu peta 0untuk 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) memberi Anda cap waktu bergeser dengan jumlah yang tergantung pada lokal Anda, yang secara umum mungkin tidak 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

Kebalikannya time.gmtimeadalah calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0
unutbu
sumber
Ini memberikan penjelasan dan contoh yang lebih baik untuk time.mktime (yang mempertimbangkan zona waktu saat ini), terima kasih
Jkm
@Jkm: JANGAN gunakan mktime()dengan gmtime(). mktime()menerima waktu lokal Anda tetapi gmtime()mengembalikan waktu UTC - zona waktu lokal Anda mungkin dan kemungkinan akan berbeda. "timestamp relatif terhadap lokal Anda" tidak masuk akal: stempel waktu POSIX tidak tergantung pada lokal Anda (zona waktu lokal) - ini adalah nilai yang sama di seluruh dunia. "detik sejak zaman" adalah cap waktu POSIX dalam kebanyakan kasus (bahkan pada Windows) - hal-hal seperti zona waktu "benar" yang menggunakan skala waktu TAI tidak umum. Lihat Apakah time.time Python () mengembalikan stempel waktu lokal atau UTC?
jfs
@ JF Sebastian Anda benar. Sebenarnya saya punya beberapa masalah mktime()baru - baru ini. Untuk beberapa server web python (Tornado misalnya), karena proses terus berjalan, bahkan jika saya mengubah sistem lokal, yang mktime()disebut oleh server web API masih menggunakan zona waktu lama untuk menghasilkan objek waktu. Saya harus beralih ke gmtime()dan secara manual menerapkan gmt offset.
Jkm
5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Ini harus berbeda dari int(time.time()), tetapi aman untuk menggunakan sesuatu sepertix % (60*60*24)

datetime - Tipe tanggal dan waktu dasar:

Berbeda dengan modul waktu, modul datetime tidak mendukung detik kabisat.

pengguna3226167
sumber
3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
Falmarri
sumber
Saya tidak dapat mengakses strptime karena alasan tertentu. Saya telah mengimpor datetime
calccrypto
1
@calccrypto Anda harus from datetime import datetimemelakukannya atau melakukandatetime.datetime.strptime
pathikrit