NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1557 most downloaded on PyPI
Fast ISO8601 date time parser for Python written in C
Last release 1 years ago
20 Aug 2025
Release timing varies
gaps range from 3 weeks to 1.5 years
Some releases are documented
notes for 11 of 20 stable releases
Nothing withdrawn
no release was ever pulled
12 years old
20 releases · first in 2014
Fixed memory leak in FixedOffset_fromutc ( #172 ).
FixedOffset_fromutc (#172).Add support for aarch64 wheels. Thank you @bbayles !
One column per quarter.
Version 2.3.1 - 2023-10-30 Added Python 3.12 wheels
Added missing fromutc implementation for FixedOffset ( #113 ). Thanks @davidkraljic
fromutc implementation for FixedOffset (#113). Thanks @davidkraljicFixedOffset's dst, tzname and utcoffset without argumentsdatetime.tzname returns a str in Python 2.7, not a unicodeMETH_VARARGS to METH_O, enhancing performance. (#130)Release v2.2.0
Release v2.2.0 (#106)
timezone objects.
pendulum and @sdispater for the code.pytz dependency :smiley:CISO8601_CACHING_ENABLED=0 environment variableUpdate changelog and bump version number
Update changelog and bump version number
Fixed a problem where ciso8601.__version__ was not working (#80). Thanks @ianhoffman.
ciso8601.__version__ was not working (#80). Thanks @ianhoffman.Getting ready for a 2.1.1 release.
Getting ready for a 2.1.1 release.
Using the release (non-beta) versions of Python 3.7
Using the release (non-beta) versions of Python 3.7
parse_rfc3339, which strictly parses RFC 3339 (#70).20140203T23:35:27 and 2014-02-03T233527 are not valid in ISO 8601, but were not raising ValueError.ValueErrorFixed some memory leaks introduced in 2.0.0
Version 2.0.0 was a major rewrite of ciso8601.
Version 2.0.0 was a major rewrite of ciso8601.
Version 1.x.x had a problem with error handling in the case of invalid timestamps.
In 1.x.x, parse_datetime:
None and others might get truncated and return an incorrect Python datetime (this was bad)A developer with a given timestamp string, could not predict a priori what ciso8601 is going to return without looking at the code.
Fundamentally, this is the problem that version 2 addressed.
Fundamentally, parse_datetime(dt: String): datetime was rewritten so that it takes a string and either:
ValueError with a description of the reason why the string doesn't conform to the supported subset of ISO 8601ValueError when a timestamp does not conform to the supported subset of ISO 8601
parse_datetime_unaware was renamed to parse_datetime_as_naive (See "Migration Guide" below for reasons)ImportError (Only affects Python 2.7). Fixes #19Places where you were checking for a return of None from ciso8601:
timestamp = "2018-01-01T00:00:00+05:00"
dt = parse_datetime(timestamp)
if dt is None:
raise ValueError(f"Could not parse {timestamp}")
You should change to now expect ValueError to be thrown:
timestamp = "2018-01-01T00:00:00+05:00"
dt = parse_datetime(timestamp)
The rules with respect to what ciso8601 will consider a conforming ISO 8601 string have been tightened.
Now a timestamp will parse if and only if the timestamp is 100% conforming to the supported subset of the ISO 8601 specification.
# trailing separator
"2014-"
"2014-01-"
"2014-01-01T"
"2014-01-01T00:"
"2014-01-01T00:00:"
"2014-01-01T00:00:00-"
"2014-01-01T00:00:00-00:"
# Mix of no-separator and separator
"201401-02"
"2014-0102"
"2014-01-02T00:0000"
"2014-01-02T0000:00"
"2014-01-02T01:23:45Zabcdefghij" # Trailing characters
"2014-01-1" # Single digit day
"2014-01-01T00:00:00-0:04" # Single digit tzhour
"2014-01-01T00:00:00-00:4" # Single digit tzminute
These should have been considered bugs in ciso8601 1.x.x, but it may be the case that your code was relying on the previously lax parsing rules.
parse_datetime_unaware has been renamedparse_datetime_unaware existed for the case where your input timestamp had time zone information, but you wanted to ignore the time zone information and therefore could save some cycles by not creating the underlying tzinfo object.
It has been renamed to parse_datetime_as_naive for 2 reasons:
parse_datetime_unaware was the function to use for parsing naive timestamps, when really it is for parsing timestamps with time zone information as naive datetimes. parse_datetime handles parsing both timestamps with and without time zone information and should be used for all parsing, unless you actually need this use case. See additional description in the README for a more detailed description of this use case.naive, not unawareBefore switching all instances of parse_datetime_unaware, make sure to ask yourself whether you actually intended to use parse_datetime_unaware.
parse_datetime instead.parse_datetime_as_naive instead.| Input with TZ Info | Input without TZ Info | |
|---|---|---|
parse_datetime() output |
tz aware datetime | tz naive datetime |
parse_datetime_as_naive() output |
tz naive datetime | tz naive datetime |
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →