2012-10-19 33 views
13

Im đang làm việc để chuyển đổi dấu thời gian epoch thành các ngày trong các múi giờ khác nhau với pytz. Những gì tôi đang cố gắng làm là tạo ra một đối tượng DateTime chấp nhận một múi giờ cơ sở dữ liệu Olson và một thời gian epoch và trả về một đối tượng datetime đã bản địa hoá. Cuối cùng tôi cần phải trả lời các câu hỏi như "Giờ nó ở New York vào thời điểm kỷ nguyên 1350663248?"Bản địa hóa thời gian Epoch với pytz bằng Python

xảy ra sự cố một cách chính xác ở đây:

import datetime, pytz, time 

class DateTime: 
    def __init__(self, timezone, epoch): 
     self.timezone = timezone 
     self.epoch = epoch 
     timezoneobject = pytz.timezone(timezone) 
     datetimeobject = datetime.datetime.fromtimestamp(self.epoch) 
     self.datetime = timezoneobject.localize(datetimeobject) 

    def hour(self): 
     return self.datetime.hour 

if __name__=='__main__': 
    epoch = time.time() 
    dt = DateTime('America/Los_Angeles',epoch) 
    print dt.datetime.hour 
    dt = DateTime('America/New_York',epoch) 
    print dt.datetime.hour 

này in cùng một giờ, trong khi người ta phải 3 giờ hoặc lâu hơn trước. Có gì sai ở đây? Tôi là một người mới bắt đầu Python, mọi trợ giúp đều được đánh giá cao!

+0

Bạn đang sử dụng thuật ngữ sai ở đây. Kỷ nguyên là * luôn luôn * 1-1-1970, nửa đêm UTC. Những gì bạn có là một dấu thời gian UNIX, đó là một bù đắp từ kỷ nguyên. Xem https://en.wikipedia.org/wiki/Unix_epoch –

+0

chỉ là một tên biến, bạn có thể gọi nó là 'epoch_time' nó làm cho không có sự khác biệt cho vấn đề – mobiusinversion

Trả lời

-3
epochdt = datetime.datetime.fromtimestamp(epoch) 
timezone1 = timezone("Timezone/String") 
adjusted_datetime = timezone1.localize(epochdt) 

Làm việc từ bộ nhớ, do đó, xin lỗi bất kỳ lỗi cú pháp nào, nhưng điều đó sẽ giúp bạn đi đúng hướng.

CHỈNH SỬA: Bỏ lỡ phần biết giờ, v.v. Python có số lượng lớn Time/Date Formatting. Ở phần dưới cùng của liên kết đó là bảng hiển thị cách kéo các thuộc tính khác nhau từ đối tượng datetime.

+0

Đó là những gì OP đang làm. –

+0

Thats khá giống với cách tiếp cận ban đầu, nhưng việc thực hiện điều này vẫn in ra cùng một giờ (trong mã __main__ ở trên). Về cơ bản là 8 giờ sáng của tôi ngay bây giờ. Những gì im cố gắng tìm ra là làm thế nào để có được mã trên để in 8 và 11m tức là cho Mỹ/Los_Angeles và Mỹ/New_York tương ứng. – mobiusinversion

19

datetime.fromtimestamp(self.epoch) trả về giờ địa phương không được sử dụng với một múi giờ tùy ý.localize(); bạn cần utcfromtimestamp() để có được datetime trong UTC và sau đó chuyển nó sang một múi giờ mong muốn:

from datetime import datetime 
import pytz 

# get time in UTC 
utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc) 

# convert it to tz 
tz = pytz.timezone('America/New_York') 
dt = utc_dt.astimezone(tz) 

# print it 
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z')) 

Hoặc một giải pháp đơn giản hơn là xây dựng từ timestamp trực tiếp:

from datetime import datetime 
import pytz 

# get time in tz 
tz = pytz.timezone('America/New_York') 
dt = datetime.fromtimestamp(posix_timestamp, tz) 
# print it 
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z')) 

Nó chuyển đổi từ UTC ngầm trong này trường hợp.

0

Để tạo đối tượng datetime thuộc múi giờ cụ thể từ dấu thời gian unix, bạn có thể chuyển đối tượng pytz làm thông số tz khi tạo datetime. Ví dụ:

>>> from datetime import datetime 
>>> import pytz 

>>> datetime.fromtimestamp(1350663248, tz= pytz.timezone('America/New_York')) 
datetime.datetime(2012, 10, 19, 12, 14, 8, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>) 

Bạn có thể lấy danh sách tất cả các múi giờ sử dụng pytz.all_timezones.

Ngoài ra, hãy xem List of tz database time zones wiki.

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