سؤال

كيف أقوم بتحويل التاريخ والوقت سلسلة بالتوقيت المحلي إلى أ السلسلة في توقيت UTC?

أنا متأكد من أنني قمت بذلك من قبل، ولكن لم أتمكن من العثور عليه وآمل أن يساعدني SO (والآخرين) في القيام بذلك في المستقبل.

إيضاح:على سبيل المثال، إذا كان لدي 2008-09-17 14:02:00 في منطقتي الزمنية المحلية (+10)، أرغب في إنشاء سلسلة بما يعادلها UTC وقت: 2008-09-17 04:02:00.

وأيضا من http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/, ، لاحظ أن هذا غير ممكن بشكل عام كما هو الحال مع التوقيت الصيفي والمشكلات الأخرى، حيث لا يوجد تحويل فريد من التوقيت المحلي إلى التوقيت العالمي المنسق (UTC).

هل كانت مفيدة؟

المحلول 3

شكرًا @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
سلسلة --> صف (لم يتم تطبيق المنطقة الزمنية، لذلك يتطابق مع السلسلة)

time.mktime
صف التوقيت المحلي --> ثانية منذ العصر (التوقيت المحلي دائمًا)

time.gmtime
ثانية منذ العصر --> صف في UTC

و

calendar.timegm
صف بالتوقيت العالمي المنسق -> ثانية منذ العصر

time.localtime
الثواني منذ العصر --> صف في المنطقة الزمنية المحلية

نصائح أخرى

أولاً، قم بتحليل السلسلة إلى كائن وقت وتاريخ ساذج.وهذا مثال على 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 حسب الحاجة:

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

وحدة التاريخ والوقت يتكنو() يمكن استخدام الدالة للحصول على وقت UTC الحالي.

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

كما ذكر الرابط أعلاه بواسطة توم: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ يقول:

UTC هي منطقة زمنية بدون وقت توفير النهار ولا تزال منطقة زمنية دون تغييرات التكوين في الماضي.

قم دائمًا بقياس الوقت وتخزينه بالتوقيت العالمي المنسق (UTC)..

إذا كنت بحاجة إلى تسجيل المكان الذي استغرقه الوقت، فقم بتخزين ذلك بشكل منفصل. لا تخزين التوقيت المحلي + معلومات المنطقة الزمنية!

ملحوظة - إذا كانت أي من بياناتك موجودة في منطقة تستخدم التوقيت الصيفي، فاستخدم pytz وألق نظرة على إجابة جون ميليكين.

إذا كنت ترغب في الحصول على وقت UTC من سلسلة معينة وكنت محظوظًا بما يكفي لوجودك في منطقة في العالم لا تستخدم التوقيت الصيفي، أو لديك بيانات يتم إزاحتها فقط من UTC دون تطبيق التوقيت الصيفي:

--> استخدام التوقيت المحلي كأساس لقيمة الإزاحة:

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

تحديث:

منذ بيثون 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

فيما يلي ملخص لتحويلات وقت بايثون الشائعة.

