2010-04-05 42 views
6

Tôi đang sử dụng các chức năng sau:Python 3: dấu thời gian để datetime: thời gian bổ sung này đến từ đâu?

# The epoch used in the datetime API. 
EPOCH = datetime.datetime.fromtimestamp(0) 

def timedelta_to_seconds(delta): 
    seconds = (delta.microseconds * 1e6) + delta.seconds + (delta.days * 86400) 
    seconds = abs(seconds) 

    return seconds 

def datetime_to_timestamp(date, epoch=EPOCH): 
    # Ensure we deal with `datetime`s. 
    date = datetime.datetime.fromordinal(date.toordinal()) 
    epoch = datetime.datetime.fromordinal(epoch.toordinal()) 

    timedelta = date - epoch 
    timestamp = timedelta_to_seconds(timedelta) 

    return timestamp 

def timestamp_to_datetime(timestamp, epoch=EPOCH): 
    # Ensure we deal with a `datetime`. 
    epoch = datetime.datetime.fromordinal(epoch.toordinal()) 

    epoch_difference = timedelta_to_seconds(epoch - EPOCH) 
    adjusted_timestamp = timestamp - epoch_difference 

    date = datetime.datetime.fromtimestamp(adjusted_timestamp) 

    return date 

Và việc sử dụng chúng với mã thông qua:

twenty = datetime.datetime(2010, 4, 4) 

print(twenty) 
print(datetime_to_timestamp(twenty)) 
print(timestamp_to_datetime(datetime_to_timestamp(twenty))) 

Và nhận được kết quả như sau:

2010-04-04 00:00:00 
1270339200.0 
2010-04-04 01:00:00 

Đối với một số lý do, tôi đang nhận được thêm thêm giờ trong cuộc gọi cuối cùng, mặc dù mã của tôi có, theo như tôi thấy, không có lỗi.

Giờ bổ sung này đến từ đâu?

+0

Đã đến giờ mùa hè ở Anh chưa? – msw

+0

@msw Đó có phải là gợi ý cải trang về múi giờ không? ...Nó đã bắt đầu khoảng một tuần trước, nhưng tôi không nhìn thấy nơi trong mã của tôi nó xử lý các thông tin múi giờ hoặc hành vi ngây thơ như trái ngược với hành động không ngây thơ? –

+1

có, đó là một gợi ý, khi tôi nhận được kết quả tương tự và sáng vào ban ngày quá (trong Python 2.6). Bây giờ tôi đang nghiền ngẫm thông qua hoạt động datetime.tzinfo thần khủng khiếp trong khi tôi chờ thế giới chuyển sang http://en.wikipedia.org/wiki/Swatch_Internet_Time – msw

Trả lời

4
# Ensure we deal with `datetime`s. 
date = datetime.datetime.fromordinal(date.toordinal()) 

(Đó là chặt off the time-of-ngày hoàn toàn, như 'thứ' là chỉ có một số ngày. Có phải đó là những gì bạn có nghĩa là để làm gì? Tôi nghi ngờ không.)

Dù sao, như Michael cho biết, datetime.fromtimestamp cung cấp cho bạn thời gian chờ ngây thơ tương ứng với thời gian địa phương cho dấu thời gian POSIX (UTC) đó sẽ dành cho bạn. Vì vậy, khi bạn gọi -

date = datetime.datetime.fromtimestamp(adjusted_timestamp) 

bạn đang nhận được thời gian địa phương cho timestamp POSIX đại diện 2010-04-04T00: 00: 00, trong đó tất nhiên trong BST là một giờ trước. Điều này không xảy ra theo hướng trở lại bởi vì kỷ nguyên của bạn là vào tháng Giêng, khi BST không có hiệu lực. (Tuy nhiên, EPOCH cũng sẽ hoàn toàn tắt nếu bạn không ở Vương quốc Anh.)

Bạn nên thay thế cả việc sử dụng datetime.fromtimestamp bằng datetime.utcfromtimestamp.

Thật đáng buồn khi datetime tiếp tục truyền thống về thời gian lưu giữ trong thời gian địa phương khủng khiếp time. Gọi họ là 'ngây thơ' và lấy đi lá cờ DST chỉ khiến họ trở nên tồi tệ hơn. Cá nhân tôi không thể đứng để sử dụng datetime, thích dấu thời gian UTC nguyên cho mọi thứ (chuyển thành múi giờ địa phương chỉ để định dạng).

+0

API ngày của Python đã làm tôi sợ hãi khi sử dụng lại nó ... –

1

Đánh giá theo hồ sơ của bạn, bạn đang ở Vương quốc Anh. Điều đó có nghĩa là bạn hiện đang chạy trên UTC + 1 do DST.

Nếu tôi lấy dấu thời gian của bạn và chạy nó thông qua datetime.fromtimestamp trên Python 2.6 (tôi biết bạn sử dụng Python 3, nhưng đây là những gì tôi có), cho tôi thấy rằng nó tin nó đề cập đến 2010-04-04 02 : 00: 00 - và tôi đang ở CEST, vì vậy đó là UTC + 2.

Chạy datetime.fromtimestamp (0), tôi nhận được rằng kỷ nguyên là 1970-01-01 01:00:00. Điều này sau đó cho tôi thấy rằng nó là chính xác chỉ thêm một giờ (kể từ ngày 1 tháng 1 là bên ngoài của DST, và kỷ nguyên là nửa đêm UTC vào ngày đó, nó sẽ là 01:00 ở đây).

Nói cách khác, vấn đề của bạn là bạn đang gửi trong một thời gian có DST được áp dụng, nhưng datetime_to_timestamp coi nó như thể DST không tồn tại. timestamp_to_datetime, tuy nhiên, áp dụng DST.

Thật không may, tôi không biết đủ Python để biết cách bạn sẽ giải quyết vấn đề này, nhưng điều này ít nhất sẽ cung cấp cho bạn điều gì đó để tiếp tục.

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