2012-06-12 8 views
9

Tôi muốn chuyển đổi giờ GMT thành EST và nhận được dấu thời gian. Tôi đã thử những điều sau nhưng không biết cách đặt múi giờ.Làm thế nào để chuyển đổi giờ GMT thành EST bằng cách sử dụng python

time = "Tue, 12 Jun 2012 14:03:10 GMT" 
timestamp2 = time.mktime(time.strptime(time, '%a, %d %b %Y %H:%M:%S GMT')) 
+7

Không có cách nào mà mã bạn đăng hoàn toàn, vì bạn đã đặt tên chuỗi là 'time' và sau đó cố gắng sử dụng hàm từ gói' time' không còn có thể truy cập tại tên đó nữa. – geoffspear

Trả lời

20

Múi giờ không được tích hợp vào Python chuẩn - bạn cần sử dụng thư viện khác. pytz là một lựa chọn tốt.

>>> gmt = pytz.timezone('GMT') 
>>> eastern = pytz.timezone('US/Eastern') 
>>> time = "Tue, 12 Jun 2012 14:03:10 GMT" 
>>> date = datetime.datetime.strptime(time, '%a, %d %b %Y %H:%M:%S GMT') 
>>> date 
datetime.datetime(2012, 6, 12, 14, 3, 10) 
>>> dategmt = gmt.localize(date) 
>>> dategmt 
datetime.datetime(2012, 6, 12, 14, 3, 10, tzinfo=<StaticTzInfo 'GMT'>) 
>>> dateeastern = dategmt.astimezone(eastern) 
>>> dateeastern 
datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>) 
3

Sử dụng pytz

from datetime import datetime 
from pytz import timezone 
fmt = "%Y-%m-%d %H:%M:%S %Z%z" 
now_time = datetime.now(timezone('US/Eastern')) 
print now_time.strftime(fmt) 
0

Nếu đó là múi giờ địa phương và các quy tắc múi giờ đều giống nhau cho thời gian nhất định vì họ là bây giờ thì bạn có thể sử dụng giải pháp stdlib chỉ (ngoại trừ một số cạnh trường hợp):

#!/usr/bin/env python 
from email.utils import parsedate_tz, mktime_tz 
from datetime import datetime 

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT")) 
print(datetime.fromtimestamp(timestamp)) 
# -> 2012-06-12 10:03:10 

Nếu không, bạn cần dữ liệu từ cơ sở dữ liệu múi giờ lịch sử để nhận đúng giá trị bù trừ. pytz module cung cấp quyền truy cập vào the tz database:

#!/usr/bin/env python 
from email.utils import parsedate_tz, mktime_tz 
from datetime import datetime 
import pytz # $ pip install pytz 

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT")) 
eastern_dt = datetime.fromtimestamp(timestamp, pytz.timezone('America/New_York')) 
print(eastern_dt.strftime('%a, %d %b %Y %H:%M:%S %z (%Z)')) 
# -> Tue, 12 Jun 2012 10:03:10 -0400 (EDT) 

Ghi chú: POSIX timestamp là như nhau trên toàn thế giới tức là, múi giờ địa phương của bạn không quan trọng nếu bạn muốn tìm dấu thời gian (trừ khi múi giờ của bạn là "đúng" loại) . Dưới đây là cách thực hiện convert a utc time to the timestamp.