سؤال

هل هناك طريقة سهلة لتحويل RFC 3339 الوقت في الطابع الزمني للثعبان العادية؟

لقد حصلت على نص يقرأ خلاصة ذرة وأود أن أكون قادرًا على مقارنة الطابع الزمني لعنصر في خلاصة الذرة بوقت تعديل الملف.

لاحظت من مواصفات الذرة, ، تتضمن تواريخ الذرة إزاحة المنطقة الزمنية (Z<a number>) ولكن ، في حالتي ، لا يوجد شيء بعد Z لذلك أعتقد أننا يمكن أن نفترض GMT.

أفترض أنه يمكنني تحليل الوقت مع regex من نوع ما ، لكنني كنت آمل أن يكون لدى بيثون طريقة مدمجة في القيام بذلك لم أتمكن من العثور عليها.

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

المحلول

لا بنيت ، afaik.

feed.date.rfc3339هذه هي وحدة مكتبة Python مع وظائف لتحويل سلاسل الطابع الزمني بتنسيق RFC 3339 إلى قيم تعويم Python ، والعكس بالعكس. RFC 3339 هو تنسيق الطابع الزمني المستخدم بواسطة تنسيق Syndication Atom.

إنه مرخص لـ BSD.

http://home.blarg.net/~steveha/pyfeed.html

(تم تحريره ، لذلك من الواضح أنني لم أكتبها. :-)

نصائح أخرى

لا تتضمن مثالًا ، ولكن إذا لم يكن لديك Z إبعاد أو منطقة زمنية ، وافترض أنك لا تريد فترات ولكن فقط الوقت الأساسي ، فربما يناسبك هذا:

import datetime as dt
>>> dt.datetime.strptime('1985-04-12T23:20:50.52', '%Y-%m-%dT%H:%M:%S.%f')
datetime.datetime(1985, 4, 12, 23, 20, 50, 520000)

تمت إضافة وظيفة Strptime () إلى وحدة DateTime في Python 2.5 حتى لا يعرف بعض الأشخاص بعد أنها موجودة.

تعديل: time.strptime () كانت موجودة لفترة من الوقت ، وتعمل على نفس الشيء لإعطائك قيمة struct_time:

>>> ts = time.strptime('1985-04-12T23:20:50.52', '%Y-%m-%dT%H:%M:%S.%f')
>>> ts
time.struct_time(tm_year=1985, tm_mon=4, tm_mday=12, tm_hour=23, tm_min=20, tm_sec=50, tm_wday=4, tm_yday=102, tm_isdst=-1)
>>> time.mktime(ts)
482210450.0

http://pypi.python.org/pypi/iso8601/ يبدو أنه قادر على تحليل ISO 8601 ، الذي يعد RFC 3339 مجموعة فرعية من ، ربما يكون هذا مفيدًا ، ولكن مرة أخرى ، غير مدمجة.

لقد ناضلت مع تنسيق RFC3339 DateTime كثيرًا ، لكنني وجدت حلاً مناسبًا لتحويل Date_String <=> dateTime_Object في كلا الاتجاهين.

تحتاج إلى وحدتين خارجين مختلفين ، لأن أحدهما هو فقط قادر على القيام بالتحويل في اتجاه واحد (للأسف):

التثبيت الأول:

sudo pip install rfc3339
sudo pip install iso8601

ثم قم بتضمين:

import datetime     # for general datetime object handling
import rfc3339      # for date object -> date string
import iso8601      # for date string -> date object

لعدم الحاجة إلى تذكر الوحدة النمطية للاتجاه ، كتبت وظيفتين مساعدتين بسيطتين:

def get_date_object(date_string):
  return iso8601.parse_date(date_string)

def get_date_string(date_object):
  return rfc3339.rfc3339(date_object)

ما هو داخل الكود الخاص بك يمكنك بسهولة استخدامه مثل هذا:

input_string = '1989-01-01T00:18:07-05:00'
test_date = get_date_object(input_string)
# >>> datetime.datetime(1989, 1, 1, 0, 18, 7, tzinfo=<FixedOffset '-05:00' datetime.timedelta(-1, 68400)>)

test_string = get_date_string(test_date)
# >>> '1989-01-01T00:18:07-05:00'

test_string is input_string # >>> True

هيوكا! الآن يمكنك بسهولة (هاها) استخدم سلاسل التاريخ وسلاسل التاريخ بتنسيق صالح للاستخدام.

http://bugs.python.org/issue15873 (مكررة من http://bugs.python.org/issue5207 )

يبدو أنه لا يوجد مدمج حتى الآن.

feedparser.py يوفر طريقة قوية/قابلة للتمديد لتحليل تنسيقات التاريخ المختلفة التي يمكن مواجهتها في خلاصات Atom/RSS في العالم الحقيقي:

>>> from feedparser import _parse_date as parse_date
>>> parse_date('1985-04-12T23:20:50.52Z')
time.struct_time(tm_year=1985, tm_mon=4, tm_mday=12, tm_hour=23, tm_min=20,
                 tm_sec=50, tm_wday=4, tm_yday=102, tm_isdst=1)

إذا كنت تستخدم Django ، فيمكنك استخدام وظيفة Django parse_datetime:

>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime("2016-07-19T07:30:36+05:00")
datetime.datetime(2016, 7, 19, 7, 30, 36, tzinfo=<django.utils.timezone.FixedOffset object at 0x101c0c1d0>)

جرب هذا ، إنه يعمل بشكل جيد بالنسبة لي

datetime_obj =  datetime.strptime("2014-01-01T00:00:00Z", '%Y-%m-%dT%H:%M:%SZ')

أو

datetime_obj = datetime.strptime("Mon, 01 Jun 2015 16:41:40 GMT", '%a, %d %b %Y %H:%M:%S GMT')

باستخدام Python 3 ، يمكنك استخدام Regex لكسر الطابع الزمني RFC 3339 إلى مكوناته. بعد ذلك ، قم بإنشاء كائن DateTime مباشرةً ، لا يلزم وجود وحدات إضافية:

import re
import datetime

def parse_rfc3339(dt):
    broken = re.search(r'([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.([0-9]+))?(Z|([+-][0-9]{2}):([0-9]{2}))', dt)
    return(datetime.datetime(
        year = int(broken.group(1)),
        month = int(broken.group(2)),
        day = int(broken.group(3)),
        hour = int(broken.group(4)),
        minute = int(broken.group(5)),
        second = int(broken.group(6)),
        microsecond = int(broken.group(8) or "0"),
        tzinfo = datetime.timezone(datetime.timedelta(
            hours = int(broken.group(10) or "0"),
            minutes = int(broken.group(11) or "0")))))

هذا المثال المفقود في المناطق الزمنية أو microseconds كـ "0" ولكن قد يحتاج إلى فحص خطأ إضافي. هتاف ، أليكس

جاء عبر الرائع DateUtil.Parser الوحدة في سؤال آخر ، وجربتها في مشكلتي RFC3339 ، ويبدو أنها تتعامل مع كل ما أرميه بمزيد من العقلانية التي أي من الردود الأخرى في هذا السؤال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top