2013-03-27 46 views
8

Tôi có dấu thời gian trong thời gian epoch với nano giây - ví dụ: 1360287003083988472 nano giây từ 1970-01-01.Python - Chuyển đổi thời gian epoch với nano giây thành con người có thể đọc được?

Đối tượng datetime của Python và phương thức chuyển đổi chỉ hỗ trợ độ chính xác đến mili giây.

Có cách nào dễ dàng để chuyển đổi thời gian kỷ nguyên này thành thời gian có thể đọc được không?

Chúc mừng, Victor

+1

@abarnert Tôi không nghĩ vậy. Câu hỏi này đề cập đến việc chuyển đổi một số thành một chuỗi có thể đọc được con người, trong khi câu hỏi đó đang cố chuyển đổi từ một chuỗi thành một đối tượng 'datetime'. – ethguo

+0

@ ethg242: Câu hỏi đó sắp xếp tất cả mọi nơi, nhưng nó lại rơi xuống cùng một thứ: 'datetime' không xử lý nano giây, vì vậy bạn phải tự mình làm toán/chuỗi. Có lẽ có một câu hỏi về 'strptime' và một câu hỏi khác về' strftime'. – abarnert

+1

đây là một trong những tốt hơn so với các bản sao – n611x007

Trả lời

13

Thứ nhất, chuyển nó sang một đối tượng datetime với độ chính xác thứ hai (rối trí, không làm tròn):

>>> from datetime import datetime 
>>> dt = datetime.fromtimestamp(1360287003083988472 // 1000000000) 
>>> dt 
datetime.datetime(2013, 2, 7, 17, 30, 3) 

Sau đó, để làm cho nó con người có thể đọc được, sử dụng phương pháp strftime() trên đối tượng bạn quay lại:

>>> s = dt.strftime('%Y-%m-%d %H:%M:%S') 
>>> s 
'2013-02-07 17:30:03' 

Cuối cùng, thêm lại độ chính xác nano giây:

>>> s += '.' + str(int(1360287003083988472 % 1000000000)).zfill(9) 
>>> s 
'2013-02-07 17:30:03.083988472' 
3

Trên thực tế, phương pháp datetime Python của xử lý micro chính xác, không millisecond:

>>> nanos = 1360287003083988472 
>>> secs = nanos/1e9 
>>> dt = datetime.datetime.fromtimestamp(secs) 
>>> dt.strftime('%Y-%m-%dT%H:%M:%S.%f') 
'2013-02-07T17:30:03.083988' 

Nhưng nếu bạn thực sự cần nano giây, điều đó vẫn không giúp đỡ. Tốt nhất là để viết wrapper của riêng bạn:

def format_my_nanos(nanos): 
    dt = datetime.datetime.fromtimestamp(nanos/1e9) 
    return '{}{:03.0f}'.format(dt.strftime('%Y-%m-%dT%H:%M:%S.%f'), nanos % 1e3) 

này mang lại cho tôi:

'2013-02-07T17:30:03.083988472' 

Tất nhiên bạn có thể làm điều tương tự ngay cả khi Python đã không làm chính xác phụ thứ hai ở tất cả …

def format_my_nanos(nanos): 
    dt = datetime.datetime.fromtimestamp(nanos/1e9) 
    return '{}.{:09.0f}'.format(dt.strftime('%Y-%m-%dT%H:%M:%S'), nanos % 1e9) 
Các vấn đề liên quan