代码之家  ›  专栏  ›  技术社区  ›  Ian Baget

无法减去偏移量原始和偏移量感知日期时间

  •  213
  • Ian Baget  · 技术社区  · 17 年前

    我知道时区 timestamptz

    我的问题是两者都有 datetime.datetime.now() datetime.datetime.utcnow()

    TypeError: can't subtract offset-naive and offset-aware datetimes 
    

    编辑:谢谢你的建议,但是试图调整时区似乎会给我带来错误。。因此,我将在PG中使用不知道时区的时间戳,并始终使用以下方式插入:

    NOW() AT TIME ZONE 'UTC'
    

    这样,默认情况下,我所有的时间戳都是UTC(尽管这样做更烦人)。

    10 回复  |  直到 9 年前
        1
  •  381
  •   phillc    5 年前

    您是否尝试删除时区意识?

    从…起 http://pytz.sourceforge.net/

    naive = dt.replace(tzinfo=None)
    

    编辑:请注意此答案的年龄。在Python3中添加时区信息而不是删除它的答案如下。 https://stackoverflow.com/a/25662061/93380

        2
  •  311
  •   jfs    11 年前

    正确的解决办法是 添加 时区信息,例如,在Python 3中作为感知日期时间对象获取当前时间:

    from datetime import datetime, timezone
    
    now = datetime.now(timezone.utc)
    

    在较旧的Python版本上,可以定义 utc

    from datetime import tzinfo, timedelta, datetime
    
    ZERO = timedelta(0)
    
    class UTC(tzinfo):
      def utcoffset(self, dt):
        return ZERO
      def tzname(self, dt):
        return "UTC"
      def dst(self, dt):
        return ZERO
    
    utc = UTC()
    

    now = datetime.now(utc)
    
        3
  •  71
  •   sage    9 年前

    我知道有些人专门使用Django作为接口来抽象这种类型的数据库交互。Django提供了可用于此目的的实用程序:

    from django.utils import timezone
    now_aware = timezone.now()
    

    USE_TZ=True 获得一个有意识的日期时间)。

    就其本身而言,这可能远远不足以激励您使用Django作为接口,但还有许多其他好处。另一方面,如果你在这里绊倒是因为你弄坏了你的Django应用程序(就像我一样),那么也许这会有帮助。。。

        4
  •  38
  •   ePi272314    7 年前


    两行代码

    # First we obtain de timezone info o some datatime variable    
    
    tz_info = your_timezone_aware_variable.tzinfo
    
    # Now we can subtract two variables using the same time zone info
    # For instance
    # Lets obtain the Now() datetime but for the tz_info we got before
    
    diff = datetime.datetime.now(tz_info)-your_timezone_aware_variable
    

    结论: 必须使用相同的时间信息管理日期时间变量

        5
  •  9
  •   Ashok Joshi    10 年前

    问题是,当我们从模型或表单中获取datetime对象时,它是 如果我们按系统计算时间,它是 抵消幼稚 .

    所以我所做的就是用 并通过以下方式导入时区: 从django.utils导入时区 然后把 在项目设置文件中。

        6
  •  8
  •   JeffCharter    5 年前

    你不需要std LIB之外的任何东西

    datetime.datetime.now().astimezone()
    

    如果您只是更换时区,它将不会调整时间。如果您的系统已经是UTC,那么.replace(tz='UTC')就可以了。

    >>> x=datetime.datetime.now()
    datetime.datetime(2020, 11, 16, 7, 57, 5, 364576)
    
    >>> print(x)
    2020-11-16 07:57:05.364576
    
    >>> print(x.astimezone()) 
    2020-11-16 07:57:05.364576-07:00
    
    >>> print(x.replace(tzinfo=datetime.timezone.utc)) # wrong
    2020-11-16 07:57:05.364576+00:00
    
        7
  •  6
  •   erjiang    12 年前

    psycopg2模块有自己的时区定义,因此我最终围绕utcnow编写了自己的包装:

    def pg_utcnow():
        import psycopg2
        return datetime.utcnow().replace(
            tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None))
    

    pg_utcnow 当您需要当前时间与PostgreSQL进行比较时 timestamptz

        8
  •  5
  •   John L. Stanley    8 年前

    我想出了一个非常简单的解决方案:

    import datetime
    
    def calcEpochSec(dt):
        epochZero = datetime.datetime(1970,1,1,tzinfo = dt.tzinfo)
        return (dt - epochZero).total_seconds()
    

        9
  •  2
  •   Joseph Coco    10 年前

    我找到了 timezone.make_aware(datetime.datetime.now()) datetime 对象偏移感知,然后 timetz() 日期时间 并在此基础上进行比较。

        10
  •  2
  •   Dave    5 年前

    naive_date.replace(tzinfo=aware_date.tzinfo) - aware_date
    
        11
  •  1
  •   Nic Gibson    7 年前

    是否有一些紧迫的原因使您无法在PostgreSQL中处理年龄计算?差不多

    select *, age(timeStampField) as timeStampAge from myTable
    
        12
  •  0
  •   I_do_python    12 年前

    我知道这很旧,但我想我会添加我的解决方案,以防有人发现它有用。

    我想将本地naive datetime与来自时间服务器的aware datetime进行比较。我基本上使用aware datetime对象创建了一个新的naive datetime对象。这有点像黑客,看起来不太漂亮,但却完成了任务。

    import ntplib
    import datetime
    from datetime import timezone
    
    def utc_to_local(utc_dt):
        return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)    
    
    try:
        ntpt = ntplib.NTPClient()
        response = ntpt.request('pool.ntp.org')
        date = utc_to_local(datetime.datetime.utcfromtimestamp(response.tx_time))
        sysdate = datetime.datetime.now()
    

    …软糖来了。。。

        temp_date = datetime.datetime(int(str(date)[:4]),int(str(date)[5:7]),int(str(date)[8:10]),int(str(date)[11:13]),int(str(date)[14:16]),int(str(date)[17:19]))
        dt_delta = temp_date-sysdate
    except Exception:
        print('Something went wrong :-(')
    
    推荐文章