Làm cách nào để có được thời gian UTC trong Python?


113

Tôi đã tìm kiếm một loạt trên StackExchange cho một giải pháp nhưng không có gì làm được những gì tôi cần. Trong JavaScript, tôi đang sử dụng phần sau để tính giờ UTC kể từ ngày 1 tháng 1 năm 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;
}

Mã Python tương đương sẽ là gì?



Chờ đã, bạn đang sử dụng Python hay JavaScript?
CheetSheatOverlode

Câu trả lời:


179

Hãy thử mã này sử dụng datetime.utcnow () :

from datetime import datetime
datetime.utcnow()

Đối với mục đích của bạn khi bạn cần tính lượng thời gian dành cho giữa hai ngày, tất cả những gì bạn cần là tính trừ ngày kết thúc và ngày bắt đầu. Kết quả của phân số như vậy là một đối tượng theo thời gian.

Từ tài liệu về trăn:

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

Và điều này có nghĩa là theo mặc định, bạn có thể nhận được bất kỳ trường nào được đề cập trong định nghĩa của nó - ngày, giây, micro giây, mili giây, phút, giờ, tuần. Ngoài ra, phiên bản timedelta có phương thức total_seconds () mà:

Trả về tổng số giây có trong thời lượng. Tương đương với (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 được tính với phép chia đúng.


2
Có thể có bất ngờ khó chịu về datetime.utcnow () là nó không trả về một đối tượng nhận biết múi giờ mặc dù có tên. Theo ý kiến ​​của tôi, đây là một vấn đề lớn, đó là lý do tại sao tôi thích câu trả lời của mình dưới đây hơn. Xem "các đối tượng datetime không có múi giờ nên được coi là" lỗi "trong ứng dụng." julien.danjou.info/python-and-timezones
Tim Richardson

1
Khái niệm về một đối tượng ngày giờ được gọi là ngây thơ (tức là không có thông tin múi giờ nào được đặt) thực sự phục vụ một mục đích: Tôi muốn đồng hồ báo thức của mình đổ chuông lúc 06:00:00 hàng ngày cho dù tôi đang ở đâu trên thế giới. Ngoài ra, nó còn cho phép "đồng hồ ảo" trong trò chơi máy tính nói: Bây giờ là 5 giờ chiều trong thế giới tưởng tượng của tôi. Việc buộc múi giờ vào đối tượng datetime sẽ rất khó xử, đặc biệt là với số học thời gian.
DustByte

42

Ở dạng gần nhất với bản gốc của bạn:

import datetime

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

Nếu bạn cần biết số giây từ 1970-01-01 hơn là một Python gốc datetime, hãy sử dụng điều này để thay thế:

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

Python có các quy ước đặt tên trái ngược với những gì bạn có thể quen dùng trong Javascript, xem PEP 8 . Ngoài ra, một hàm chỉ trả về kết quả của một hàm khác là khá ngớ ngẩn; nếu chỉ là vấn đề làm cho nó dễ truy cập hơn, bạn có thể tạo một tên khác cho một hàm bằng cách chỉ định nó. Ví dụ đầu tiên ở trên có thể được thay thế bằng:

utc_now = datetime.datetime.utcnow

1
Tôi thích câu trả lời của bạn hơn câu trả lời được đánh giá cao hơn từ phía trên. Cảm ơn bạn về độ sâu ở đây.
Jordan Dea-Mattson

@Jordan, nhìn lại câu trả lời của mình, tôi nhận ra rằng mình đã mắc một sai lầm về phong cách khi đặt nhập vào bên trong hàm chứ không phải ở cấp toàn cầu, tôi sẽ sửa điều đó ngay bây giờ.
Mark Ransom

8
Có lẽ bạn nên xem xét gói UtcNow () trong một hàm khác. Nó quá đơn giản. Cũng không sử dụng dấu gạch dưới. PEP 8 được nên nhàm chán ...
vcarel

1
Chắc chắn không cần phải viết một hàm để trả về một lớp lót đơn giản ... datetime.datetime.utcnow ()
cpreid

1
@TimRichardson Tôi không đồng ý, nhưng tại thời điểm câu trả lời này được viết, không có sự thay thế nào - Python không bao gồm bất kỳ tzinfođối tượng nào , ngay cả đối với UTC.
Mark Ransom vào

31

Chỉ thư viện tiêu chuẩn, đơn giản, dành cho python hiện đại. Cung cấp ngày giờ nhận biết múi giờ, không giống như datetime.utcnow(). datetimeskhông có múi giờ là tai nạn đang chờ xảy ra.

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

5
Theo tài liệu Python 3, đây là cách được khuyến nghị để làm điều đó.
roskakori

Sạch sẽ và dễ dàng! Nên là cách ưu tiên.
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

Từ datetime.datetime, bạn đã có thể xuất sang dấu thời gian với phương thức strftime. Theo ví dụ về hàm của bạn:

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

Nếu bạn muốn có micro giây, bạn cần thay đổi chuỗi xuất và truyền để nổi như: return float(now.strftime("%s.%f"))


Mục đích của việc chuyển đổi thành một chuỗi và sau đó quay lại một số khi bạn có thể nhận được số đó trực tiếp?
Mark Ransom

Vấn đề là bạn có thể muốn thay đổi những thứ trên hàm và vì lý do đó, tốt hơn nên gắn vào đối tượng datetime, không sử dụng time.time(), Bạn cũng có thể sử dụng time.mktime (now.timetuple ()) để chuyển đổi trực tiếp thành int. Dù sao, đối với trường hợp đơn giản time.time()này cũng là một lựa chọn hợp lệ. Điều tôi thấy kỳ quặc, là tính theo thời gian để tìm giây.
hectorcanto

Lưu ý, điều đó strftime("%s")phụ thuộc vào nền tảng và không hoạt động trên Windows. (Ít nhất thì nó không dành cho tôi trên Windows 10).
Julian Kirsch,

8

Nhận biết múi giờ mà không có phụ thuộc bên ngoài:

from datetime import datetime, timezone

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

-4

Trong Python 3 sử dụng biểu thức lambda, hãy thử;

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

và gọi hàm bình thường;

print(utc_now())

2
bây giờ tốt đẹp nhé các con; ^)
Demis
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.