Python – 使用am / pm将时间转换为不同的时区

前端之家收集整理的这篇文章主要介绍了Python – 使用am / pm将时间转换为不同的时区前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Python中,使用此函数(使用东部标准时间(EST)与am / pm,应以3种时间格式输出.中央时间(CT),山地时间(MT)和太平洋时间(PT)都在正确的上午/下午):

  1. def time_in_24h(time,time_day): #time is eastern time
  2. ''' (number,str)--> number
  3. This function converts a 12-hour time,represented by am/pm,to its equivalent 24-hour time.
  4. Returns time in the 24-hour format.
  5. '''
  6. cCentral = 'Central Time(CT)' #-1 hour offset
  7. mMountain = 'Mountain Time(MT)'#-2 hours offset
  8. pPacific = 'Pacific Time(PT)'#-3 hours offset
  9. eEst = 'EST is'
  10. if time_day!='pm' and time_day!='am':
  11. print('Input is not in the right format') #this is where input is not in the right format
  12. return 0
  13. else:
  14. print(time,time_day,eEst,time-1,cCentral)
  15. print(time,time-2,mMountain)
  16. print(time,time-3,pPacific)

使用此命令:

  1. time_in_24h(7,'am')

我得到这个输出

  1. 7 am EST is 6 Central Time(CT)
  2. 7 am EST is 5 Mountain Time(MT)
  3. 7 am EST is 4 Pacific Time(PT)

我试图根据EST的输入,am / pm到中央时间(CT),山地时间(MT)和太平洋时间(PT)输出正确的3次,所有这些都在正确的上午/下午.如何根据偏移量输出正确的上午/下午?例如,美国东部时间下午2点输入,应该输出

  1. 1 pm EST is 12 pm Central Time(CT)
  2. 1 pm EST is 11 am Mountain Time(MT)
  3. 1 pm EST is 10 am Pacific Time(PT)

如您所见,pm / am根据偏移进行更改并且不一致.根据时间(上午/下午)变化,最好的处理方法是什么?任何用python构建的东西都可以解决这个问题吗?解决我的两难困境?我全力以赴,真的坚持了这一点.

最佳答案
对于Central,只需检查东部时间是否是下午12点.如果是,则调整到上午11点.同样,如果东部是午夜,则调整到(11)pm.这需要一些ifs,但你可以做到.

问题是,它仍然是错误的.日期时间数学很难,你已经忘记了夏令时.

通常情况下,每年一次,东部时间(美国东部时间)凌晨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小时内更轻松地进行减法.

  1. def to_24hour(hour,ampm):
  2. """Convert a 12-hour time and "am" or "pm" to a 24-hour value."""
  3. if ampm == 'am':
  4. return 0 if hour == 12 else hour
  5. else:
  6. return 12 if hour == 12 else hour + 12
  7. def to_12hour(hour):
  8. """Convert a 24-hour clock value to a 12-hour one."""
  9. if hour == 0:
  10. return (12,'am')
  11. elif hour < 12:
  12. return (hour,'am')
  13. elif hour == 12:
  14. return (12,'pm')
  15. else:
  16. return (hour - 12,'pm')

一旦我们拥有了这些,事情会变得更简单:

  1. def time_in_24h(time,time_day): #time is eastern time
  2. ''' (number,str)--> number
  3. This function converts a 12-hour time,to its equivalent 24-hour time.
  4. Returns time in the 24-hour format.
  5. '''
  6. cCentral = 'Central Time(CT)' #-1 hour offset
  7. mMountain = 'Mountain Time(MT)'#-2 hours offset
  8. pPacific = 'Pacific Time(PT)'#-3 hours offset
  9. eEst = 'EST is'
  10. if time_day!='pm' and time_day!='am':
  11. print('Input is not in the right format') #this is where input is not in the right format
  12. return 0
  13. else:
  14. est_24hour = to_24hour(time,time_day)
  15. hour,ampm = to_12hour((est_24hour - 1 + 24) % 24)
  16. print(time,hour,ampm,cCentral)
  17. hour,ampm = to_12hour((est_24hour - 2 + 24) % 24)
  18. print(time,mMountain)
  19. hour,ampm = to_12hour((est_24hour - 3 + 24) % 24)
  20. print(time,pPacific)

……进行这些调整:

  1. >>> time_in_24h(1,'pm')
  2. 1 pm EST is 12 pm Central Time(CT)
  3. 1 pm EST is 11 am Mountain Time(MT)
  4. 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对时区没有帮助;贾斯汀巴伯在一个单独的答案中暗示了金字塔;这是一个不错的选择.

如果我们知道在东部有一些日期或时间:

  1. now = datetime.datetime(2014,3,14,12,34)

抓住时区:

  1. et = pytz.timezone('America/New_York')
  2. ct = pytz.timezone('America/Chicago')
  3. mt = pytz.timezone('America/Denver')
  4. pt = pytz.timezone('America/Los_Angeles')

我们可以转换为Central和其他:

  1. now_et = et.normalize(et.localize(now))
  2. now_ct = ct.normalize(now_et.astimezone(ct))
  3. now_mt = mt.normalize(now_et.astimezone(mt))
  4. now_pt = pt.normalize(now_et.astimezone(pt))

(正如评论所述,当一个变化可能越过DST边界时,pytz奇怪地需要调用来规范化,这基本上就是你做的事情.)

然后:

  1. print('{} Eastern in varIoUs other timezones:'.format(now_et.strftime('%I %p')))
  2. print('Central : {}'.format(now_ct.strftime('%I %p')))
  3. print('Mountain: {}'.format(now_mt.strftime('%I %p')))
  4. print('Pacific : {}'.format(now_pt.strftime('%I %p')))

猜你在找的Python相关文章