naif-ofset ve çıkarma olamaz ofset farkında tarihsaat

oy
181

Bir saat dilimi farkında olması timestamptzPostgreSQL alanına. Ben tablodan veri çekme, ben o zaman şu an zamanı çıkarmak için bu yüzden bu kadar yaşı alabiliriz.

I having hem olmasıdır datetime.datetime.now()ve datetime.datetime.utcnow()beni bu hatayı almaya neden olan zaman dilimi habersiz damgaları dönmek gibi görünüyor:

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

(Bir üçüncü taraf modülü kullanılan tercih edilen olmadan) bunu önlemek için bir yol var.

DÜZENLEME: Öneriler için teşekkürler, ancak zaman dilimini ayarlamak için çalışıyor .. Bana hataları vermek gibi görünüyor yüzden sadece PG içinde zaman dilimi habersiz damgaları kullanmak ve her zaman kullanarak eklemek için gidiyorum:

NOW() AT TIME ZONE 'UTC'

Bu şekilde tüm zaman damgaları (bunu yapmak daha sinir bozucu olsa bile) varsayılan olarak UTC bulunmaktadır.

Oluştur 28/04/2009 saat 03:28
kaynak kullanıcı
Diğer dillerde...                            


10 cevaplar

oy
203

Eğer zaman dilimi bilincini kaldırmak için çalıştık?

dan http://pytz.sourceforge.net/

naive = dt.replace(tzinfo=None)

hem de zaman dilimi dönüşüm eklemek gerekebilir.

düzenleme: Bu cevabın yaş unutmayınız. Bir Python 3 yanıt altındadır.

Cevap 28/04/2009 saat 03:36
kaynak kullanıcı

oy
92

Doğru çözüm etmektir eklemek Python 3'te bilinçli bir tarih saat nesnesi olarak geçerli zamanı almak için, saat dilimi bilgisi örneğin:

from datetime import datetime, timezone

now = datetime.now(timezone.utc)

Eski Python sürümlerinde, tanımlayabiliriz utckendini (datetime dokümanlardan örnek) nesne tzinfo:

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()

sonra:

now = datetime.now(utc)
Cevap 04/09/2014 saat 10:37
kaynak kullanıcı

oy
39

Bazı insanlar veritabanı etkileşim soyut bu tip bir arayüz olarak özellikle Django kullanmak biliyorum. Django Bunun için kullanılabilecek araçları sunar:

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

Sadece (ayarlarda, eklemek gerekir arayüzünün bu tür kullanıyor olsanız bile, temel bir Django ayarları altyapısını kurmak gerekiyor USE_TZ=Truebilinçli bir datetime almak için).

Kendi başına, bu muhtemelen hiçbir yerde bir arayüz olarak Django kullanmaya motive kadar yakın olduğunu, ancak diğer birçok Perks vardır. Eğer Django uygulaması bozma çünkü sen (gibi) burada tökezledi Öte yandan, o zaman belki bu yardımcı olur ...

Cevap 22/06/2015 saat 02:28
kaynak kullanıcı

oy
10

Bu çok basit ve net bir çözümdür
iki kod satırı

# 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

Aynı zaman bilgi ile datetime değişkenleri uyuz gerekir

Cevap 03/10/2015 saat 18:51
kaynak kullanıcı

oy
5

psycopg2 modülün kendi zaman dilimi tanımları vardır, bu yüzden utcnow etrafında kendi sarıcı yazma sona erdi:

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

ve sadece kullanmak pg_utcnowbir PostgreSQL karşı karşılaştırmak şimdiki zamana ihtiyacı olduğundatimestamptz

Cevap 19/07/2013 saat 19:01
kaynak kullanıcı

oy
4

Ben de aynı sorunla karşı karşıya. Sonra arama bir sürü sonra bir çözüm buldu.

Sorun şu modelden datetime nesnesi olsun veya formu ne zaman olduğunu oldu farkında ofset ve biz sistem tarafından zaman olsun eğer bir naif ofset .

Yani ne yaptım ben kullanarak o anki saati var olan timezone.now () ve tarafından dilimini almak django.utils dilimini içe gelen ve koyun Gerçek USE_TZ = proje ayarları dosyasında.

Cevap 22/02/2016 saat 08:01
kaynak kullanıcı

oy
1

Ben ultra basit çözüm geldi:

import datetime

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

Hem zaman dilimi farkında ve saat dilimi-naif datetime değerleri ile çalışır. Ve hiçbir ek kütüphaneler veya veritabanı geçici çözümler gereklidir.

Cevap 15/05/2018 saat 20:32
kaynak kullanıcı

oy
1

Eğer PostgreSQL kendisi yaş hesaplama işleyemez neden bazı basarak nedeni var mı? Gibi bir şey

select *, age(timeStampField) as timeStampAge from myTable
Cevap 28/04/2009 saat 11:24
kaynak kullanıcı

oy
0

Bulduğum timezone.make_aware(datetime.datetime.now())django (ben 1.9.1 olduğum) 'de yararlıdır. Maalesef sadece bir yapamazsınız datetimenesne offset-aware sonra timetz()bunu. Bir yapmak zorunda datetimeve buna dayanarak karşılaştırmalar yaparlar.

Cevap 25/07/2016 saat 19:39
kaynak kullanıcı

oy
0

Bu eski olduğunu biliyorum ama sadece ben dava birisi kullanışlı bulduğu sadece benim çözüm eklemek düşündüm.

Bir zaman sunucusundan bir farkında datetime ile yerel naif datetime karşılaştırmak istedik. Temelde farkında datetime nesnesi kullanarak yeni naif datetime nesnesi yarattı. Bir kesmek biraz ve çok güzel görünmüyor ama işi alır.

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()

... Burada geçiştirmek geliyor ...

    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 :-(')
Cevap 29/04/2014 saat 17:24
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more