在Python中以AM / PM格式显示特定时区的Unix时间

时间:2018-09-20 01:39:48

标签: python datetime python-datetime pytz

我有一个包含unix时间和相应时区的大型电子表格。第1行的第1列可以是1538082000,第2列可以是America/New_York,第2行可以是1538083000America/Los_Angeles。在每种情况下,我都需要使用该时区内某个人的时间格式。

例如,在我的EDT示例(第1行)中,我想要Sept 27, 2018 5:00:00PM EDT,对于第2行,我想要Sept 27, 2018 2:16:40PM PDT

在尝试抓取数据并将其以更友好的格式显示给第三方时,我经常遇到这种情况,而我从来没有找到一种特别好的方法来做到这一点。

4 个答案:

答案 0 :(得分:1)

不使用Arrow的解决方案。

from datetime import datetime
from pytz import timezone

def convert_time(timestamp, tz):
    tzinfo = timezone(tz)
    dt = datetime.fromtimestamp(timestamp)
    fmt = "%b %d, %Y %-I:%M:%S%p "
    return dt.astimezone(tzinfo).strftime(fmt) + tzinfo.tzname(dt)

>>> ts = "1538082000"
>>> tz = "America/New_York"
>>> convert_time(int(ts), tz)
>>> Sep 27, 2018 5:00:00PM EDT

>>> ts2 = "1538083000"
>>> tz2 = "America/Los_Angeles"
>>> convert_time(int(ts2), tz2)
>>> Sep 27, 2018 2:16:40PM PDT

答案 1 :(得分:1)

使用Arrow

>>> import arrow
>>> utc =  arrow.Arrow.fromtimestamp(1538082000)
>>> conv = utc.to('America/New_York')
>>> conv.format("MMM D, YYYY h:mm:ssA ") + conv.tzname()

结果:Sep 27, 2018 5:00:00PM EDT

第二个例子:

>>> from dateutil import tz
>>> t = arrow.Arrow.fromtimestamp(1538083000, tzinfo=tz.gettz("America/Los_Angeles"))
>>> t.format("MMM D, YYYY h:mm:ssA ") + t.tzname()

结果为Sep 27, 2018 2:16:40PM PDT

您可以使用to使用第一种形式,也可以像第二个示例一样将tzinfo传递给fromtimestamp。我个人认为第一种形式看起来更干净。

答案 2 :(得分:0)

使用datetime.strftime()

导入日期时间

t = 1538082000

dt = datetime.datetime.fromtimestamp(t)

formatted = dt.strftime("%b %d, %Y %H:%M:%S")

formatted
>>> Sep 28, 2018 07:00:00

根据文档,time.time()会根据1970年1月1日UTC生成时间戳。这样,您就可以使用该信息根据时区添加/减去小时数。

例如墨尔本/悉尼(UTC + 10:00)

t = 1538082000

dt = datetime.datetime.fromtimestamp(t)

tz_dt = dt + datetime.timedelta(hours=10)

tz_dt.strftime("%b %d, %Y %H:%M:%S")

tz_dt
>>> 2018-09-28 17:00:00

Here是strftime的文档,它将帮助您格式化答案。

答案 3 :(得分:0)

使用%I将Hour格式化为12-hour time,而%p将返回AM/PM
使用pytz也可以:

from datetime import datetime
import pytz


def convert_time(timestamp, tz):
    eastern = pytz.timezone('UTC')
    tzinfo = pytz.timezone(tz)
    loc_dt = eastern.localize(datetime.utcfromtimestamp(timestamp))
    fmt = "%b %d, %Y %I:%M:%S%p %Z"
    return loc_dt.astimezone(tzinfo).strftime(fmt)


ts = "1538082000"
tz = "America/New_York"
print(convert_time(int(ts), tz))

>> Sep 28, 2018 05:00:00PM EDT

ts = "1538083000"
tz = "America/Los_Angeles"
print(convert_time(int(ts), tz))

>> Sep 28, 2018 02:16:40PM PDT