วิธีแปลงสตริงเวลาท้องถิ่นเป็น UTC


307

ฉันจะแปลงสตริงวันที่และเวลาในเวลาท้องถิ่นเป็นสตริงในเวลา UTC ได้อย่างไร

ฉันแน่ใจว่าฉันเคยทำมาก่อน แต่ไม่สามารถหาได้และหวังว่าจะช่วยฉัน (และคนอื่น ๆ ) ทำสิ่งนั้นในอนาคต

ชี้แจง : ตัวอย่างเช่นถ้าฉันมี2008-09-17 14:02:00ในเขตเวลาท้องถิ่นของฉัน ( +10) ฉันต้องการที่จะสร้างสตริงกับเทียบเท่าเวลา:UTC2008-09-17 04:02:00

นอกจากนี้จากhttp://lucumr.pocoo.org/2011/7/15/eppur-si-muove/โปรดทราบว่าโดยทั่วไปสิ่งนี้ไม่สามารถทำได้เช่นเดียวกับ DST และปัญหาอื่น ๆ ที่ไม่มีการแปลงที่ไม่ซ้ำกันจากเวลาท้องถิ่นเป็น เวลา UTC


1
โปรดระวังวิธีการ mktime () ใช้ "เวลาท้องถิ่น" เป็นอินพุตซึ่งอาจไม่ใช่สิ่งที่คุณคาดหวังฉันใช้มันและทำให้ทุกอย่างยุ่งเหยิง โปรดดูที่ลิงค์นี้
Haifeng Zhang

คำตอบ:


287

ก่อนอื่นให้วิเคราะห์คำในสตริงไปยังวัตถุที่ไม่มีวันหมดอายุ นี่เป็นตัวอย่างของdatetime.datetimeไม่มีข้อมูลเขตเวลาที่แนบมา ดูเอกสารประกอบสำหรับdatetime.strptimeข้อมูลเกี่ยวกับการแยกสตริงวันที่

ใช้pytzโมดูลซึ่งมาพร้อมกับรายการเขตเวลา + UTC แบบเต็ม คิดออกว่าเขตเวลาท้องถิ่นคืออะไรสร้างวัตถุเขตเวลาจากมันและจัดการและแนบไปกับวันที่ไร้เดียงสา

สุดท้ายใช้datetime.astimezone()วิธีการแปลงวันที่และเวลาเป็น UTC

ซอร์สโค้ดโดยใช้เขตเวลาท้องถิ่น "America / Los_Angeles" สำหรับสตริง "2001-2-3 10:11:12":

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)

จากตรงนั้นคุณสามารถใช้strftime()วิธีการจัดรูปแบบ UTC datetime ตามต้องการ:

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

7
โปรดแก้ไขคำตอบของคุณด้วยรหัสต่อไปนี้: [code] local.localize (ไร้เดียงสา) [/ code] ดูเอกสาร: ลิงค์ น่าเสียดายที่ใช้อาร์กิวเมนต์ tzinfo ของตัวสร้าง datetime มาตรฐาน '' ไม่ทำงาน '' กับ pytz สำหรับเขตเวลาหลายแห่ง >>> วันที่และเวลา (2002, 10, 27, 12, 0, 0, tzinfo = อัมสเตอร์ดัม). strftime (fmt) '2002-10-27 12:00:00 AMT + 0020'
Sam Stoelinga

2
เห็นได้ชัดว่าขั้นตอน "เข้าใจว่าเขตเวลาท้องถิ่นคืออะไร" พิสูจน์ได้ยากกว่าฟังดู (เป็นไปไม่ได้จริง)
Jason R. Coombs

2
ใช้ local.localize ตามที่แนะนำโดย @SamStoelinga มิฉะนั้นคุณจะไม่คำนึงถึงเวลาออมแสง
Emil Stenström

คำตอบนี้มีประโยชน์กับฉันมาก แต่ฉันอยากจะชี้ให้เห็นถึงข้อผิดพลาดที่ฉันพบ หากคุณให้เวลา แต่ไม่ใช่วันที่คุณอาจได้ผลลัพธ์ที่ไม่คาดคิด ดังนั้นให้แน่ใจว่าคุณได้จัดทำบันทึกเวลาแบบเต็ม
สตีเวน Mercatante


144

ฟังก์ชันutcnow ()ของโมดูลวันที่และเวลาสามารถใช้เพื่อรับเวลา UTC ปัจจุบัน

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

