Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以Python中的AM/PM格式在特定时区显示unix时间_Python_Datetime_Python Datetime_Pytz - Fatal编程技术网

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

以Python中的AM/PM格式在特定时区显示unix时间,python,datetime,python-datetime,pytz,Python,Datetime,Python Datetime,Pytz,我有一个unix时间和相应时区的大型电子表格。第1行第1列可能是1538082000,第2列可能是America/New_York,第2行可能是1538083000和America/Los_Angeles。在每一种情况下,我都需要它们的时间格式,它适用于时区内的人 例如,在我的EDT示例(第1行)中,我希望2018年9月27日美国东部夏令时下午5:00:00,而对于第2行,我希望2018年9月27日太平洋夏令时下午2:16:40 当我试图为第三方刮取数据并以更友好的格式显示数据时,我经常会遇到这

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

例如,在我的EDT示例(第1行)中,我希望2018年9月27日美国东部夏令时下午5:00:00,而对于第2行,我希望2018年9月27日太平洋夏令时下午2:16:40


当我试图为第三方刮取数据并以更友好的格式显示数据时,我经常会遇到这种情况,我从来没有找到一种特别好的方法来做到这一点。

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


是strftime的文档,这将有助于格式化您的答案。

使用
%I
将小时格式化为
12小时时间
,并且
%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

不使用箭头的解决方案

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

结果显示:
2018年9月27日美国东部夏令时下午5:00:00

第二个例子是:

>>> 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()
2018年9月27日太平洋标准时间下午2:16:40的结果


您可以使用
to
使用第一个表单,也可以将
tzinfo
传递给
fromtimestamp
,如第二个示例所示。就我个人而言,我认为第一个表单看起来更干净。

您是否尝试过查看一些现有的库?有相当多的流行的,可以很容易地解决这个问题,如和我没有!我会调查的。实际上我需要在特定的时区。我特别感兴趣的是在一个不一定是我的本地时间的特定时区中查找本地时间。明显地澄清了我的问题!我如何获取每个时区的整数小时偏移量,以插入到timedelta中,并知道它离UTC是+小时还是-小时?并且
fromtimestamp()
返回我机器上的本地时间,因此在我的例子中(在CDT的笔记本电脑上),您的示例返回
2018年9月28日02:00:00
嘿,我澄清了我的问题,以便更清楚地了解我在寻找什么。我特别感兴趣的是在不一定是我的本地时间的特定时区中查找本地时间。@NickCantal我更新我的答案,使用pytz也可以工作,而且可能更容易完善!arrow库似乎比python的内置功能更健全。将其添加到我的库中,以便随时可用!
>>> import arrow
>>> utc =  arrow.Arrow.fromtimestamp(1538082000)
>>> conv = utc.to('America/New_York')
>>> conv.format("MMM D, YYYY h:mm:ssA ") + conv.tzname()
>>> 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()