在Python中,使用此函数(使用东部标准时间(EST)与am / pm,应以3种时间格式输出.中央时间(CT),山地时间(MT)和太平洋时间(PT)都在正确的上午/下午):
def time_in_24h(time,time_day): #time is eastern time
''' (number,str)--> number
This function converts a 12-hour time,represented by am/pm,to its equivalent 24-hour time.
Returns time in the 24-hour format.
'''
cCentral = 'Central Time(CT)' #-1 hour offset
mMountain = 'Mountain Time(MT)'#-2 hours offset
pPacific = 'Pacific Time(PT)'#-3 hours offset
eEst = 'EST is'
if time_day!='pm' and time_day!='am':
print('Input is not in the right format') #this is where input is not in the right format
return 0
else:
print(time,time_day,eEst,time-1,cCentral)
print(time,time-2,mMountain)
print(time,time-3,pPacific)
使用此命令:
time_in_24h(7,'am')
我得到这个输出:
7 am EST is 6 Central Time(CT)
7 am EST is 5 Mountain Time(MT)
7 am EST is 4 Pacific Time(PT)
我试图根据EST的输入,am / pm到中央时间(CT),山地时间(MT)和太平洋时间(PT)输出正确的3次,所有这些都在正确的上午/下午.如何根据偏移量输出正确的上午/下午?例如,美国东部时间下午2点输入,应该输出:
1 pm EST is 12 pm Central Time(CT)
1 pm EST is 11 am Mountain Time(MT)
1 pm EST is 10 am Pacific Time(PT)
如您所见,pm / am根据偏移进行更改并且不一致.根据时间(上午/下午)变化,最好的处理方法是什么?任何用python构建的东西都可以解决这个问题吗?解决我的两难困境?我全力以赴,真的坚持了这一点.
问题是,它仍然是错误的.日期时间数学很难,你已经忘记了夏令时.
通常情况下,每年一次,东部时间(美国东部时间)凌晨1点,中部时间(CDT)凌晨1点. (同样,它也是东部时间凌晨3点,中部时间凌晨1点.)
根据您的功能当前所需的输入量,您不能说明这一点:您需要知道完整的日期和时间.完成后,最简单的方法是将完整的东部(America / NewYYork)日期和时间转换为UTC,然后将其转换为Central(America / Chicago),Mountain(America / Denver)和Pacific(America / Los_Angeles).
America / …位是大多数机器上的TZ数据库使用的时区的名称. America / New_York是“东部”时间:它指定DST何时,何时不是,以及与UTC的偏移量.甚至还有历史数据,作为夏令时开始的日期和时间.结束了. (在全球范围内,实际上经常发生变化.政府……)
保持非DST感知版本:
首先,让我们得到两个辅助函数:to_24hour,它将(小时,安培)转换为24小时格式,而to_12小时则转换为另一种方式.这些将使事情更容易思考,因为我们可以在24小时内更轻松地进行减法.
def to_24hour(hour,ampm):
"""Convert a 12-hour time and "am" or "pm" to a 24-hour value."""
if ampm == 'am':
return 0 if hour == 12 else hour
else:
return 12 if hour == 12 else hour + 12
def to_12hour(hour):
"""Convert a 24-hour clock value to a 12-hour one."""
if hour == 0:
return (12,'am')
elif hour < 12:
return (hour,'am')
elif hour == 12:
return (12,'pm')
else:
return (hour - 12,'pm')
一旦我们拥有了这些,事情会变得更简单:
def time_in_24h(time,time_day): #time is eastern time
''' (number,str)--> number
This function converts a 12-hour time,to its equivalent 24-hour time.
Returns time in the 24-hour format.
'''
cCentral = 'Central Time(CT)' #-1 hour offset
mMountain = 'Mountain Time(MT)'#-2 hours offset
pPacific = 'Pacific Time(PT)'#-3 hours offset
eEst = 'EST is'
if time_day!='pm' and time_day!='am':
print('Input is not in the right format') #this is where input is not in the right format
return 0
else:
est_24hour = to_24hour(time,time_day)
hour,ampm = to_12hour((est_24hour - 1 + 24) % 24)
print(time,hour,ampm,cCentral)
hour,ampm = to_12hour((est_24hour - 2 + 24) % 24)
print(time,mMountain)
hour,ampm = to_12hour((est_24hour - 3 + 24) % 24)
print(time,pPacific)
……进行这些调整:
>>> time_in_24h(1,'pm')
1 pm EST is 12 pm Central Time(CT)
1 pm EST is 11 am Mountain Time(MT)
1 pm EST is 10 am Pacific Time(PT)
最后一点.你的文档字符串是:
(number,str)–> number
This function converts a 12-hour time,to its equivalent 24-hour time.
Returns time in the 24-hour format.
当然,这是to_24hour的作用.
具有时区意识
Python对时区没有帮助;贾斯汀巴伯在一个单独的答案中暗示了金字塔;这是一个不错的选择.
如果我们知道在东部有一些日期或时间:
now = datetime.datetime(2014,3,14,12,34)
抓住时区:
et = pytz.timezone('America/New_York')
ct = pytz.timezone('America/Chicago')
mt = pytz.timezone('America/Denver')
pt = pytz.timezone('America/Los_Angeles')
我们可以转换为Central和其他:
now_et = et.normalize(et.localize(now))
now_ct = ct.normalize(now_et.astimezone(ct))
now_mt = mt.normalize(now_et.astimezone(mt))
now_pt = pt.normalize(now_et.astimezone(pt))
(正如评论所述,当一个变化可能越过DST边界时,pytz奇怪地需要调用来规范化,这基本上就是你做的事情.)
然后:
print('{} Eastern in varIoUs other timezones:'.format(now_et.strftime('%I %p')))
print('Central : {}'.format(now_ct.strftime('%I %p')))
print('Mountain: {}'.format(now_mt.strftime('%I %p')))
print('Pacific : {}'.format(now_pt.strftime('%I %p')))