Convert RFC2822 Date Format to Python's datetime

Python
2011-06-08 01:23 (13 years ago) ytyng
# -*- coding: utf-8 -*-

"""
Function to convert RFC2822 format date to Python's datetime
Sun, 05 Jun 2011 05:32:25 +0000
Wed, 08 Jun 2011 01:21:23 +0900

Execution result:
2011-06-08 01:21:23.824852
Wed, 08 Jun 2011 01:21:23 +0900
2011-06-08 01:21:23+09:00
Wed, 08 Jun 2011 01:21:23 +0900

Reference: http://mitc.xrea.jp/diary/096
"""

import datetime
import email.utils

def parse_date_string_to_datetime(date_string_rfc822):
    """
    Parse an RFC2822 formatted date and convert it to
    a JST aware datetime
    """
    timetuple = email.utils.parsedate_tz(date_string_rfc822)
    d = datetime.datetime(*timetuple[:7]) # native
    d -= datetime.timedelta(seconds=timetuple[-1])
    d = d.replace(tzinfo=UTC()).astimezone(JST())
    return d # aware

class UTC(datetime.tzinfo):
    def utcoffset(self, dt):
        return datetime.timedelta(0)
    def dst(self, dt):
        return datetime.timedelta(0)
    def tzname(self, dt):
        return "UTC"

class JST(datetime.tzinfo):
    def utcoffset(self,dt):
        return datetime.timedelta(hours=9)
    def dst(self,dt):
        return datetime.timedelta(0)
    def tzname(self,dt):
        return "JST"

def demo():
    # test
    now = datetime.datetime.now()
    print(now)
    s = now.strftime("%a, %d %b %Y %H:%M:%S +0900") # can't use %z because it's native
    print s
    parsed = parse_date_string_to_datetime(s)
    print(parsed)
    print(parsed.strftime("%a, %d %b %Y %H:%M:%S %z")) # can use %z because it's aware

if __name__ == '__main__':
    demo()
Current rating: 5
The author runs the application development company Cyberneura.
We look forward to discussing your development needs.

Comments

Archive

2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011