在 Python 中以 AM/PM 格式显示特定时区的 unix 时间
Display unix time in specific timezone in AM/PM format in Python
我有一个很大的 unix 时间和相应时区的电子表格。第 1 行第 1 列可能是 1538082000
,第 2 列可能是 America/New_York
,第 2 行可能是 1538083000
和 America/Los_Angeles
。在每种情况下,我都需要它们的时间格式,它适用于该时区内的某个人。
例如,在我的 EDT 示例(第 1 行)中,我想要 Sept 27, 2018 5:00:00PM EDT
,对于第 2 行,我想要 Sept 27, 2018 2:16:40PM PDT
.
我 运行 在尝试抓取数据并以对第 3 方更友好的格式显示数据时经常使用此方法,但我从来没有找到一种特别好的方法来做到这一点。
使用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() 从 1/1/1970 UTC 生成时间戳。因此,您可以根据时区使用该信息 add/subtract 小时。
例如Melbourne/Sydney (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 的文档,这将有助于格式化您的答案。
使用 %I
会将 Hour 格式化为 12-hour time
,而 %p
将 return 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
不使用 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
使用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
。我个人认为第一种形式看起来更干净。
我有一个很大的 unix 时间和相应时区的电子表格。第 1 行第 1 列可能是 1538082000
,第 2 列可能是 America/New_York
,第 2 行可能是 1538083000
和 America/Los_Angeles
。在每种情况下,我都需要它们的时间格式,它适用于该时区内的某个人。
例如,在我的 EDT 示例(第 1 行)中,我想要 Sept 27, 2018 5:00:00PM EDT
,对于第 2 行,我想要 Sept 27, 2018 2:16:40PM PDT
.
我 运行 在尝试抓取数据并以对第 3 方更友好的格式显示数据时经常使用此方法,但我从来没有找到一种特别好的方法来做到这一点。
使用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() 从 1/1/1970 UTC 生成时间戳。因此,您可以根据时区使用该信息 add/subtract 小时。
例如Melbourne/Sydney (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 的文档,这将有助于格式化您的答案。
使用 %I
会将 Hour 格式化为 12-hour time
,而 %p
将 return 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
不使用 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
使用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
。我个人认为第一种形式看起来更干净。