ตามลิงก์ที่กล่าวถึงข้างต้นโดย Tom: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ พูดว่า:

UTC เป็นเขตเวลาที่ไม่มีการปรับเวลาตามฤดูกาลและยังคงเป็นเขตเวลาที่ไม่มีการเปลี่ยนแปลงการกำหนดค่าในอดีต

วัดและเก็บเวลาใน UTC ทุกครั้งทุกครั้ง

หากคุณต้องการบันทึกเวลาที่ถ่ายให้จัดเก็บแยกกัน อย่าเก็บข้อมูลเวลาท้องถิ่น + เขตเวลา!

หมายเหตุ - หากข้อมูลใด ๆ ของคุณอยู่ในภูมิภาคที่ใช้ DST ให้ใช้pytzและดูคำตอบของ John Millikin

หากคุณต้องการรับเวลา UTC จากสตริงที่กำหนดและโชคดีของคุณเพียงพอที่จะอยู่ในภูมิภาคในโลกที่ไม่ได้ใช้ DST หรือคุณมีข้อมูลที่ชดเชยจาก UTC โดยไม่ต้องใช้ DST:

-> ใช้เวลาท้องถิ่นเป็นพื้นฐานสำหรับค่าออฟเซ็ต:

>>> # 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'

-> หรือจากออฟเซ็ตที่รู้จักโดยใช้ datetime.timedelta ():

>>> 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'

UPDATE:

เนื่องจาก python 3.2 datetime.timezoneมีวางจำหน่ายแล้ว คุณสามารถสร้างออบเจ็กต์วันที่และเวลาได้โดยใช้คำสั่งด้านล่าง:

import datetime

timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)

หากคุณพร้อมที่จะรับการแปลงเขตเวลาให้ไปอ่านสิ่งนี้:

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


14
เพียงแปลงเวลาปัจจุบันฉันต้องใช้เวลาที่กำหนด (เป็นสตริง) และแปลงเป็น UTC
ทอม

ฉันไม่คิดว่ามันจะสำคัญที่นี่ถ้าคุณใช้ค่าออฟเซ็ตมาตรฐาน local_time = utc_time + utc_offset และ utc_time = local_time - utc_offset
monkut

5
ใช้งานได้กับเวลาปัจจุบันเท่านั้นเนื่องจากการประทับเวลาในอดีตและอนาคตอาจมี UTC ตรงข้ามกันเนื่องจาก DST
อเล็กซ์ B

จุดดี ... ถ้าคุณต้องรับมือกับเวลาคุณควรใช้ pytz ตามที่ John Millikin พูดถึง
monkut

1
มีเดลต้าเป็นระยะ ๆ ระหว่างการโทรไปยัง utcnow () และตอนนี้ () นั่นเป็นบรรทัดรหัสอันตรายที่อาจนำไปสู่ข้อผิดพลาดแปลก ๆ เช่นในภายหลังtzinfo.utcoffset() must return a whole number of minutesและอื่น ๆ
Pavel Vlasov

62

ขอบคุณ @rofly การแปลงแบบเต็มจากสตริงเป็นสตริงมีดังนี้:

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ฟังก์ชั่น:

time.strptime
string -> tuple (ไม่ใช้เขตเวลาจึงจับคู่กับสตริง)

time.mktime
เวลาท้องถิ่น tuple -> วินาทีตั้งแต่ยุค (เวลาท้องถิ่นเสมอ)

time.gmtime
วินาทีนับตั้งแต่ยุค -> tuple ใน UTC

และ

calendar.timegm
tuple ใน UTC -> วินาทีตั้งแต่ยุค

time.localtime
วินาทีนับตั้งแต่ยุค -> tuple ในเขตเวลาท้องถิ่น


4
(always local time)ดูเหมือนจะผิด: อินพุตไปยัง mktime () เป็นเวลาท้องถิ่นเอาต์พุตเป็นวินาทีตั้งแต่ยุค ( 1970-01-01 00:00:00 +0000 (UTC)) ที่ไม่ได้ขึ้นอยู่กับเขตเวลา
jfs

3
นอกจากนี้ยังมีโอกาส 50% ที่จะล้มเหลวระหว่างการเปลี่ยน DST ดูปัญหาเกี่ยวกับเวลาท้องถิ่น
jfs

38

นี่คือบทสรุปของการแปลงเวลาทั่วไปของงูหลาม

