2012-08-25 36 views
6

Có rất nhiều câu hỏi về chuyển đổi datetime UTC và dường như không có sự nhất trí về "cách tốt nhất".Làm thế nào để, với python, có một datetime UTC, autodetect người dùng múi giờ, và chuyển đổi datetime để định dạng mong muốn?

Theo điều này: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, pytz là cách tốt nhất để thực hiện. ông cho thấy chuyển sang múi giờ như datetime.datetime.utcnow().replace(tzinfo=pytz.utc) này nhưng ông không nói như thế nào để có được múi giờ của người dùng ...

anh chàng này https://stackoverflow.com/a/7465359/523051 nói "localize điều chỉnh cho Daylight Savings Time, replace không"

Mọi người thấy tôi sử dụng pytz đang cung cấp múi giờ của riêng mình (users_timezone = timezone("US/Pacific")), mà tôi không hiểu vì bạn không thể biết liệu đó có phải là nơi mà người xem của bạn ...

Anh chàng này https://stackoverflow.com/a/4771733/523051 có cách tự động phát hiện múi giờ, nhưng điều này đang sử dụng thư viện dateutil và không phải pytz, như được đề xuất bởi cả Armin Ronacher và tài liệu chính thức của python (http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior, ngay phía trên cái neo đó trong hộp màu vàng)

Tất cả những gì tôi cần là đơn giản nhất, trong tương lai, bằng chứng, tiết kiệm ánh sáng ban ngày/etc được xem xét để lấy dấu ngày giờ của tôi. 2012-08-25 10:59:56.511479), chuyển đổi múi giờ của người dùng. Và hiển thị nó như thế này:

Aug 25 - 10:59AM 

và nếu năm nay không phải là năm nay, tôi muốn nói

Aug 25 '11 - 10:59AM 

Trả lời

3

ổn, ở đây nó là (cũng được, đóng góp đầu tiên của tôi để SO:))

nó đòi hỏi 2 thư viện bên ngoài mà có thể ném một số tắt ...

from datetime import datetime 
from dateutil import tz 
import pytz 

def standard_date(dt): 
    """Takes a naive datetime stamp, tests if time ago is > than 1 year, 
     determines user's local timezone, outputs stamp formatted and at local time.""" 

    # determine difference between now and stamp 
    now = datetime.utcnow() 
    diff = now - dt 

    # show year in formatting if date is not this year 
    if (diff.days/365) >= 1: 
     fmt = "%b %d '%y @ %I:%M%p" 
    else: 
     fmt = '%b %d @ %I:%M%p' 

    # get users local timezone from the dateutils library 
    # http://stackoverflow.com/a/4771733/523051 
    users_tz = tz.tzlocal() 

    # give the naive stamp timezone info 
    utc_dt = dt.replace(tzinfo=pytz.utc) 
    # convert from utc to local time 
    loc_dt = utc_dt.astimezone(users_tz) 
    # apply formatting 
    f = loc_dt.strftime(fmt) 

    return f 
+0

tôi đã học được rằng tzlocal() không làm việc ở tất cả trên heroku. Hàm trên chỉ đơn giản là trả về thời gian UTC. – chrickso

+0

cũng lưu ý, tôi đã mất tất cả hy vọng rằng đó là cách đáng tin cậy để xác định chính xác múi giờ của người dùng và điều chỉnh thời gian tự động. tôi thấy rằng twitter có cài đặt để điều chỉnh múi giờ của bạn vì vậy đây phải là cách: lưu trữ tùy chọn của người dùng và sử dụng tùy chọn đó cho chuyển đổi. – chrickso

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