it-swarm-tr.com

Python'da yerel saati UTC'ye nasıl dönüştürebilirim?

Bir tarih saatini yerel saatte dize a - UTC saatinde dize nasıl dönüştürebilirim?

Bunu daha önce yaptığımdan eminim, ancak bulamıyorum ve SO umarım gelecekte bana yardımcı olacak (ve diğerleri).

Açıklama : Örneğin, yerel saat dilimimde (2008-09-17 14:02:00) +10 varsa, eşdeğer UTC time: 2008-09-17 04:02:00 ile bir dize oluşturmak istiyorum.

Ayrıca, http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ / adresinden, genel olarak bunun DST ve diğer konularda olduğu gibi mümkün olmadığına dikkat edin. Yerel saatten UTC saatine kadar.

248
Tom

Thanks @rofly, dizgeden dizgeye tam dönüşüm şöyle:

time.strftime("%Y-%m-%d %H:%M:%S", 
              time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                    "%Y-%m-%d %H:%M:%S"))))

time/calendar işlevlerinin özeti:

time.strptime
string -> Tuple (saat dilimi uygulanmadığı için dize eşleşir)

time.mktime
yerel saat Tuple -> Epoch'tan bu yana saniye (her zaman yerel saat)

time.gmtime
Epoch'tan beri saniye -> UTC’de sıralama

ve 

calendar.timegm
UTC cinsinden sıralama -> Epoch'tan bu yana saniye

time.localtime
Epoch'tan beri saniye -> Yerel saat diliminde arama

60
Tom

İlk olarak, dizeyi saf bir datetime nesnesine ayrıştırın. Bu, saat dilimi bilgisi ekli olmayan bir datetime.datetime örneğidir. Tarih dizesini ayrıştırma hakkında bilgi için datetime.strptime belgelerine bakın.

Zaman dilimlerinin tam bir listesi + UTC ile birlikte gelen pytz modülünü kullanın. Yerel saat diliminin ne olduğunu belirleyin, ondan bir saat dilimi nesnesi oluşturun ve onu işleyin ve naif tarih tarihine ekleyin.

Son olarak, tarih saatini UTC'ye dönüştürmek için datetime.astimezone() yöntemini kullanın.

"2001-2-3 10:11:12" dizgisi için yerel saat dilimini "America/Los_Angeles" kullanarak kaynak kodu:

