Skip to main content

An ISO 8601 date/time/duration parser and formatter

Project description

ISO 8601 date/time parser

Travis-CI Coveralls Latest Version License

This module implements ISO 8601 date, time and duration parsing. The implementation follows ISO8601:2004 standard, and implements only date/time representations mentioned in the standard. If something is not mentioned there, then it is treated as non existent, and not as an allowed option.

For instance, ISO8601:2004 never mentions 2 digit years. So, it is not intended by this module to support 2 digit years. (while it may still be valid as ISO date, because it is not explicitly forbidden.) Another example is, when no time zone information is given for a time, then it should be interpreted as local time, and not UTC.

As this module maps ISO 8601 dates/times to standard Python data types, like date, time, datetime and timedelta, it is not possible to convert all possible ISO 8601 dates/times. For instance, dates before 0001-01-01 are not allowed by the Python date and datetime classes. Additionally fractional seconds are limited to microseconds. That means if the parser finds for instance nanoseconds it will round it down to microseconds.

Documentation

The following parsing methods are available.
  • parse_time:

    parses an ISO 8601 time string into a time object

  • parse_date:

    parses an ISO 8601 date string into a date object

  • parse_datetime:

    parses an ISO 8601 date-time string into a datetime object

  • parse_duration:

    parses an ISO 8601 duration string into a timedelta or Duration object.

  • parse_tzinfo:

    parses the time zone info part of an ISO 8601 string into a tzinfo object.

As ISO 8601 allows to define durations in years and months, and timedelta does not handle years and months, this module provides a Duration class, which can be used almost like a timedelta object (with some limitations). However, a Duration object can be converted into a timedelta object.

There are also ISO formatting methods for all supported data types. Each xxx_isoformat method accepts a format parameter. The default format is always the ISO 8601 expanded format. This is the same format used by datetime.isoformat:

  • time_isoformat:

    Intended to create ISO time strings with default format hh:mm:ssZ.

  • date_isoformat:

    Intended to create ISO date strings with default format yyyy-mm-dd.

  • datetime_isoformat:

    Intended to create ISO date-time strings with default format yyyy-mm-ddThh:mm:ssZ.

  • duration_isoformat:

    Intended to create ISO duration strings with default format PnnYnnMnnDTnnHnnMnnS.

  • tz_isoformat:

    Intended to create ISO time zone strings with default format hh:mm.

  • strftime:

    A re-implementation mostly compatible with Python’s strftime, but supports only those format strings, which can also be used for dates prior 1900. This method also understands how to format datetime and Duration instances.

Installation

This module can easily be installed with Python standard installation methods.

Use pip install isodate.

Limitations

  • The parser accepts several date/time representation which should be invalid according to ISO 8601 standard.

    1. for date and time together, this parser accepts a mixture of basic and extended format. e.g. the date could be in basic format, while the time is accepted in extended format. It also allows short dates and times in date-time strings.

    2. For incomplete dates, the first day is chosen. e.g. 19th century results in a date of 1901-01-01.

    3. negative Duration and timedelta value are not fully supported yet.

Further information

The doc strings and unit tests should provide rather detailed information about the methods and their limitations.

The source release provides a setup.py script, which can be used to run the unit tests included.

Source code is available at https://github.com/gweis/isodate.

CHANGES

0.7.3 (unreleased)

  • no changes yet

0.7.2 (2024-10-08)

  • drop end of life python versions

  • Don’t match garbage characters at the end of parsed strings #16 (Gabriel de Perthuis)

Potentially breaking changes:

  • Fractional seconds are cut off to microseconds (always round down)

  • Allow control over return type of parse_duration #64 (Felix Claessen)

  • Python >= 3.7 required

0.6.1 (2021-12-13)

  • support python 3.10 (Hugo van Kemenade)

  • last version to support py 2.7

0.6.0 (2017-10-13)

  • support incomplete month date (Fabien Loffredo)

  • rely on duck typing when doing duration maths

  • support ‘:’ as separator in fractional time zones (usrenmae)

