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

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

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构建的东西都可以解决这个问题吗?解决我的两难困境?我全力以赴,真的坚持了这一点.

最佳答案
对于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小时内更轻松地进行减法.

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)

最后一点.你的文档字符串是:

@H_301_77@

(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')))
原文链接:https://www.f2er.com/python/439741.html

猜你在找的Python相关文章