import pytz, datetime
local = pytz.timezone ("America/Los_Angeles")
naive = datetime.datetime.strptime ("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

Buradan UTC tarihini gerektiği gibi biçimlendirmek için strftime() yöntemini kullanabilirsiniz:

utc_dt.strftime ("%Y-%m-%d %H:%M:%S")
221
John Millikin

Datetime modülünün utcnow () işlevi, geçerli UTC zamanını elde etmek için kullanılabilir.

>>> import datetime
>>> utc_datetime = datetime.datetime.utcnow()
>>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2010-02-01 06:59:19'

Yukarıda Tom tarafından belirtilen bağlantıda: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ diyor:

UTC, gün ışığından yararlanma saati olmayan ve yine de bir saat dilimi olan bir saat dilimidir. geçmişte yapılandırma değişiklikleri olmadan.

Her zaman UTC ile zaman ölçün ve saklayın. 

Zamanın nerede geçtiğini kaydetmeniz gerekirse, ayrı olarak saklayın. Yerel saat ve saat dilimi bilgilerini saklamayın!

NOTU - Verilerinizden herhangi biri DST kullanan bir bölgedeyse, pytz kullanın ve John Millikin'in cevabına bakın.

UTC zamanını belirli bir diziden almak istiyorsanız ve dünyada DST kullanmayan bir bölgede olacak kadar şanslıysanız veya DST uygulanmayan yalnızca UTC'den mahsup edilmiş verileriniz varsa:

-> yerel saati ofset değerinin temeli olarak kullanmak:

>>> # Obtain the UTC Offset for the current system:
>>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
>>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
>>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

-> Veya, datetime.timedelta () işlevini kullanarak bilinen bir uzaklıktan:

>>> UTC_OFFSET = 10
>>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
>>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
'2008-09-17 04:04:00'

Saat diliminde dönüşüm almaya hazırsanız, aşağıdakileri okuyun:

https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7

111
monkut

İşte ortak Python zaman dönüşümlerinin bir özeti.

Bazı yöntemler saniyelerin kesirlerini bırakır ve (s) ile işaretlenir. Bunun yerine ts = (d - Epoch) / unit gibi açık bir formül kullanılabilir (teşekkürler jfs).

  • struct_time (UTC) → POSIX (s):
    calendar.timegm(struct_time)
  • Naif tarih saat (yerel) → POSIX (s):
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (DST geçişleri sırasında istisna, jfs yorumuna bakın)
  • Naif tarihsaat (UTC) → POSIX (s):
    calendar.timegm(dt.utctimetuple())
  • Geçmiş zamana dikkat et → POSIX (s):
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s):
    time.gmtime(t)
    (jfs yorumuna bakın)
  • Naif tarih saat (yerel) → struct_time (UTC, s):
    stz.localize(dt, is_dst=None).utctimetuple()
    (DST geçişleri sırasında istisna, jfs yorumuna bakın)
  • Naif tarih saat (UTC) → struct_time (UTC, s):
    dt.utctimetuple()
  • Bilinen tarih-zamanı → struct_time (UTC, s):
    dt.utctimetuple()
  • POSIX → Naiv Tarihçesi (yerel):
    datetime.fromtimestamp(t, None)
    (belirli koşullarda başarısız olabilir, aşağıdaki jfs yorumuna bakın)
  • struct_time (UTC) → Uzun tarih saat (yerel, s):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (artık saniye gösterilemiyor, jfs yorumuna bakın)
  • Doğum tarihi saat (UTC) → Doğum tarihi saat (yerel):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Bilinmeyen tarih-saat → Boş yer tarih-saati (yerel):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → Naiv Tarihçesi (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → Geçmiş tarih (UTC, s):
    datetime.datetime(*struct_time[:6])
    (artık saniye gösterilemiyor, jfs yorumuna bakın)
  • Nave datetime (yerel) → Naiv datetime (UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (DST geçişleri sırasında istisna, jfs yorumuna bakın)
  • Farkında Kalma Zamanı → Naïve datetime (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → Farkındalık tarihi:
    datetime.fromtimestamp(t, tz)
    (pytz olmayan zaman dilimleri için başarısız olabilir)
  • struct_time (UTC) → Bilinen tarih/saat :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (artık saniye gösterilemiyor, jfs yorumuna bakın)
  • Naif tarih (yerel) → Tarih saatinin farkında:
    stz.localize(dt, is_dst=None)
    (DST geçişleri sırasında istisna, jfs yorumuna bakın)
  • Naif tarih (UTC) → Tarih saatinin farkında:
    dt.replace(tzinfo=UTC)

Kaynak: taaviburns.ca

31
akaihola
def local_to_utc(t):
    secs = time.mktime(t)
    return time.gmtime(secs)

def utc_to_local(t):
    secs = calendar.timegm(t)
    return time.localtime(secs)

Kaynak: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

bd808 öğesinden örnek kullanım: Kaynağınız bir datetime.datetime nesnesi t ise, şöyle çağır:

local_to_utc(t.timetuple())
23
Chuck Callebs

dateutil ile ilgili iyi şanslar yaşıyorum [(ilgili diğer sorular için SO 'da sıkça tavsiye edilir):

from datetime import *
from dateutil import *
from dateutil.tz import *

# METHOD 1: Hardcode zones:
utc_zone = tz.gettz('UTC')
local_zone = tz.gettz('America/Chicago')
# METHOD 2: Auto-detect zones:
utc_zone = tz.tzutc()
local_zone = tz.tzlocal()

# Convert time string to datetime
local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')

# Tell the datetime object that it's in local time zone since 
# datetime objects are 'naive' by default
local_time = local_time.replace(tzinfo=local_zone)
# Convert time to UTC
utc_time = local_time.astimezone(utc_zone)
# Generate UTC time string
utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')

(Kod bu cevaptan türetildi UTC datetime dizesini yerel tarih tarihine )

18
Yarin

Pytz ile bir örnek daha var, ancak günümü kurtaran localize ().

import pytz, datetime
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
amsterdam = pytz.timezone('Europe/Amsterdam')

dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
am_dt = amsterdam.localize(dt)
print am_dt.astimezone(utc).strftime(fmt)
'2012-04-06 08:00:00'
17

python-dateutil ile en başarılı oldum.

from dateutil import tz

def datetime_to_utc(date):
    """Returns date in UTC w/o tzinfo"""
    return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date
12
Shu Wu
import time

import datetime

def Local2UTC(LocalTime):

    EpochSecond = time.mktime(LocalTime.timetuple())
    utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)

    return utcTime

>>> LocalTime = datetime.datetime.now()

>>> UTCTime = Local2UTC(LocalTime)

>>> LocalTime.ctime()

'Thu Feb  3 22:33:46 2011'

>>> UTCTime.ctime()

'Fri Feb  4 05:33:46 2011'
7
Scipythonee

datetime.datetime tercih ederseniz:

dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
print dt.strftime("%Y-%m-%d %H:%M:%S")
5
user235042

İle yapabilirsiniz:

>>> from time import strftime, gmtime, localtime
>>> strftime('%H:%M:%S', gmtime()) #UTC time
>>> strftime('%H:%M:%S', localtime()) # localtime
4
Cristian Salamea

Gün ışığından yararlanma vb.

Yukarıdaki cevapların hiçbiri özellikle bana yardımcı oldu. Aşağıdaki kod GMT için çalışıyor.

def get_utc_from_local(date_time, local_tz=None):
    assert date_time.__class__.__== 'datetime'
    if local_tz is None:
        local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
    local_time = local_tz.normalize(local_tz.localize(date_time))
    return local_time.astimezone(pytz.utc)

import pytz
from datetime import datetime

summer_11_am = datetime(2011, 7, 1, 11)
get_utc_from_local(summer_11_am)
>>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)

winter_11_am = datetime(2011, 11, 11, 11)
get_utc_from_local(winter_11_am)
>>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)
2
Dantalion

Peki ya - 

time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))

