Liệu time.time()
trong module thời gian Python trở lại thời gian của hệ thống hoặc thời gian trong UTC?
Liệu time.time()
trong module thời gian Python trở lại thời gian của hệ thống hoặc thời gian trong UTC?
Câu trả lời:
Các time.time()
chức năng trả về số giây kể từ khi kỷ nguyên, như giây. Lưu ý rằng "kỷ nguyên" được định nghĩa là bắt đầu ngày 1 tháng 1 năm 1970 tại UTC. Vì vậy, kỷ nguyên được xác định theo thuật ngữ của UTC và thiết lập một thời điểm toàn cầu theo thời gian. Bất kể bạn ở đâu "giây qua kỷ nguyên" (time.time ()) trả về cùng một giá trị tại cùng một thời điểm.
Đây là một số đầu ra mẫu tôi đã chạy trên máy tính của mình, chuyển đổi nó thành một chuỗi.
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
Các ts
biến là lần trở lại trong vài giây. Sau đó tôi đã chuyển đổi nó thành một chuỗi bằng cách sử dụng datetime
thư viện làm cho nó trở thành một chuỗi có thể đọc được.
import time
khi datetime về cơ bản cung cấp cho bạn dấu thời gian. Chỉ cần xóa một phần nghìn giây -str(datetime.datetime.now()).split('.')[0]
time.time()
không nằm trong bất kỳ múi giờ nào . "giây kể từ kỷ nguyên" là một thuật ngữ; nó không trôi qua được vài giây kể từ một thời điểm nào đó (epoch). Bạn có thể chuyển đổi nó thành giờ địa phương (với cơ sở dữ liệu tz) và / hoặc múi giờ UTC một cách dễ dàng. btw, nếu bạn thả .strftime()
kết quả là (gần như) giống nhau (+/- micro giây).
Đây là dạng văn bản của dấu thời gian có thể được sử dụng trong các tệp văn bản của bạn. (Tiêu đề của câu hỏi là khác nhau trong quá khứ, vì vậy phần giới thiệu cho câu trả lời này đã được thay đổi để làm rõ cách nó có thể được hiểu theo thời gian. [Cập nhật 2016-01-14])
Bạn có thể lấy dấu thời gian dưới dạng chuỗi bằng cách sử dụng .now()
hoặc .utcnow()
của datetime.datetime
:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
Các now
khác với utcnow
như mong đợi - nếu họ làm việc cùng một cách:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Bạn có thể hiển thị dấu thời gian cho chuỗi một cách rõ ràng:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Hoặc bạn có thể rõ ràng hơn để định dạng dấu thời gian theo cách bạn muốn:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
Nếu bạn muốn định dạng ISO, sử dụng .isoformat()
phương thức của đối tượng:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Bạn có thể sử dụng chúng trong các biến để tính toán và in mà không cần chuyển đổi.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
là xấu xa Nó tạo ra một datetime ngây thơ không phải là giờ địa phương. Trừ khi giờ địa phương của bạn là UTC, nó sẽ SAI. Sử dụng datetime.datetime.now(datetime.timezone.utc)
thay thế. Điều này tạo ra một mốc thời gian nhận biết múi giờ biểu thị thời gian hiện tại.
Dựa trên câu trả lời từ #squiguy, để có được dấu thời gian thực sự, tôi sẽ gõ nó từ float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Ít nhất đó là khái niệm.
type(time.time())
đưa ra<type 'float'>
int()
là đa hình. Nó sẽ trả về long
nếu cần thiết trên các phiên bản Python cũ - tất cả các số nguyên đều dài trên các phiên bản Python mới.
Câu trả lời có thể là không hoặc cả hai.
không: time.time()
trả về khoảng số giây đã trôi qua kể từ Kỷ nguyên. Kết quả không phụ thuộc vào múi giờ nên không phải là UTC hay giờ địa phương. Đây là định nghĩa POSIX cho "Giây kể từ thời đại" .
cả hai: time.time()
không yêu cầu đồng hồ hệ thống của bạn phải được đồng bộ hóa để nó phản ánh giá trị của nó (mặc dù nó không liên quan gì đến múi giờ địa phương). Các máy tính khác nhau có thể nhận được kết quả khác nhau cùng một lúc. Mặt khác, nếu thời gian máy tính của bạn được đồng bộ hóa thì rất dễ lấy thời gian UTC từ dấu thời gian (nếu chúng ta bỏ qua giây nhuận):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
Về cách lấy dấu thời gian từ thời gian UTC trong các phiên bản Python khác nhau, hãy xem Làm cách nào tôi có thể nhận được ngày được chuyển đổi thành giây kể từ epoch theo UTC?
datetime.utcfromtimestamp
trong khi có 308 câu trả lời về câu trả lời với datetime.fromtimestamp
:-(
time.time()
hàm trả về (nó rất ngắn). Nhận xét của bạn giải quyết một số câu hỏi khác (bạn đã thay đổi nhận xét của mình kể từ khi tôi bắt đầu trả lời câu hỏi đó. Một lưu ý qua một bên; Từ "chính xác" nên được sử dụng một cách tiết kiệm (múi giờ rất phức tạp, không có viên đạn bạc nào mà chỉ đánh đổi cho một trường hợp sử dụng cụ thể).
datetime.datetime.utcfromtimestamp(ts)
. Trừ khi giờ địa phương của bạn là UTC, nó sẽ SAI, bởi vì nó tạo ra một thời gian ngây thơ không phải là giờ địa phương. Sử dụng datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
thay thế. Điều này tạo ra một mốc thời gian nhận biết múi giờ thể hiện cùng một lúc với dấu thời gian.
naive_dt.astimezone()
sẽ không tồn tại như ẩn bytes.encode()
không còn tồn tại trong Python 3. Đúng là có ích khi làm việc với thời gian UTC trong nội bộ trong nhiều trường hợp. Có rất nhiều điều có thể nói về mô-đun datetime (Tôi đã trả lời đủ câu hỏi để nhận huy hiệu vàng) hầu hết nằm ngoài phạm vi của câu hỏi: time.time()
trả về cái gì .
Cuối cùng tôi đã giải quyết cho:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
trả về số thập phân / float like 1574115250.818733
và mili giây-kể từ epoch dễ dàng, int(time.time() * 1000)
ví dụ1574115254915
Không có thứ gọi là "kỷ nguyên" trong múi giờ cụ thể. Kỷ nguyên được xác định rõ là một thời điểm cụ thể, vì vậy nếu bạn thay đổi múi giờ, thời gian cũng sẽ thay đổi. Cụ thể, lần này là Jan 1 1970 00:00:00 UTC
. Vì vậy, time.time()
trả về số giây kể từ kỷ nguyên.
dấu thời gian luôn là thời gian trong utc, nhưng khi bạn gọi datetime.datetime.fromtimestamp
nó sẽ trả về thời gian của bạn theo múi giờ địa phương tương ứng với dấu thời gian này, do đó kết quả phụ thuộc vào ngôn ngữ của bạn.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
Có thư viện tốt đẹp arrow
với hành vi khác nhau. Trong trường hợp tương tự, nó trả về cho bạn đối tượng thời gian với múi giờ UTC.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>