0.5.4 (2015-08-06)

  • Fix parsing of Periods (Fabien Bochu)

  • Make Duration objects hashable (Geoffrey Fairchild)

  • Add multiplication to duration (Reinoud Elhorst)

0.5.1 (2014-11-07)

  • fixed pickling of Duration objects

  • raise ISO8601Error when there is no ‘T’ separator in datetime strings (Adrian Coveney)

0.5.0 (2014-02-23)

  • ISO8601Error are subclasses of ValueError now (Michael Hrivnak)

  • improve compatibility across various python variants and versions

  • raise exceptions when using fractional years and months in date maths with durations

  • renamed method todatetime on Duraction objects to totimedelta

0.4.9 (2012-10-30)

  • support pickling FixedOffset instances

  • make sure parsed fractional seconds are in microseconds

  • add leading zeros when formattig microseconds (Jarom Loveridge)

0.4.8 (2012-05-04)

  • fixed incompatibility of unittests with python 2.5 and 2.6 (runs fine on 2.7 and 3.2)

0.4.7 (2012-01-26)

  • fixed tzinfo formatting (never pass None into tzinfo.utcoffset())

0.4.6 (2012-01-06)

  • added Python 3 compatibility via 2to3

0.4.5 (2012-01-06)

  • made setuptools dependency optional

0.4.4 (2011-04-16)

  • Fixed formatting of microseconds for datetime objects

0.4.3 (2010-10-29)

  • Fixed problem with %P formatting and fractions (supplied by David Brooks)

0.4.2 (2010-10-28)

  • Implemented unary - for Duration (supplied by David Brooks)

  • Output fractional seconds with ‘%P’ format. (partly supplied by David Brooks)

0.4.1 (2010-10-13)

  • fixed bug in comparison between timedelta and Duration.

  • fixed precision problem with microseconds (reported by Tommi Virtanen)

0.4.0 (2009-02-09)

  • added method to parse ISO 8601 time zone strings

  • added methods to create ISO 8601 conforming strings

0.3.0 (2009-1-05)

  • Initial release

TODOs

This to do list contains some thoughts and ideas about missing features, and parts to think about, whether to implement them or not. This list is probably not complete.

Missing features:

  • time formatting does not allow to create fractional representations.

  • parser for ISO intervals.

  • currently microseconds are always padded to a length of 6 characters. trailing 0s should be optional

Documentation:

  • parse_datetime:
    • complete documentation to show what this function allows, but ISO forbids. and vice verse.

    • support other separators between date and time than ‘T’

  • parse_date:
    • yeardigits should be always greater than 4

    • dates before 0001-01-01 are not supported

  • parse_duration:
    • alternative formats are not fully supported due to parse_date restrictions

    • standard duration format is fully supported but not very restrictive.

  • Duration:
    • support fractional years and month in calculations

    • implement w3c order relation? (http://www.w3.org/TR/xmlschema-2/#duration-order)

    • refactor to have duration mathematics only at one place.

    • localize __str__ method (does timedelta do this?)

    • when is a Duration negative?

    • normalize Durations. months [00-12] and years ]-inf,+inf[

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

isodate-0.7.2.tar.gz (29.7 kB view details)

Uploaded Source

Built Distribution

isodate-0.7.2-py3-none-any.whl (22.3 kB view details)

Uploaded Python 3

File details

Details for the file isodate-0.7.2.tar.gz.

File metadata

  • Download URL: isodate-0.7.2.tar.gz
  • Upload date:
  • Size: 29.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for isodate-0.7.2.tar.gz
Algorithm Hash digest
SHA256 4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6
MD5 5ce182fd7f6152cda19ec605b6740687
BLAKE2b-256 544de940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749

See more details on using hashes here.

File details

Details for the file isodate-0.7.2-py3-none-any.whl.

File metadata

  • Download URL: isodate-0.7.2-py3-none-any.whl
  • Upload date:
  • Size: 22.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for isodate-0.7.2-py3-none-any.whl
Algorithm Hash digest
SHA256 28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15
MD5 f94e527b847362a79a455d0b55134579
BLAKE2b-256 15aa0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page