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)
timestamp1và timestamp2có 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 dtương ứng với giờ địa phương mơ hồ (ví dụ: trong quá trình chuyển đổi DST) hoặc nếu dlà 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 pytzmô-đ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.utcmộ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**6tí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()