Làm cách nào để có được giây kể từ epoch từ đầu ra thời gian + ngày của gmtime ()?


162

Làm thế nào để bạn làm ngược lại gmtime(), nơi bạn đặt thời gian + ngày và nhận được số giây?

Tôi có chuỗi thích 'Jul 9, 2009 @ 20:02:58 UTC'và tôi muốn lấy lại số giây giữa kỷ nguyên và ngày 9 tháng 7 năm 2009.

Tôi đã thử time.strftimenhưng tôi không biết sử dụng đúng cách hoặc nếu đó là lệnh chính xác để sử dụng.

Câu trả lời:


123

Nếu bạn đến đây vì một công cụ tìm kiếm nói với bạn đây là cách lấy dấu thời gian Unix, hãy ngừng đọc câu trả lời này. Cuộn xuống một cái.

Nếu bạn muốn đảo ngược time.gmtime(), bạn muốn calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Bạn có thể biến chuỗi của mình thành một tuple thời gian time.strptime(), trả về một tuple thời gian mà bạn có thể chuyển đến calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Thông tin thêm về mô-đun lịch tại đây


16
Nếu bạn đang tìm kiếm thời gian unix hiện tại, vui lòng tham khảo bình luận của @ DanJ hoặc câu trả lời của naren, câu trả lời này là không chính xác!
kosii

639

Sử dụng mô-đun thời gian :

epoch_time = int(time.time())

14
@DanJ: đó là số giây trôi qua kể từ Epoch (một thời điểm cố định) và nó giống nhau ở bất kỳ múi giờ nào. Mặc dù nếu chúng ta bỏ qua các trường hợp thời gian xung quanh giây nhuận; thật dễ dàng để chuyển đổi nó thành UTC nếu timesử dụng Unix epoch (1970).
jfs 17/11/13

42
Lưu ý đây không phải là những gì OP yêu cầu, nhưng đó là điều tôi muốn. Vậy +1.
sợ

6
đó là câu trả lời cho những gì được hỏi trong tiêu đề: "lấy thời gian kể từ thời đại". +1
AlejandroVD

@JFSebastian điều này mang lại kỷ nguyên cho giây. Làm cách nào tôi có thể nhận được độ phân giải tối đa milisecond bằng cách sử dụng cùng một câu trả lời ở trên?
Marlon Abeykoon

2
để mở rộng nhận xét của tôi ở trên : time.time()giá trị KHÔNG phụ thuộc vào múi giờ cục bộ (nếu chúng tôi loại trừ các múi giờ "đúng" và tương tự), vd, nếu nó trả về thời gian POSIX (như trên hầu hết các hệ thống) thì đó là số giây SI kể từ khi Đại Kỷ Nguyên (1970-01-01UTC) không tính giây nhuận. Giá trị này có thể được chuyển đổi thành UTC (không tính giây nhuận) nhưng nó không phải là UTC . @MarlonAbeykoon: Tôi thích câu trả lời này
jfs

10

Lưu ý rằng time.gmtimebản đồ dấu thời gian 0đến 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) cung cấp cho bạn dấu thời gian được thay đổi bởi số tiền phụ thuộc vào ngôn ngữ của bạn, mà nói chung có thể không phải là 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

Nghịch đảo time.gmtimecalendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0

Điều này đưa ra lời giải thích và ví dụ tốt hơn cho time.mktime (tính đến múi giờ hiện tại), cảm ơn
Jkm

@Jkm: KHÔNG sử dụng mktime()với gmtime(). mktime()chấp nhận giờ địa phương của bạn nhưng gmtime()trả về thời gian UTC - múi giờ địa phương của bạn có thể và có thể khác. "Dấu thời gian liên quan đến ngôn ngữ của bạn" là không có ý nghĩa: Dấu thời gian POSIX không phụ thuộc vào miền địa phương của bạn (múi giờ địa phương) - đó là cùng một giá trị trên toàn thế giới. "giây kể từ epoch" là dấu thời gian POSIX trong hầu hết các trường hợp (ngay cả trên Windows) - những thứ như múi giờ "đúng" sử dụng thang thời gian TAI không phổ biến. Xem Thời gian của Python.time () có trả về dấu thời gian cục bộ hoặc UTC không?
jfs

@JF Sebastian Bạn nói đúng. Trên thực tế tôi đã có một vài vấn đề về mktime()gần đây. Đối với một số máy chủ web python (ví dụ Tornado), do quá trình tiếp tục chạy, ngay cả khi tôi thay đổi ngôn ngữ hệ thống, mktime()API máy chủ web được gọi vẫn sử dụng múi giờ cũ để tạo đối tượng thời gian. Tôi phải chuyển sang gmtime()và tự áp dụng bù gmt.
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Điều này nên khác với int(time.time()), nhưng nó an toàn để sử dụng một cái gì đó nhưx % (60*60*24)

datetime - Các loại ngày và giờ cơ bản:

Không giống như mô-đun thời gian, mô-đun datetime không hỗ trợ giây nhuận.


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

Tôi không thể truy cập strptime vì một số lý do. Tôi đã nhập datetime
calccrypto

1
@calccrypto bạn phải from datetime import datetimehoặc làmdatetime.datetime.strptime
pathikrit

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.