تُسقط بعض الطرق أجزاءً من الثواني، ويتم تمييزها بـ (س).صيغة صريحة مثل ts = (d - epoch) / unit يمكن استخدامها بدلا من ذلك (شكرا JFS).

  • struct_time (UTC) → POSIX (س):
    calendar.timegm(struct_time)
  • تاريخ ساذج (محلي) → POSIX (س):
    calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    (استثناء أثناء انتقالات التوقيت الصيفي، راجع التعليق من jfs)
  • وقت التاريخ الساذج (UTC) → POSIX (س):
    calendar.timegm(dt.utctimetuple())
  • علم التاريخ والوقت → POSIX (س):
    calendar.timegm(dt.utctimetuple())
  • بوسيكس → struct_time (التوقيت العالمي المنسق، س):
    time.gmtime(t)
    (انظر التعليق من JFS)
  • تاريخ ساذج (محلي) → struct_time (UTC، س):
    stz.localize(dt, is_dst=None).utctimetuple()
    (استثناء أثناء انتقالات التوقيت الصيفي، راجع التعليق من jfs)
  • وقت التاريخ الساذج (UTC) → struct_time (UTC، س):
    dt.utctimetuple()
  • وقت التاريخ المدرك → struct_time (UTC، س):
    dt.utctimetuple()
  • POSIX → وقت التاريخ الساذج (محلي):
    datetime.fromtimestamp(t, None)
    (قد تفشل في ظروف معينة، راجع التعليق من jfs أدناه)
  • struct_time (UTC) → تاريخ ساذج (محلي، س):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    (لا يمكن أن تمثل الثواني الكبيسة، راجع التعليق من jfs)
  • وقت التاريخ الساذج (UTC) → وقت التاريخ الساذج (محلي):
    dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
  • وقت التاريخ المدرك → وقت التاريخ الساذج (محلي):
    dt.astimezone(tz).replace(tzinfo=None)
  • POSIX → وقت التاريخ الساذج (UTC):
    datetime.utcfromtimestamp(t)
  • struct_time (UTC) → تاريخ ساذج (UTC، س):
    datetime.datetime(*struct_time[:6])
    (لا يمكن أن تمثل الثواني الكبيسة، راجع التعليق من jfs)
  • وقت التاريخ الساذج (محلي) → وقت التاريخ الساذج (UTC):
    stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    (استثناء أثناء انتقالات التوقيت الصيفي، راجع التعليق من jfs)
  • وقت التاريخ المدرك → وقت التاريخ الساذج (UTC):
    dt.astimezone(UTC).replace(tzinfo=None)
  • POSIX → وقت الوعي:
    datetime.fromtimestamp(t, tz)
    (قد تفشل في المناطق الزمنية غير pytz)
  • struct_time (UTC) → وقت واعي (س):
    datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
    (لا يمكن أن تمثل الثواني الكبيسة، راجع التعليق من jfs)
  • وقت التاريخ الساذج (محلي) → وقت التاريخ المدرك:
    stz.localize(dt, is_dst=None)
    (استثناء أثناء انتقالات التوقيت الصيفي، راجع التعليق من jfs)
  • وقت التاريخ الساذج (UTC) → وقت التاريخ المدرك:
    dt.replace(tzinfo=UTC)

مصدر: taaviburns.ca

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

مثال للاستخدام من 808 دينار بحريني:إذا كان مصدرك أ datetime.datetime هدف t, ، اتصل كـ:

local_to_utc(t.timetuple())

أنا حظا سعيدا مع 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 إلى وقت التاريخ المحلي)

مثال آخر مع pytz، ولكنه يتضمن 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'

لقد حققت أكبر قدر من النجاح مع بيثون dateutil:

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

إذا كنت تفضل 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")

يمكنك القيام بذلك باستخدام:

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

ماذا عن -

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

إذا كانت ثواني None ثم يقوم بتحويل التوقيت المحلي إلى توقيت UTC وإلا يقوم بتحويل الوقت الذي تم تمريره إلى UTC.

بسيط

لقد فعلت ذلك مثل هذا:

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

للالتفاف حول توفير ضوء النهار، وما إلى ذلك.

لم تساعدني أي من الإجابات المذكورة أعلاه بشكل خاص.الكود أدناه يعمل بتوقيت جرينتش.

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

استخدام 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') 

هذه المكتبة تجعل الحياة سهلة :)

في بيثون3:

pip install python-dateutil

from dateutil.parser import tz

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

لقد وجدت أفضل إجابة على سؤال آخر هنا.إنه يستخدم فقط مكتبات python المضمنة ولا يتطلب منك إدخال منطقتك الزمنية المحلية (وهو شرط في حالتي)

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 بدلاً من السؤال المرتبط اعتمادًا على الكلمات الرئيسية للبحث.

في هذه الحالة ...pytz هو أفضل ليب

import pytz
utc = pytz.utc
yourdate = datetime.datetime.now()
yourdateutc = yourdate.astimezone(utc).replace(tzinfo=None)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top