Cách dễ nhất để có được thời gian GMT hiện tại ở định dạng dấu thời gian Unix là gì?


175

Python cung cấp các gói khác nhau ( datetime, time, calendar) như có thể thấy ở đây để đối phó với thời gian. Tôi đã phạm một sai lầm lớn khi sử dụng cách sau để có được giờ GMT hiện tạitime.mktime(datetime.datetime.utcnow().timetuple())

Cách đơn giản để có được thời gian GMT hiện tại trong dấu thời gian Unix là gì?


1
Đầu vào / đầu ra là gì? datetime.utcnow()trả về thời gian UTC hiện tại dưới dạng đối tượng datetime (Tôi giả sử bạn muốn UTC khi bạn đang nói về "giờ GMT"). time.time()trả về dấu thời gian Unix trực tiếp dưới dạng số float. Dưới đây là cách chuyển đổi datetime.date/datetime.datetime biểu thị thời gian trong UTC sang dấu thời gian POSIX .
jfs

Là phương pháp đề xuất của bạn sai, hoặc chỉ quá dài dòng? Liên quan: stackoverflow.com/questions/15940280/
Mạnh

Tại sao phương pháp của bạn là một sai lầm?
skeller88

Câu trả lời:


230

Tôi sẽ sử dụng time.time () để lấy dấu thời gian tính bằng giây kể từ kỷ nguyên.

import time

time.time()

Đầu ra:

1369550494.884832

Đối với việc triển khai CPython tiêu chuẩn trên hầu hết các nền tảng, điều này sẽ trả về giá trị UTC.


21
Điều hấp dẫn là đồng hồ cục bộ của máy bạn có thể không ở trong UTC.
9000

@ 9000: Đúng, mặc dù tôi luôn khăng khăng đòi UTC trong bất kỳ môi trường nào có vấn đề về thời gian. Và anh ấy đã yêu cầu giải pháp đơn giản nhất. Lưu ý rằng với CPython trên các nền tảng hiện đại, bao gồm Linux, BSD, Mac OS X và Windows, tất cả sẽ trả về UTC cho time.time (). Điều này phản ánh hành vi của chức năng thời gian của thư viện chuẩn C trên các hệ điều hành này.
Edmond Burnett

66
@ 9000: múi giờ địa phương không thành vấn đề. Thời gian Unix tương ứng với thời gian UTC (nếu chúng ta bỏ qua thời gian xung quanh giây nhuận). Hãy suy nghĩ về nó: dấu thời gian là số giây trôi qua kể từ kỷ nguyên (một thời điểm cố định): tại sao nó phụ thuộc vào đồng hồ cục bộ của máy múi giờ sử dụng? Tại bất kỳ thời điểm nào, thời gian Unix đều giống nhau trên toàn thế giới. Một số nền tảng (chưa biết) có thể sử dụng một kỷ nguyên khác, nhưng giá trị của nó vẫn không phụ thuộc vào múi giờ địa phương.
jfs



42

Không giúp đỡ à?

from datetime import datetime
import calendar

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

Cách chuyển đổi đối tượng datetime Python UTC sang dấu thời gian UNIX


@Cairnarvon Đó chỉ là một ví dụ. Nếu bạn muốn dấu thời gian hiện tại thì bạn chỉ cần gọi time.time()và không cần chuyển đổi thời gian.
Messa

1
FWIW: Đó không phải là Giờ UTC, đó là UTC được chuyển đổi thành giờ địa phương. Để có được dấu thời gian trong UTC, bạn phải làm điều gì đó khác.
Sherlock70

18

Hoặc chỉ đơn giản là sử dụng mô-đun chuẩn datetime

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

Bạn có thể cắt bớt hoặc nhân lên tùy theo độ phân giải bạn muốn. Ví dụ này là xuất ra millis.

Nếu bạn muốn có dấu thời gian Unix thích hợp (tính bằng giây), hãy xóa* 1000


Mã của bạn rất cụ thể là buộc thời gian thành một số nguyên vì vậy tôi bối rối tại sao văn bản đầu ra là một số thập phân?
Weston

Các bạn thật tệ, tôi đã thêm buổi casting sau
Maresh

Đây là tương đương chính xác của momentthư viện Javascript moment().utc().valueOf(). Chính xác những gì tôi đang tìm kiếm. Cảm ơn
azhar22k

Dấu thời gian UNIX được cho là vài giây kể từ năm 1970. Giải pháp của bạn không tạo ra điều này.
bầu trời

1
"Bạn có thể cắt bớt hoặc nhân lên tùy theo độ phân giải bạn muốn" Thả phần * 1000 và bạn nhận được giây.
Maresh

18

python2python3

sử dụng mô-đun thời gian là tốt

import time
int(time.time())

1573708436

bạn cũng có thể sử dụng mô-đun datetime, nhưng khi bạn sử dụng strftime ('% s'), nhưng strftime chuyển đổi thời gian thành giờ địa phương của bạn!

trăn2

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

trăn3

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

2
Là tại UTC + 1, time.time()datetime.utcnow().timestamp()làm không cung cấp cho các giá trị như nhau!
dùng136036

Ngoài ra, mặc dù tôi mong đợi tùy chọn thứ 2 là chính xác, tôi đã phải sử dụng datetime.now (). Timestamp () để có được giá trị chính xác trong UTC + 1100. Tôi dự kiến ​​dấu thời gian () sẽ hoạt động chính xác cho cả hai nhưng dường như không
David Waterworth

Nhìn gần hơn, cả datetime.utcnow () và datetime.now () trả về một datetime ngây thơ (không có tzinfo) và dấu thời gian () dường như giả sử cục bộ khi tzinfo = null.
David Waterworth

2

Tôi thích phương pháp này:

import datetime, time

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

Các phương pháp khác được đăng ở đây không được đảm bảo để cung cấp cho bạn UTC trên tất cả các nền tảng hoặc chỉ báo cáo toàn bộ giây. Nếu bạn muốn độ phân giải đầy đủ, điều này hoạt động, đến micro-giây.


1
Thật không may, điều này dường như không cung cấp cho UTC trừ khi bạn ở trong múi giờ UTC + 0000. Sử dụng utctimetuplethay vì thực hiện các mẹo mặc dù.
bầu trời

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

Đầu ra:

1544524990

Điều này không trả lại giống như time.time()đối với tôi.
Alwinius

1
Đó có lẽ là vì dt.utcnowtrả lại một datetimethông tin không có múi giờ. Sau đó strftimegiả định rằng đó datetimelà giờ địa phương.
bầu trời

1
@skyking Đây là khá nhiều vấn đề cho hầu hết các câu trả lời trên trang này!
David Waterworth

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

Đầu ra: 1572878043380

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

Đầu ra: 1572878043

  • Ở đây, chúng ta có thể thấy ví dụ đầu tiên cho thời gian chính xác hơn so với ví dụ thứ hai.
  • Ở đây tôi đang sử dụng cái đầu tiên.

1

Ít nhất là trong python3, điều này hoạt động:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.