วิธีการบางอย่างวางเศษส่วนของวินาทีและมีเครื่องหมาย(s) สูตรที่ชัดเจนเช่นts = (d - epoch) / unitสามารถใช้แทนได้ (ขอบคุณ jfs)

  • struct_time (UTC) → POSIX (s) :
    calendar.timegm(struct_time)
  • Na datve datetime (local) → POSIX (s) :
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (ยกเว้นในช่วงการเปลี่ยนภาพ DST ดูความคิดเห็นจาก jfs)
  • ไร้เดียงสาวันที่และเวลา (UTC) → POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • datetime ตระหนัก→ POSIX (s) :
    calendar.timegm(dt.utctimetuple())
  • POSIX → struct_time (UTC, s ):
    time.gmtime(t)
    (ดูความคิดเห็นจาก jfs)
  • Na datve datetime (local) → struct_time (UTC, s ):
    stz.localize(dt, is_dst=None).utctimetuple()
    (ยกเว้นในช่วงการเปลี่ยนภาพ DST ดูความคิดเห็นจาก jfs)
  • Naïve datetime (UTC) → struct_time (UTC, s ):
    dt.utctimetuple()
  • Aware datetime → struct_time (UTC, s ):
    dt.utctimetuple()
  • POSIX → Na datve datetime (local):
    datetime.fromtimestamp(t, None)
    (อาจล้มเหลวในเงื่อนไขบางประการดูความคิดเห็นจาก jfs ด้านล่าง)
  • struct_time (UTC) → Naetimeve datetime (local, s ):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (ไม่สามารถแทนวินาทีกระโดดได้, ดูความคิดเห็นจาก jfs)
  • Naïve datetime (UTC) →Naïve datetime (ท้องถิ่น):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • Aware datetime →Naïve datetime (local):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX →ไม่ระบุวันที่และเวลา (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) →Naïve datetime (UTC, s ):
    datetime.datetime(*struct_time[:6])
    (ไม่สามารถแทนวินาทีกระโดดได้, ดูความคิดเห็นจาก jfs)
  • Naïve datetime (local) →Naïve datetime (UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (ยกเว้นในช่วงการเปลี่ยนภาพ DST ดูความคิดเห็นจาก jfs)
  • Aware datetime →Naïve datetime (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → Aware datetime:
    datetime.fromtimestamp(t, tz)
    (อาจล้มเหลวสำหรับเขตเวลาที่ไม่ใช่ pytz)
  • struct_time (UTC) → datetime รอบรู้(s) :
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (ไม่สามารถเป็นตัวแทนวินาทีกระโดดเห็นความคิดเห็นจาก jfs)
  • Naïve datetime (local) → Aware datetime:
    stz.localize(dt, is_dst=None)
    (ยกเว้นในระหว่างการเปลี่ยน DST, ดูความคิดเห็นจาก jfs)
  • Naïve datetime (UTC) → Aware datetime:
    dt.replace(tzinfo=UTC)

ที่มา: taaviburns.ca


1
(1) fromtimestamp(t, None)อาจล้มเหลวหากเขตเวลาท้องถิ่นมีออฟเซ็ต utc ที่แตกต่างกันt และไลบรารี C ไม่มีสิทธิ์เข้าถึงฐานข้อมูล tz บนแพลตฟอร์มที่กำหนด คุณสามารถใช้tzlocal.get_localzone()เพื่อให้ tzdata ในแบบพกพา (2) fromtimestamp(t, tz)อาจล้มเหลวสำหรับเขตเวลาที่ไม่ใช่ pytz (3) คุณจะหายไปdatetime(*struct_time[:6]) *(4) timegm(), utctimetuple(), struct_timeโซลูชั่น -based วางเสี้ยววินาที คุณสามารถใช้สูตรที่ชัดเจนเช่น: ts = (d - epoch) / unitแทน
jfs

1
(5) stz.localize(dt, is_dst=None)ยกข้อยกเว้นสำหรับเวลาท้องถิ่นที่ไม่ชัดเจนหรือไม่มีอยู่จริงเช่นในช่วงการเปลี่ยนภาพ DST เพื่อหลีกเลี่ยงข้อยกเว้นใช้stz.normalize(stz.localize(dt))ที่อาจส่งคืนผลลัพธ์ที่ไม่ชัดเจน (6) datetime () ไม่สามารถแทนการก้าวกระโดดครั้งที่สอง แปลงstruct_timeเป็น "วินาทีนับตั้งแต่ยุค" เป็นวิธีแก้ปัญหาก่อน (7) time.gmtime(t)ไม่เหมือนกันซึ่งcalendar.timegm()อาจคาดว่าอินพุตที่ไม่ใช่ POSIX หากใช้เขตเวลา "ถูกต้อง" ใช้สูตรที่ชัดเจนหากอินพุตคือ POSIX แทน:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
jfs

ฉันหวังว่านี่คือในตารางอ่านง่ายขึ้น (อยู่ในลิงค์)
MichaelChirico

1
@MichaelChirico คำตอบนี้ระบุว่า "เราไม่อนุญาต (และไม่อนุญาต) <table>แท็กขออภัยนี่เป็นเจตนาและโดยการออกแบบหากคุณต้องการ" ตาราง "ที่รวดเร็วและสกปรกให้ใช้<pre>และโครงร่าง ASCII" ฉันไม่เชื่อว่าตาราง ASCII จะสามารถอ่านได้มากกว่ารายการด้านบน
akaihola

ดีที่โชคร้าย คุณมี upvote ของฉันอยู่แล้ว ... อาจอ้างอิงตารางในลิงก์ภายในคำตอบของคุณ?
MichaelChirico

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

ที่มา: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

ตัวอย่างการใช้งานจากbd808 : หากแหล่งที่มาของคุณเป็นdatetime.datetimeวัตถุtเรียกว่า:

local_to_utc(t.timetuple())

5
ถ้าแหล่งที่มาของคุณเป็นวัตถุ datetime.datetime tเรียกว่า: local_to_utc (t.timetuple ())
bd808

2
.timetuple()การโทรตั้งtm_isdstเป็น-1; มีโอกาส 50% mktime()ล้มเหลวระหว่างการเปลี่ยน DST
jfs

1
โซลูชันของ Chuck สูญเสียข้อมูลเป็นมิลลิวินาที
Luca

21

ฉันโชคดีกับdateutil (ซึ่งแนะนำอย่างกว้างขวางใน SO สำหรับคำถามที่เกี่ยวข้องอื่น ๆ ):

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

(รหัสมาจากคำตอบนี้ไป แปลงสตริงข้อมูลวันที่และเวลา UTC เป็นวันที่และเวลาท้องถิ่น )


dateutilสามารถล้มเหลวสำหรับวันที่ผ่านมาหากเขตเวลาท้องถิ่นมีออฟเซ็ต utc ที่แตกต่างกัน (ไม่เกี่ยวข้องกับการเปลี่ยน DST) ในระบบที่การใช้งานไม่ได้ใช้ฐานข้อมูลเขตเวลาในอดีต (โดยเฉพาะ Windows) pytz+ tzlocalสามารถใช้แทนได้
jfs

@ JFSebastian - ไม่เคยได้ยินเรื่องนั้น - เราจะหาข้อมูลเพิ่มเติมได้จากที่ไหน?
Yarin

ใช้เครื่อง Windows ตั้งเขตเวลาใด ๆ ที่มีออฟเซ็ต utc ที่แตกต่างกันในอดีตเช่นยุโรป / มอสโก ผลการเปรียบเทียบกับ pytz นอกจากนี้คุณสามารถทดสอบข้อผิดพลาดนี้ที่ล้มเหลวแม้ใน Ubuntuแต่ฉันไม่แน่ใจเกี่ยวกับการใช้ API ที่ถูกต้องในกรณีนี้
jfs

ผลลัพธ์คืออะไร กรุณาโพสต์เอาท์พุท
not2qubit

18

อีกตัวอย่างหนึ่งด้วย pytz แต่มีการ จำกัด () ซึ่งช่วยวันของฉัน

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'


7
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'

mktime(dt.timetuple())สามารถล้มเหลวในช่วงเวลาการเปลี่ยนแปลง มีอยู่LocalTimezoneในเอกสาร (ใช้งานได้สำหรับการกำหนดเขตเวลาล่าสุด แต่อาจล้มเหลวสำหรับวันที่ผ่านมา (ไม่เกี่ยวข้องกับ DST))
jfs

5

หากคุณต้องการ datetime.datetime:

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

1
แน่นอน แต่ฉันไม่เห็นว่าทำไมคุณถึงชอบ มันต้องมีการนำเข้าพิเศษและอื่น ๆ อีก 3 สายงานกว่ารุ่นของฉัน ...
ทอม

% Z และ% z ยังพิมพ์ช่องว่างสีขาว
Pavel Vlasov

2
มันไม่ถูกต้อง มันล้มเหลวถ้าเขตเวลาท้องถิ่นไม่ใช่ UTC mktime()คาดว่าเวลาท้องถิ่นเป็นอินพุต fromtimestamp()ส่งคืนเวลาท้องถิ่นไม่ใช่ utc หากคุณแก้ไขแล้วดูปัญหาเพิ่มเติมdateutil
jfs

5

ง่าย

ฉันทำแบบนี้:

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

การใช้งานแฟนซี

หากคุณต้องการจินตนาการคุณสามารถเปลี่ยนให้เป็นนักแสดง:

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

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

ผลลัพธ์:

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

5
วิธีนี้ใช้ไม่ได้กับการปรับเวลาตามฤดูกาลเช่นหากอยู่ในช่วงฤดูร้อนและวันที่คุณแปลงเป็นฤดูหนาว และคำถามก็เกี่ยวกับการแปลงวันที่ที่เก็บไว้เป็นสตริง ...
Tom

1
FYI ปัญหาที่ใหญ่ที่สุดด้วยวิธีนี้ (นอกเหนือจากการประหยัดเวลากลางวัน) คือไม่กี่มิลลิวินาทีเดลต้าจะถูกปิดโดย คำเชิญในปฏิทินทั้งหมดของฉันแสดงขึ้นเป็นปิดภายใน 1 นาที
Nostalg.io

4

คุณสามารถทำได้ด้วย:

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

3

เกี่ยวกับ -

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

หากวินาทีNoneนั้นจะแปลงเวลาท้องถิ่นเป็น UTC เวลาอื่นแปลงเวลาที่ผ่านไปเป็น UTC


2

สำหรับการเดินทางรอบกลางวันและอื่น ๆ

ไม่มีคำตอบใดที่ช่วยฉันโดยเฉพาะ รหัสด้านล่างใช้งานได้กับ GMT

def get_utc_from_local(date_time, local_tz=None):
    assert date_time.__class__.__name__ == '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

ใช้http://crsmithdev.com/arrow/

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

ห้องสมุดนี้ทำให้ชีวิตง่ายขึ้น :)


arrow is awesome: arrow.get (datetime.now (), 'local'). ถึง ('utc'). naive
SteveJ

1

ผมพบคำตอบที่ดีที่สุดสำหรับคำถามอื่นที่นี่ มันใช้ไลบรารีในตัวของหลามเท่านั้นและไม่ต้องการให้คุณป้อนเขตเวลาท้องถิ่นของคุณ (ข้อกำหนดในกรณีของฉัน)

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)