saniye saniye None ise, yerel saati UTC zamanına, aksi halde geçen zamanı UTC'ye dönüştürür.

2
Anonymous fool

http://crsmithdev.com/arrow/ kullanarak

arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')

arrowObj.to('UTC') or arrowObj.to('local') 

Bu kütüphane hayatı kolaylaştırıyor :)

2
Yash

Basit

Böyle yaptım:

>>> utc_delta = datetime.utcnow()-datetime.now()
>>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
>>> print(utc_time)
2008-09-17 19:01:59.999996

Fantezi Uygulama

Eğer süslü olmak istiyorsan bunu bir functor'a çevirebilirsin:

class to_utc():
    utc_delta = datetime.utcnow() - datetime.now()

    def __call__(cls, t):
        return t + cls.utc_delta

Sonuç: 

>>> utc_converter = to_utc()
>>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
2008-09-17 19:01:59.999996
1
uclatommy

Python3'te:

pip install python-dateutil

from dateutil.parser import tz

mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 
0
spedy

Başka bir soruya en iyi cevabı buldum here . Yalnızca python yerleşik kitaplıklarını kullanır ve yerel saat diliminizi girmenizi gerektirmez (benim durumumda bir gereksinim) 

import time
import calendar

local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
local_seconds = time.mktime(local_time)
utc_time = time.gmtime(local_seconds)

Buradaki sorguyu, arama anahtar kelimelerine bağlı olarak bağlantılı soru yerine google'da açıldığından ortaya koyuyorum.

0
franksands