如何用python将当地时间(PDT)转换为PST

2 人关注

通常情况下,如果我想转换时区,我的做法如下

# local interpreted as pst to utc
utc = pytz.utc
pst = pytz.timezone('America/Los_Angeles')
start_time_str = time.strftime('%Y-%m-%d %H:%M:%S', \
  time.localtime(start_time))
start_time_datetime = \
  datetime.datetime.strptime(start_time_str, "%Y-%m-%d %H:%M:%S")
start_time_datetime = \
  start_time_datetime.replace(tzinfo=pst).astimezone(utc)

现在我想做类似的事情,比如我想把本地时间转换为pst

localtime = datetime.datetime.fromtimestamp(time.mktime(
            time.localtime()))

我不太清楚你将如何实现这一点

希望得到任何帮助

2 个评论
jfs
你的输入是什么?是Unix时间 start_time (一个数字)吗?为什么你调用 strftime() 后又立即调用 strptime() (相反的转换)?计算 localtime 的目的是什么(你是否知道 datetime.now() )?
python
datetime
time
timezone
Kevin
Kevin
发布于 2015-06-23
3 个回答
Matt Johnson-Pint
Matt Johnson-Pint
发布于 2019-11-17
已采纳
0 人赞同

Two things:

  • 替换代码0】的标识符代表整个太平洋时区,包括 both PST和PDT。 它将使用-8或-7作为时区偏移,这取决于它所使用的具体日期和时间。

  • 调用 replace(tzinfo=...) 是一个错误。 用 localize 代替。 请看 pytz文档 . 这在导言和第一个例子中都有讨论。

  • +1提到了 localize ,它非常重要。如果你使用 replace ,你会得到一些非常奇怪的错误,这与在 datetime 构造函数中指定时区对象相同。
    你可以调用 .replace(tzinfo=...) ,然后调用 .localize() .astimezone() 。事实上,如果是 None ,你可能确实想替换 tzinfo ,这样 datetime 对象就不再是幼稚的了。不过,在我运行 localize 之前,我不会用它来做任何事情,而一旦你定义了起始时区,这就很容易了。我认为这是一个天真的数据时间对象,在那里人们更有可能看到奇怪的错误。
    jfs
    jfs
    发布于 2019-11-17
    0 人赞同

    你的代码包含不必要的(在 strftime 之后调用 strptime )或只是错误的( .replace() )转换。

    要创建一个可感知的日期时间对象,给定 "自纪元以来的秒数" start_time (由 time.time() 返回的值)。

    #!/usr/bin/env python
    from datetime import datetime
    import pytz # $ pip install pytz
    tz = pytz.timezone('America/Los_Angeles')
    start_time_datetime = datetime.fromtimestamp(start_time, tz)
    

    正如@Matt Johnson所提到的, 'America/Los_Angeles'时区ID产生的时间与PST或PDT tzname,取决于日期。不需要转换。

    你问题中的最后一个代码例子既有不必要的转换,也可能在某些情况下失败。如果你的目的是为了获得本地时区的当前时间,作为一个可感知的数据时间对象,那么你可以使用tzlocal module:

    #!/usr/bin/env python
    from datetime import datetime
    from tzlocal import get_localzone # $ pip install tzlocal
    local_timezone = get_localzone() # pytz timezone corresponding to the  local time
    current_localtime = datetime.now(local_timezone)
        
    ingyhere
    ingyhere
    发布于 2019-11-17
    0 人赞同

    首先,要说明的是,当地时间要么是标准时间,要么是夏令时--它不能同时是标准时间和夏令时。我相信你真正想问的是,是否有办法判断一个时间是夏令时或不是夏令时。换句话说,给定一个特定的日子,一个特定的时间是否在夏令时?另一个常见的用例是将与特定时间偏移挂钩的表格数据转换为当前的正确时间。

    好吧,我可以想到三种方法来做到这一点。

    (1) 你可以将 datetime 转换成 time 对象,并查看 .tm_isdst 的属性。 与此答案相似 .你可以对它做一个测试,看看该属性是否等于1,然后减去一个 timedelta 的一小时。

    >>> time.localtime()
    time.struct_time(tm_year=2019, tm_mon=11, tm_mday=16, tm_hour=12, 
    tm_min=36, tm_sec=32, tm_wday=5, tm_yday=320, tm_isdst=0)
    >>> time.localtime().tm_isdst
    

    (2)第二种方法是逐月爬过每个月15日的中午,检查偏移量是否有变化。(注意,有些地区不实行夏令时。)数值越大,说明夏令时提前跳过。(例如,PDT是UTC-7,而PST是UTC-8。)根据这些数值,你可以计算出时间差。然后你可以通过检查偏移量来测试你的时间,看它是在标准时间还是夏令时。Offest是这样检查的。

    >>> my_special_pdt_datetime.strftime('%z') 
    '-0700'