Trong Python, làm thế nào để bạn chuyển đổi giây kể từ epoch thành đối tượng `datetime`?


248

Các timemô-đun có thể được khởi tạo bằng giây kể từ kỷ nguyên:

>>> import time
>>> t1=time.gmtime(1284286794)
>>> t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

Có một cách thanh lịch để khởi tạo một datetime.datetimeđối tượng theo cùng một cách?


3
cho hoạt động ngược lại ở đây: convert-a-datetime-object-to-giây
Trevor Boyd Smith

Câu trả lời:


404

datetime.datetime.fromtimestamp sẽ làm, nếu bạn biết múi giờ, bạn có thể tạo ra cùng một đầu ra như với time.gmtime

>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

hoặc là

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

42
kỳ lạ, datetime.utcfromtimestamptạo ra một dấu thời gian ngây thơ. Tôi đã phải import pytzvà sử dụng datetime.fromtimestamp(1423524051, pytz.utc)để tạo ra một datetime nhận thức.
Matt

6
như một phần tiếp theo ở trên, với Python> = 3.2, bạn không phải nhập pytzthư viện nếu bạn chỉ muốn dấu thời gian UTC - bạn chỉ cần from datetime import datetime, timezonegọi và sau đó gọi nó như sau : datetime.fromtimestamp(1423524051, timezone.utc). Nó đã lưu thư viện thêm nhiều lần khi tôi chỉ cần múi giờ UTC pytz.
phouse512

38

Vài giây kể từ kỷ nguyên datetimeđến strftime:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

Nó phải là datetime.fromtimestamp (1579366345) .strftime ('% Y-% m-% d% H:% M:% S')
vml19

26

Từ các tài liệu, cách được đề xuất để có được một đối tượng datetime nhận biết múi giờ từ giây kể từ epoch là:

Con trăn 3 :

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2 , sử dụng pytz:

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

Liên kết đến tài liệu trong phụ đề của bạn ("Python 3", "Python 2") sẽ hữu ích - và tôi cũng khuyên bạn nên thay đổi thứ tự của chúng.
Adam Matan

Cập nhật. Để lại thứ tự như nhau, vì điều đó phù hợp với các tài liệu Python.
Meistro

bạn không cần pytzchỉ để có được utcđối tượng tzinfo. Thật dễ dàng để tự tạo nó
jfs

9

Lưu ý rằng datetime.datetime. fromtimestamp (dấu thời gian) và.utcfromtimestamp (dấu thời gian) không thành công trên các cửa sổ cho các ngày trước ngày 1 tháng 1 năm 1970 trong khi dấu thời gian unix âm dường như hoạt động trên nền tảng unix. Các tài liệu nói điều này:

" Điều này có thể làm tăng ValueError, nếu dấu thời gian nằm ngoài phạm vi giá trị được hỗ trợ bởi hàm C gmtime () của nền tảng. Điều này thường bị hạn chế trong nhiều năm từ 1970 đến 2038 "

Xem thêm Vấn đề1646728


: o) có, vẫn còn khoảng 23 năm để sửa lỗi
user3666197

5
bạn có thể sử dụng utc_time = datetime(1970,1,1) + timedelta(seconds=timestamp), để giải quyết nó.
JFS
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.