Thời gian của Python.time () có trả về dấu thời gian cục bộ hoặc UTC không?


559

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?


87
Dấu thời gian không có múi giờ. Chúng đại diện cho một số giây kể từ kỷ nguyên. Kỷ nguyên là một thời điểm cụ thể không phụ thuộc vào múi giờ.
JWG

2
@jwg: dấu thời gian POSIX thường được sử dụng không tính số giây nhuận và do đó chúng không phải là "số [SI đã trôi qua] kể từ thời điểm" (chúng gần).
jfs

7
Tôi không nghĩ rằng đây là một phản đối chính xác @JFSebastian. Leap giây không phải là 'giây trôi qua kể từ thời đại'. Chúng là những thay đổi trong biểu diễn thời gian được ghi lại bởi đồng hồ không tương ứng với giây trôi qua.
jwg

4
@JFSebastian Xin lỗi vì sự nhầm lẫn. Leap giây không phải là 'giây trôi qua'. Do đó, dấu thời gian, là 'số giây trôi qua', không và không bao gồm giây nhuận.
jwg

2
@jwg sai rồi. Bạn không thể xóa thời gian vật lý. Dấu thời gian POSIX không phải là số giây SI đã trôi qua. Dưới đây là một ví dụ: 3 giây trôi qua giữa "ngày 31 tháng 12 năm 2016 lúc 6:59:59 chiều" và "ngày 31 tháng 12 năm 2016 lúc 7:00:01 chiều" ở New York nhưng sự khác biệt trong dấu thời gian POSIX tương ứng chỉ là 2 giây ( bước nhảy vọt thứ hai không được tính).
jfs

Câu trả lời:


780

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 tsbiế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 datetimethư viện làm cho nó trở thành một chuỗi có thể đọc được.


72
Tại sao chúng ta nên import timekhi 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]
Hussain

17
@Alexis Unix epoch được định nghĩa khá rõ ràng ở đây . Nó thậm chí còn chỉ ra một ví dụ Python một cách xuống trang. Tôi không hiểu bình luận của bạn.
squiguy

9
@squiguy thành thật mà nói tôi không nhớ điều gì đã khiến tôi nói như vậy. Tôi đã phải đọc sai một cái gì đó, và tôi đã đấu tranh để tìm ra lý do tại sao một số bài kiểm tra bị phá vỡ trong khi tôi di chuyển giữa Pháp và Mỹ để cuối cùng thấy rằng vấn đề là do DST khiến tuần này kéo dài hơn trong năm này. Xin lỗi về điều đó và cảm ơn bạn đã chỉ ra điều này.
Alexis

5
nó không phải là "giây trong UTC." . Dấu thời gian được trả về 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).
jfs

3
chỉ thử nghiệm nó, time.time () không cho thời gian UTC, nó cho thời gian khu vực địa phương của tôi
sliders_alpha

301

Đâ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 nowkhác với utcnownhư 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

1
Tôi muốn thời gian kỷ nguyên .... không phải ở định dạng ngày ... như đã thấy rõ từ việc tôi đề cập đến thời gian chỉ huy.time ()
Saransh Mohapatra

34
OK, không vấn đề gì. Một số người khác có thể cần dấu thời gian nói để đặt vào tệp văn bản.
pepr

1
Tôi là một người khác, được chuyển hướng ở đây có khả năng do số lượng upvote không hợp lý . Câu hỏi không đúng định dạng và câu trả lời được chấp nhận gây hiểu lầm cho nhu cầu thông thường: lấy hậu tố có thể đọc được của con người - nói tên tệp - trong múi giờ máy chủ được sử dụng nhiều nhất.

Để in dấu thời gian như một phần của chuỗi, hãy sử dụng: Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

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.
Terrel Shumway

139

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.


1
Lý do cho việc đánh máy dấu thời gian là gì? Loại mặc định là gì?
Tizzee

3
@Tizzee type(time.time())đưa ra<type 'float'>
famousgarkin

4
Nhưng nếu bạn cần thời gian chính xác hơn tính bằng giây, thì phao có ý nghĩa.
pepr

3
@RudiStrydom: Python được gõ mạnh. Đừng nhầm lẫn nó với việc gõ tĩnh.
jfs

1
@CheokYanCheng: int()là đa hình. Nó sẽ trả về longnế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.
jfs

30

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?


4
Đây là câu trả lời duy nhất được đề cập chính xác datetime.utcfromtimestamptrong khi có 308 câu trả lời về câu trả lời với datetime.fromtimestamp:-(

@TerrelShumway câu hỏi là về những gì 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ể).
jfs

Không sử dụng 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.
Terrel Shumway

Đúng. Nhận xét trước đây của tôi đã chết sai. Hầu hết các mã trong mô-đun datetime coi các datetimes ngây thơ là giờ địa phương. Sử dụng datetimes ngây thơ giống như mở một tệp văn bản mà không biết mã hóa.
Terrel Shumway

@TerrelShumway Thật sai lầm khi cho rằng thời gian UTC chỉ có thể được sử dụng trên các hệ thống mà đó là giờ địa phương. Đúng là một số phần của stdlib coi các đối tượng datetime ngây thơ là có múi giờ cục bộ (đáng tiếc). Tôi muốn điều đó 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ì .
jfs

4

Cuối cùng tôi đã giải quyết cho:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

1
Điều đó có thể đáp ứng nhu cầu địa phương của bạn, nhưng nó có thể gây hiểu lầm cho những người mong đợi các con số trong phạm vi đó là vài giây kể từ kỷ nguyên [GMT]. time.time()trả về số thập phân / float like 1574115250.818733và mili giây-kể từ epoch dễ dàng, int(time.time() * 1000)ví dụ1574115254915
MarkHu

3

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.


Mặc dù đúng là UTC là tiêu chuẩn thời gian chứ không phải múi giờ, nhưng tiêu chuẩn là nó chia sẻ cùng thời gian với GMT. Vì vậy ....
Craig Hicks

3

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 arrowvớ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]>
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.