2015-05-26 16 views

Trả lời

3

Bạn đang thiếu .%fZ từ chuỗi định dạng của mình.

p = '%Y-%m-%dT%H:%M:%S.%fZ' 

Các cách chính xác để chuyển đổi sang kỷ nguyên là sử dụng datetime:

from datetime import datetime 

p = '%Y-%m-%dT%H:%M:%S.%fZ' 
mytime = "2009-03-08T00:27:31.807Z" 
epoch = datetime(1970, 1, 1) 
print((datetime.strptime(mytime, p) - epoch).total_seconds()) 

Hoặc gọi int nếu bạn muốn bỏ qua các phần phân đoạn.

+0

hoạt động tốt miễn là kết thúc bằng Z: P –

+1

@JoranBeasley. Trong sự khôn ngoan vô hạn của tôi, tôi dự đoán nó sẽ luôn luôn kết thúc bằng 'Z', tôi cho rằng bạn luôn có thể bỏ qua' Z' và rstrip ("Z") –

+1

không sử dụng 'time.mktime()' trên thời gian UTC! – jfs

1

Code:

import datetime 
epoch = datetime.datetime(1970, 1, 1) 

mytime = "2009-03-08T00:27:31.807Z" 
myformat = "%Y-%m-%dT%H:%M:%S.%fZ" 
mydt = datetime.datetime.strptime(mytime, myformat) 
val = (mydt - epoch).total_seconds() 

print(val) 
> 1236472051.81 
repr(val) 
> '1236472051.807' 

Ghi chú:

  • Khi sử dụng time.strptime(), các trở time.struct_time không hỗ trợ chính xác phụ thứ hai.
  • %fformat là dành cho micro giây. Khi phân tích cú pháp nó không cần phải là 6 chữ số đầy đủ.
1

dateutil là thư viện duy nhất tôi đã tìm thấy rằng một cách chính xác giao dịch với múi giờ bù đắp identitifier (Z)

pip install python-dateutil 

sau đó

from dateutil.parser import parse as date_parse 
print date_parse("2009-03-08T00:27:31.807Z") 
#get timestamp 

import calendar 
dt = date_parse("2009-03-08T00:27:31.807Z") 
timestamp1 = calendar.timegm(dt.timetuple()) 
+1

có lẽ là giải pháp mạnh mẽ hơn. –

+0

@PadraicCunningham: ít mạnh mẽ hơn nếu bạn muốn từ chối dấu thời gian sử dụng định dạng sai. 'dateutil' có thể chấp nhận quá nhiều. – jfs

+0

nó là một quá mức cần thiết để sử dụng 'dateutil' cho điều đó. Bạn có thể phân tích chuỗi thời gian bằng cách sử dụng chỉ stdlib trong cả Python 2 và 3. 'timegm()' là ok nếu bạn không quan tâm đến phân số của một giây. – jfs

12

Có hai phần:

  1. Chuyển đổi chuỗi thời gian thành thời gian bị hỏng. Xem How to parse ISO formatted date in python?
  2. Convert the UTC time to "seconds since the Epoch" (POSIX timestamp).
#!/usr/bin/env python 
from datetime import datetime 

utc_time = datetime.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = (utc_time - datetime(1970, 1, 1)).total_seconds() 
# -> 1236472051.807 

Nếu bạn chắc chắn rằng bạn muốn bỏ qua các phần phân đoạn của một giây và để có được một kết quả số nguyên:

#!/usr/bin/env python 
import time 
from calendar import timegm 

utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ") 
epoch_time = timegm(utc_time) 
# -> 1236472051 

Để hỗ trợ timestamps tương ứng với một bước nhảy vọt thứ hai như Wed July 1 2:59:60 MSK 2015 , bạn có thể use a combination of time.strptime() and datetime (if you care about leap seconds you should take into account the microseconds too).

+0

nếu bạn nhận được "2009-03-08T00: 27: 31.807A" hoặc bất kỳ khoản bù nào từ thời gian zulu? nhưng 1 cho chuyển đổi thời gian nhận thức địa phương :) –

+0

@JoranBeasley không đúng A không được phép – jfs

Các vấn đề liên quan