Nếu d = date(2011, 1, 1)
là trong UTC:
>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)
Nếu d
ở múi giờ địa phương:
>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)
timestamp1
và timestamp2
có thể khác nhau nếu nửa đêm trong múi giờ địa phương không giống với nửa đêm ở UTC.
mktime()
có thể trả về kết quả sai nếu d
tương ứng với giờ địa phương mơ hồ (ví dụ: trong quá trình chuyển đổi DST) hoặc nếu d
là ngày quá khứ (tương lai) khi phần bù utc có thể khác và C mktime()
không có quyền truy cập vào cơ sở dữ liệu tz trên nền tảng đã cho . Bạn có thể sử dụng pytz
mô-đun (ví dụ: thông qua tzlocal.get_localzone()
) để có quyền truy cập vào cơ sở dữ liệu tz trên tất cả các nền tảng . Ngoài ra, utcfromtimestamp()
có thể thất bại và mktime()
có thể trả về dấu thời gian không phải POSIX nếu "right"
múi giờ được sử dụng .
Để chuyển đổi datetime.date
đối tượng thể hiện ngày trong UTC mà không có calendar.timegm()
:
DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Làm cách nào tôi có thể nhận được ngày chuyển đổi thành giây kể từ epoch theo UTC?
Để chuyển đổi datetime.datetime
(không datetime.date
) đối tượng đã biểu thị thời gian trong UTC sang dấu thời gian POSIX tương ứng (a float
).
Python 3,3+
datetime.timestamp()
:
from datetime import timezone
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Lưu ý: Cần cung cấp timezone.utc
một cách rõ ràng nếu không .timestamp()
giả sử rằng đối tượng datetime ngây thơ của bạn nằm trong múi giờ địa phương.
Con trăn 3 (<3.3)
Từ các tài liệu cho datetime.utcfromtimestamp()
:
Không có phương pháp để lấy dấu thời gian từ một thể hiện datetime, nhưng dấu thời gian POSIX tương ứng với một thể hiện datetime dt có thể được tính toán dễ dàng như sau. Đối với một dt ngây thơ:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Và cho một dt nhận thức:
timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)
Đọc thú vị: Thời gian kỷ nguyên so với thời gian trong ngày về sự khác biệt giữa thời gian nào? và đã trôi qua bao nhiêu giây?
Xem thêm: datetime cần một phương thức "epoch"
Con trăn 2
Để điều chỉnh mã trên cho Python 2:
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
trong đó timedelta.total_seconds()
tương đương với (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
tính toán với phân chia thực sự được kích hoạt.
from __future__ import division
from datetime import datetime, timedelta
def totimestamp(dt, epoch=datetime(1970,1,1)):
td = dt - epoch
# return td.total_seconds()
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6
now = datetime.utcnow()
print now
print totimestamp(now)
Coi chừng các vấn đề dấu phẩy động .
Đầu ra
2012-01-08 15:34:10.022403
1326036850.02
Cách chuyển đổi một datetime
đối tượng nhận biết sang dấu thời gian POSIX
assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+
Trên Python 3:
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)
Trên Python 2:
# utc time = local time - utc offset
utc_naive = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()