Формат даты и времени и его обработка при парсинге

Общий формат даты и времени, используемый в проекте – ISO формат. В общем виде формат имеет вид:

ISO8601_FMT = Y-m-dTH:M:S.mmmmmm

Пример: 2000-01-01T01:01:01.123456

Длина микросекунд должна быть всегда указана конкретно – как в примере (6 цифр).

Если микросекунды равны нулю,то они все равно пишутся т.е.

Пример: 2000-01-01T01:01:01.000000

При парсинге, например при GET запроса, для получения даты и времени в формате datetime и проверки того, что формат верен, можно использовать следующую функцию:

def datetime_from_iso8601(datetime_str):

return json.dumps( dateDeserialiser({DATE_FIELD: datetime_str}, DATE_FIELD), default=dateSerialiser)

Функция aniso8601.parse_datetime(datetime_str) принимает строку с датой, которя имеет ISO формат. Далее функция приводит эту строку к формату datetime. Если формат строки неправильный, возникнет исключение ValueError

Далее полученный datetime объект передается в функцию dateSerialiser, в которой дата и время преобразуются в понятную для JSON строку.

def dateSerialiser(obj):
    if isinstance(obj, datetime):
        return '{0}{1}'.format(obj.isoformat(), '' if obj.microsecond > 0 else '.000000')
    raise TypeError('Type is not datetime')

Пример использования: 

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_parsers.py?at=master#cl-20

Чтобы извлечь дату из JSON формата используется следующая функция:

def dateDeserialiser(dict_with_date, param_date):
    try:
        if param_date in dict_with_date and dict_with_date[param_date] is not None:
            obj = dict_with_date[param_date].replace(''', "").replace('"', '')
            return datetime.strptime(obj, ISO8601_FMT_MILLS)
    except ValueError:
        print ISO_FORMAT_ERROR
        raise
    return None

Данная функция получает на вход словарь JSON, в котором есть преобразованный объект даты и времени и ключ param_date, указывающий на объект даты и времени для извлечения. Функция datetime.strptime(datetime_str, datetime_format) преобразует строку с датой и временем, соответствующую формату описанному выше, в datetime объект.

Пример использования: 

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_resource.py?at=master#cl-29

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Leave a Reply

Your email address will not be published. Required fields are marked *