2008-09-22 33 views
38

Tôi làm cách nào để trình bày đúng múi giờ khác nhau trong múi giờ của mình? Ví dụ dưới đây chỉ hoạt động bởi vì tôi biết rằng EDT là một giờ trước tôi, vì vậy tôi có thể bỏ ghi chú trừ của myTimeZone()Làm cách nào để sử dụng múi giờ với đối tượng datetime trong python?

import datetime, re 
from datetime import tzinfo 

class myTimeZone(tzinfo): 
    """docstring for myTimeZone""" 
    def utfoffset(self, dt): 
     return timedelta(hours=1) 

def myDateHandler(aDateString): 
    """u'Sat, 6 Sep 2008 21:16:33 EDT'""" 
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)') 
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups() 
    month = [ 
      'JAN', 'FEB', 'MAR', 
      'APR', 'MAY', 'JUN', 
      'JUL', 'AUG', 'SEP', 
      'OCT', 'NOV', 'DEC' 
    ].index(month.upper()) + 1 
    dt = datetime.datetime(
     int(year), int(month), int(day), 
     int(hour), int(minute), int(second) 
    )     
    # dt = dt - datetime.timedelta(hours=1) 
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone()) 
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0) 

def main(): 
    print myDateHandler("Sat, 6 Sep 2008 21:16:33 EDT") 

if __name__ == '__main__': 
    main() 
+0

Hãy xem [câu trả lời này] (http://stackoverflow.com/a/18646797/2697658). Hy vọng nó giúp! – juan

+0

định dạng ngày/giờ cụ thể của bạn có thể được xử lý bằng gói 'email.utils' stdlib: [' ts ​​= mktime_tz (parsedate_tz ('Sat, 6 Sep 2008 21:16:33 EDT')) '] (http: // stackoverflow .com/a/23117071/4279) – jfs

Trả lời

9

Các Python thư viện chuẩn không chứa thông tin múi giờ, vì không may thay đổi dữ liệu múi giờ nhanh hơn rất nhiều so với Python. Bạn cần một mô-đun bên thứ ba cho việc này; lựa chọn thông thường là pytz

+1

Điều đó không giải thích tại sao thư viện chuẩn không thể xử lý -500. –

+5

Đó không phải là lý do hợp lệ. Thư viện chuẩn có thể sử dụng tài nguyên trên nền tảng mà nó đang chạy nếu có và giảm xuống một cách duyên dáng nếu không tìm thấy lịch sử múi giờ. –

+0

@ Prof.Falken: làm thế nào bạn có thể giảm xuống một cách duyên dáng nếu thông tin múi giờ không có sẵn (tăng ngoại lệ, trả về (có thể) kết quả sai, cả hai)? btw, xem [PEP 431: Cải tiến hỗ trợ múi giờ] (http://legacy.python.org/dev/peps/pep-0431/) – jfs

37

Tôi khuyên bạn nên babelpytz khi làm việc với múi giờ. Giữ các đối tượng datetime nội bộ của bạn ngây thơ và trong UTC và chuyển đổi thành múi giờ của bạn chỉ để định dạng. Lý do tại sao bạn có thể muốn các đối tượng ngây thơ (các đối tượng không có thông tin múi giờ) là nhiều thư viện và bộ điều hợp cơ sở dữ liệu không có ý tưởng về múi giờ.

+0

Cảm ơn bạn đã giới thiệu pytz. –

+0

Vui lòng cập nhật liên kết của Babel lên http://babel.pocoo.org/ (như trang web cũ nói) – saeedgnu

+0

Cũng lưu ý rằng babel nằm trên đầu trang của pytz – saeedgnu

7

Đối với múi giờ địa phương hiện tại, bạn có thể sử dụng:

>>> import time 
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone 
>>> offset/60/60 * -1 
-9 

Giá trị trả lại là trong vài giây Tây UTC (với các khu vực phía Đông của UTC nhận giá trị âm). Điều này trái ngược với cách chúng ta thực sự thích nó, do đó là * -1.

localtime().tm_isdst sẽ bằng không nếu tiết kiệm ánh sáng ban ngày hiện không có hiệu lực (mặc dù điều này có thể không đúng nếu gần đây đã thay đổi luật tiết kiệm ánh sáng ban ngày).

+0

['time.timezone' và' time.altzone' không đủ trong một số trường hợp] (http://stackoverflow.com/q/3168096/4279) – jfs

-2

Chúng tôi đã quen thuộc với múi giờ bị cắt khỏi GMT (giờ là UTC), nhưng Python mất múi giờ bị cắt khỏi phương Tây. Đó là lý do tại sao có sự cắt giảm múi giờ âm trong Python, tôi tin.

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