ฉันโพสต์คำตอบใหม่ที่นี่เนื่องจากคำถามนี้ปรากฏขึ้นใน google แทนที่จะเป็นคำถามที่เชื่อมโยงขึ้นอยู่กับคำค้นหา


1

ฉันมีรหัสนี้ในหนึ่งในโครงการของฉัน:

from datetime import datetime
## datetime.timezone works in newer versions of python
try:
    from datetime import timezone
    utc_tz = timezone.utc
except:
    import pytz
    utc_tz = pytz.utc

def _to_utc_date_string(ts):
    # type (Union[date,datetime]]) -> str
    """coerce datetimes to UTC (assume localtime if nothing is given)"""
    if (isinstance(ts, datetime)):
        try:
            ## in python 3.6 and higher, ts.astimezone() will assume a
            ## naive timestamp is localtime (and so do we)
            ts = ts.astimezone(utc_tz)
        except:
            ## in python 2.7 and 3.5, ts.astimezone() will fail on
            ## naive timestamps, but we'd like to assume they are
            ## localtime
            import tzlocal
            ts = tzlocal.get_localzone().localize(ts).astimezone(utc_tz)
    return ts.strftime("%Y%m%dT%H%M%SZ")

0

ใน python3:

pip install python-dateutil

from dateutil.parser import tz

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

สิ่งนี้ดูเหมือนจะไม่ทำงานมันยกข้อยกเว้น ValueError: ValueError: astimezone () ไม่สามารถนำไปใช้กับ datetime ไร้เดียงสา
Stormsson

ควรเป็น: from dateutil import tz
Javier

-3

เกี่ยวกับ -

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

หากวินาทีNoneนั้นจะแปลงเวลาท้องถิ่นเป็น UTC เวลาอื่นแปลงเวลาที่ผ่านไปเป็น UTC


1
สิ่งนี้ไม่ได้ช่วยคำถามก็คือการแปลงสตริงเวลาท้องถิ่นที่กำหนดเป็นสตริง utc
Tom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.