【问题标题】:Display unix time in specific timezone in AM/PM format in Python在 Python 中以 AM/PM 格式显示特定时区的 unix 时间
【发布时间】:2019-02-24 05:55:01
【问题描述】:

我有一个包含 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

我在尝试抓取数据并以对第 3 方更友好的格式显示数据时经常遇到这种情况,但我一直找不到特别好的方法。

【问题讨论】:

标签: python datetime python-datetime pytz


【解决方案1】:

使用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 的文档,有助于格式化您的答案。

【讨论】:

  • 我实际上在特定时区需要它。我特别有兴趣在不一定是我的当地时间的特定时区中查找当地时间。大大澄清了我的问题!
  • 我将如何获取每个时区的整数小时偏移量以插入 timedelta 并知道它是 UTC 的 + 小时还是 - 小时? fromtimestamp() 返回我机器上的本地时间,所以在我的情况下(在 CDT 的笔记本电脑上)你的示例返回 Sep 28, 2018 02:00:00
【解决方案2】:

使用 %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

【讨论】:

  • 嘿,我澄清了我的问题,以便更清楚地了解我在寻找什么。我特别有兴趣在不一定是我的当地时间的特定时区找到当地时间。
  • @NickCatal 我更新了我的答案,使用 pytz 也可以工作,也许对你来说更容易
【解决方案3】:

不使用 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

【讨论】:

    【解决方案4】:

    使用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。就个人而言,我认为第一种形式看起来更干净。

    【讨论】:

    • 完美!箭头库似乎比 python 的内置功能更加理智。将它添加到我的图书馆盒子中,以便随时使用!
    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2013-08-19
    • 2013-09-15
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多