2012-06-12 61 views
37

Tôi đang tìm một cách nhanh chóng để nhập trong một thời gian và sau đó python chuyển đổi nó thành múi giờ khác (có thể lên đến 10 múi giờ khác nhau)Chuyển đổi múi giờ của Python

Xin lỗi. Tôi không quen với thời gian trong python ở tất cả, nếu ai đó có thể đưa tôi đi đúng hướng tôi sẽ thực sự đánh giá cao nó.

Trả lời

38

Sử dụng pytz

from datetime import datetime 
from pytz import timezone 

fmt = "%Y-%m-%d %H:%M:%S %Z%z" 
timezonelist = ['UTC','US/Pacific','Europe/Berlin'] 
for zone in timezonelist: 

    now_time = datetime.now(timezone(zone)) 
    print now_time.strftime(fmt) 
+8

lưu ý: nó in * các khoảnh khắc * thời gian khác nhau trong * múi giờ khác nhau *. OP hỏi về ** cùng một thời điểm ** trong các múi giờ khác nhau. – jfs

49

Tôi nhận thấy rằng cách tiếp cận tốt nhất là chuyển đổi "khoảnh khắc" quan tâm đến đối tượng ngày giờ nhận biết utc-timezone (trong python, không cần thành phần múi giờ cho đối tượng datetime).

Sau đó, bạn có thể sử dụng astimezone để chuyển đổi sang múi giờ quan tâm (reference).

from datetime import datetime 
import pytz 

utcmoment_naive = datetime.utcnow() 
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc) 

# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2 
print("utcmoment_naive: {0}".format(utcmoment_naive)) 
print("utcmoment:  {0}".format(utcmoment)) 

localFormat = "%Y-%m-%d %H:%M:%S" 

timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico'] 

for tz in timezones: 
    localDatetime = utcmoment.astimezone(pytz.timezone(tz)) 
    print(localDatetime.strftime(localFormat)) 

# utcmoment_naive: 2017-05-11 17:43:30.802644 
# utcmoment:  2017-05-11 17:43:30.802644+00:00 
# 2017-05-11 10:43:30 
# 2017-05-11 19:43:30 
# 2017-05-11 13:43:30 

Như vậy, với những khoảnh khắc quan tâm trong múi giờ địa phương (một thời điểm đó exists), bạn chuyển nó sang utc như thế này (reference).

localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat) 

localtimezone = pytz.timezone('Australia/Adelaide') 

try: 
    localmoment = localtimezone.localize(localmoment_naive, is_dst=None) 
    print("Time exists") 

    utcmoment = localmoment.astimezone(pytz.utc) 

except pytz.exceptions.NonExistentTimeError as e: 
    print("NonExistentTimeError") 
+6

hãy cẩn thận, giờ địa phương có thể không rõ ràng và chuỗi đã cho có thể không tương ứng với bất kỳ thời gian hiện tại nào, ví dụ: do chuyển tiếp DST. Cung cấp 'localize (is_dst = None)' nếu bạn muốn tăng ngoại lệ trong các trường hợp như vậy. – jfs

+0

Cảm ơn tôi đã chỉnh sửa câu trả lời. – juan

+0

Mã được cập nhật (python 3, múi giờ). – juan

2

Đối với Python 3.2+ simple-date là một trình bao bọc xung quanh pytz cố gắng đơn giản hóa mọi thứ.

Nếu bạn có một time sau đó

SimpleDate(time).convert(tz="...") 

có thể làm những gì bạn muốn. Nhưng múi giờ là những thứ khá phức tạp, vì vậy nó có thể phức tạp hơn một cách đáng kể - xem the docs.

5

Để chuyển đổi một lần trong một múi giờ múi giờ khác trong Python, bạn có thể use datetime.astimezone():

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone) 

Với aware_dt (một đối tượng datetime ở một số múi giờ), để chuyển nó sang múi giờ khác và in lần trong một định dạng thời gian nhất định:

#!/usr/bin/env python3 
import pytz # $ pip install pytz 

time_format = "%Y-%m-%d %H:%M:%S%z" 
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York'] 
for tz in map(pytz.timezone, tzids): 
    time_in_tz = aware_dt.astimezone(tz) 
    print(f"{time_in_tz:{time_format}}") 

Nếu f"" cú pháp không có sẵn, bạn có thể thay thế nó bằng "".format(**vars())

nơi bạn có thể thiết lập aware_dt kể từ thời điểm hiện tại trong múi giờ địa phương:

from datetime import datetime 
import tzlocal # $ pip install tzlocal 

local_timezone = tzlocal.get_localzone() 
aware_dt = datetime.now(local_timezone) # the current time 

Hoặc từ chuỗi thời gian đầu vào trong múi giờ địa phương:

naive_dt = datetime.strptime(time_string, time_format) 
aware_dt = local_timezone.localize(naive_dt, is_dst=None) 

nơi time_string có thể trông giống như: '2016-11-19 02:21:42'. Nó tương ứng với time_format = '%Y-%m-%d %H:%M:%S'.

is_dst=None buộc ngoại lệ nếu chuỗi thời gian đầu vào tương ứng với thời gian địa phương không tồn tại hoặc không rõ ràng như trong quá trình chuyển đổi DST. Bạn cũng có thể vượt qua is_dst=False, is_dst=True.Xem các liên kết với thêm chi tiết tại Python: How do you convert datetime/timestamp from one timezone to another timezone?

2
import datetime 
import pytz 

def convert_datetime_timezone(dt, tz1, tz2): 
    tz1 = pytz.timezone(tz1) 
    tz2 = pytz.timezone(tz2) 

    dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S") 
    dt = tz1.localize(dt) 
    dt = dt.astimezone(tz2) 
    dt = dt.strftime("%Y-%m-%d %H:%M:%S") 

    return dt 

-

  • dt: ngày thời gian chuỗi
  • tz1: thời gian ban đầu khu
  • tz2: múi giờ mục tiêu

-

> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT") 
'2017-05-13 05:56:32' 

> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC") 
'2017-05-13 12:56:32' 

-

> pytz.all_timezones[0:10] 
['Africa/Abidjan', 
'Africa/Accra', 
'Africa/Addis_Ababa', 
'Africa/Algiers', 
'Africa/Asmara', 
'Africa/Asmera', 
'Africa/Bamako', 
'Africa/Bangui', 
'Africa/Banjul', 
'Africa/Bissau'] 
0

Tôi hy vọng tôi không quá muộn!

Thư viện pendulum vượt trội ở điều này và các tính toán ngày giờ khác.

>>> import pendulum 
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao'] 
>>> heres_a_time = '1996-03-25 12:03 -0400' 
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z') 
>>> for tz in some_time_zones: 
...  tz, pendulum_time.astimezone(tz) 
...  
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>) 
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>) 
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>) 
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>) 
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>) 
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>) 

Answer danh sách tên của các múi giờ mà có thể được sử dụng với con lắc. (Chúng giống với pytz.)

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