Apa cara termudah untuk mendapatkan waktu GMT saat ini dalam format cap waktu Unix?


175

Python menyediakan paket yang berbeda ( datetime, time, calendar) seperti dapat dilihat di sini dalam rangka untuk berurusan dengan waktu. Saya membuat kesalahan besar dengan menggunakan yang berikut untuk mendapatkan waktu GMT saat initime.mktime(datetime.datetime.utcnow().timetuple())

Apa cara sederhana untuk mendapatkan waktu GMT saat ini di cap waktu Unix?


1
Apa input / output? datetime.utcnow()mengembalikan waktu UTC saat ini sebagai objek datetime (Saya berasumsi Anda ingin UTC ketika Anda berbicara tentang "waktu GMT"). time.time()mengembalikan cap waktu Unix langsung sebagai nomor float. Berikut ini cara mengonversi datetime.date/datetime.datetime mewakili waktu dalam UTC ke timestamp POSIX .
jfs

Apakah metode yang Anda usulkan salah, atau terlalu bertele-tele? Terkait: stackoverflow.com/questions/15940280/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

Mengapa metode Anda salah?
skeller88

Jawaban:


230

Saya akan menggunakan time.time () untuk mendapatkan cap waktu dalam detik sejak zaman.

import time

time.time()

Keluaran:

1369550494.884832

Untuk implementasi CPython standar pada kebanyakan platform, ini akan mengembalikan nilai UTC.


21
Tangkapannya adalah bahwa jam lokal mesin Anda mungkin tidak dalam UTC.
9000

@ 9000: Benar, meskipun saya selalu bersikeras pada UTC di lingkungan mana pun yang membuat waktu tetap berarti. Dan dia memang meminta solusi paling sederhana. Perhatikan bahwa dengan CPython pada platform modern, termasuk Linux, BSD, Mac OS X, dan Windows, semuanya akan mengembalikan UTC untuk time.time (). Ini mencerminkan perilaku fungsi waktu perpustakaan standar C pada OS ini.
Edmond Burnett

66
@ 9000: zona waktu lokal tidak masalah. Waktu unix sesuai dengan waktu UTC (jika kita mengabaikan waktu sekitar detik kabisat). Pikirkan tentang hal ini: stempel waktu adalah jumlah detik yang berlalu sejak zaman (waktu yang tetap dalam waktu): mengapa itu tergantung pada jam lokal yang digunakan mesin waktu? Pada suatu waktu tertentu, waktu Unix sama di seluruh dunia. Beberapa platform (tidak dikenal) mungkin menggunakan zaman yang berbeda, tetapi nilainya masih tidak bergantung pada zona waktu lokal.
jfs


125
import time

int(time.time()) 

Keluaran:

1521462189

42

Apakah ini membantu?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Bagaimana mengkonversi objek datetime Python UTC ke cap waktu UNIX


@Cairnarvon Itu hanya contoh. Jika Anda ingin cap waktu saat ini maka Anda cukup menelepon time.time()dan tidak perlu konversi datetime sama sekali.
Messa

1
FWIW: Itu bukan waktu UTC, itu adalah UTC dikonversi ke waktu lokal. Untuk mendapatkan cap waktu di UTC Anda harus melakukan hal lain.
Sherlock70

18

Atau hanya cukup menggunakan modul standar datetime

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

Anda dapat memotong atau memperbanyak tergantung pada resolusi yang Anda inginkan. Contoh ini menghasilkan milis.

Jika Anda ingin cap waktu Unix yang tepat (dalam detik) hapus* 1000


Kode Anda secara spesifik memaksa waktu menjadi bilangan bulat, jadi saya bingung mengapa teks keluarannya berupa angka desimal?
Weston

kamu salahku, aku menambahkan casting int kemudian
Maresh

Ini sama dengan momentperpustakaan Javascript moment().utc().valueOf(). Persis apa yang saya cari. Terima kasih
azhar22k

Stempel waktu UNIX seharusnya menjadi detik sejak 1970. Solusi Anda tidak menghasilkan ini.
menjulang tinggi

1
"Anda dapat memotong atau memperbanyak tergantung pada resolusi yang Anda inginkan" Jatuhkan bagian * 1000 dan Anda mendapatkan detik.
Maresh

18

python2 dan python3

itu baik untuk menggunakan modul waktu

import time
int(time.time())

1573708436

Anda juga dapat menggunakan modul datetime, tetapi saat Anda menggunakan strftime ('% s'), tetapi strftime mengonversi waktu menjadi waktu lokal Anda!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()

2
Berada di UTC + 1, time.time()dan datetime.utcnow().timestamp()jangan tidak memberikan nilai yang sama!
user136036

Walaupun saya mengharapkan opsi ke-2 benar, saya harus menggunakan datetime.now (). Timestamp () untuk mendapatkan nilai yang benar di UTC + 1100. Saya berharap timestamp () berfungsi dengan baik untuk salah satu tapi sepertinya tidak
David Waterworth

Melihat lebih dekat, baik datetime.utcnow () dan datetime.now () mengembalikan datetime naif (no tzinfo), dan timestamp () tampaknya menganggap lokal ketika tzinfo = null.
David Waterworth

2

Saya suka metode ini:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Metode lain yang diposting di sini tidak dijamin memberi Anda UTC di semua platform atau hanya melaporkan seluruh detik. Jika Anda menginginkan resolusi penuh, ini berfungsi, untuk micro-detik.


1
Sayangnya ini sepertinya tidak memberikan UTC kecuali Anda kebetulan berada di zona waktu UTC + 0000. Menggunakan utctimetuplebukan melakukan triknya sekalipun.
menjulang tinggi

1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Keluaran:

1544524990

ini tidak mengembalikan sama seperti time.time()untuk saya.
Alwinius

1
Itu mungkin karena dt.utcnowmengembalikan datetimeinformasi tanpa zona waktu. Kemudian strftimeberasumsi bahwa datetimeini adalah waktu setempat.
menjulang tinggi

1
@skyking Ini adalah masalah bagi hampir semua jawaban di halaman ini!
David Waterworth

1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Output: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Output: 1572878043

  • Di sini, kita dapat melihat contoh pertama memberi waktu lebih akurat daripada yang kedua.
  • Di sini saya menggunakan yang pertama.

1

Setidaknya dalam python3, ini berfungsi:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.