我的目标是以字符串(包含UTC日期和时间)作为输入,并根据时区差异将其转换为本地时区。我想出了以下代码
代码
import time
print "Timezone Diff", time.timezone/3600
def convertTime(string):
print "Before Conversion"
print "year",string[0:4],"month",string[5:7],"day",string[8:10]
print "hour",string[11:13],"min",string[14:16]
print "After Conversion"
print "newhour",int(string[11:13])-(time.timezone/3600)
newhour = int(string[11:13])-(time.timezone/3600)
if newhour>=24:
print "year",string[0:4],"month",string[5:7],"newday",int(string[8:10])+1
print "hour",newhour-24,"min",string[14:16]
convertTime('2013:07:04:14:00')
输出:
Timezone Diff -10
Before Conversion
year 2013 month 07 day 04
hour 14 min 00
After Conversion
newhour 24
year 2013 month 07 newday 5
hour 0 min 00
此代码非常基本,显然不适用于月/年的更改,也不考虑闰年。有人能给我一个更好的方法来解决这个问题吗。
以下是一个包含datetime
和pytz
模块的解决方案,以我的时区为例:
import pytz
import datetime
s = '2013:07:04:14:00'
mydate = datetime.datetime.strptime(s, '%Y:%m:%d:%H:%M')
mydate = mydate.replace(tzinfo=timezone('Australia/Sydney'))
print mydate
打印:
2013-07-04 14:00:00+10:00
您可能需要对代码进行"整形"才能获得确切的输出,但我希望这能在任何方面有所帮助!
要仅使用stdlib将UTC时间转换为本地时区,可以使用中间时间戳值:
from datetime import datetime
def convertTime(timestring):
utc_dt = datetime.strptime(timestring, '%Y:%m:%d:%H:%M')
timestamp = (utc_dt - datetime.utcfromtimestamp(0)).total_seconds()
return datetime.fromtimestamp(timestamp) # return datetime in local timezone
请参阅如何仅使用python标准库将python utc日期时间转换为本地日期时间?。
为了支持具有不同utc偏移的过去日期,您可能需要pytz
、tzlocal
库(仅限stdlib的解决方案在Ubuntu上运行良好;基于pytz
的解决方案也应该启用Windows支持):
from datetime import datetime
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
# get local timezone
local_tz = get_localzone()
def convertTime(timestring):
utc_dt = datetime.strptime(timestring, '%Y:%m:%d:%H:%M')
# return naive datetime object in local timezone
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
#NOTE: .normalize might be unnecessary
return local_tz.normalize(local_dt).replace(tzinfo=None)
下面的代码为我解决了这个问题。尽管pytz
可能是最好的使用方法。但如果你没有pytz,下面的解决方案可能是一个替代方案。
import datetime
def convertTime(timestring):
UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
local_datetime = datetime.datetime.strptime(timestring, "%Y:%m:%d:%H:%M")
result_utc_datetime = local_datetime - UTC_OFFSET_TIMEDELTA
print result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S"),
s = '2013:07:07:14:00'
convertTime(s)