【问题标题】:Apply timezone when convert ms to datetime将 ms 转换为 datetime 时应用时区
【发布时间】:2019-08-26 05:54:09
【问题描述】:

在将 ms 解析为 datetime 时是否可以应用时区?

我的解析工作正常,但显示的是本地时间而不是带有时区的日期时间:

timestamp = datetime.fromtimestamp(float(dt) / 1000.0, 
                                   tz=pytz.timezone("America/Sao_Paulo"))

不确定它是否正在发生,因为我的操作系统中的时区。

【问题讨论】:

    标签: python


    【解决方案1】:

    这只是将时间戳解析为您提供的 tz(因此它假定 dt 是本地时间)。如果 dt 是绝对 / UTC 并且您想将其转换为本地时区,您需要先将其解析为 UTC 日期时间然后移动其时区:

    datetime.fromtimestamp(timestamp, pytz.utc).astimezone(pytz.timezone('America/Sao_Paulo'))
    

    例如使用1234567890:

    >>> datetime.fromtimestamp(ts, pytz.utc)
    datetime.datetime(2009, 2, 13, 23, 31, 30, tzinfo=<UTC>)
    >>> datetime.fromtimestamp(ts, pytz.utc).astimezone(pytz.timezone('America/Sao_Paulo'))
    datetime.datetime(2009, 2, 13, 21, 31, 30, tzinfo=<DstTzInfo 'America/Sao_Paulo' -02-1 day, 22:00:00 DST>)
    

    还要注意,由于各种历史原因,正确使用 pytz 并不是那么简单 (e.g.)。如果您需要经常处理时区,您可能需要查看 pendulum,它试图使时区操作更可靠,并提供更友好的 API。

    【讨论】:

      【解决方案2】:

      不确定是什么问题,它似乎按预期工作。我的当地时间是 09:02,而圣保罗时区显示为 10:02,这似乎是正确的。

      >>> import datetime, time, pytz
      >>> tz_1 = pytz.timezone("America/Sao_Paulo")
      >>> tz_1
      <DstTzInfo 'America/Sao_Paulo' LMT-1 day, 20:54:00 STD>
      >>> now = time.time()
      >>> now
      1554382930.1575696
      
      >>> datetime.datetime.fromtimestamp(now)
      datetime.datetime(2019, 4, 4, 9, 2, 10, 157570)
      >>> datetime.datetime.fromtimestamp(now, tz=tz_1)
      datetime.datetime(2019, 4, 4, 10, 2, 10, 157570, tzinfo=<DstTzInfo 'America/Sao_Paulo' -03-1 day, 21:00:00 STD>)
      

      您能否详细说明哪个部分没有按您的预期显示?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2017-11-23
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2021-02-14
        相关资源
        最近更新 更多