كيفية تحويل سلسلة التوقيت المحلي إلى UTC؟
سؤال
كيف أقوم بتحويل التاريخ والوقت سلسلة بالتوقيت المحلي إلى أ السلسلة في توقيت 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)
إذا كنت مستعدًا لقبول تحويلات المنطقة الزمنية، فاقرأ هذا:
فيما يلي ملخص لتحويلات وقت بايثون الشائعة.
تُسقط بعض الطرق أجزاءً من الثواني، ويتم تمييزها بـ (س).صيغة صريحة مثل 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)