After 8 years we’re pleased to announce Arrow v1.0. Thanks to the entire Python community for helping make Arrow the amazing package it is today!
[CHANGE] Arrow has dropped support for Python 2.7 and 3.5.
[CHANGE] There are multiple breaking changes with this release, please see the migration guide for a complete overview.
[CHANGE] Arrow is now following semantic versioning.
humanizegranularity=”auto” limits more accurate to reduce strange results.
[NEW] Added support for Python 3.9.
[NEW] Added a new keyword argument “exact” to
intervalmethods. This makes timespans begin at the start time given and not extend beyond the end time given, for example:
- ..code-block:: python
>>> start = Arrow(2021, 2, 5, 12, 30) >>> end = Arrow(2021, 2, 5, 17, 15) >>> for r in arrow.Arrow.span_range('hour', start, end, exact=True): ... print(r) ... (<Arrow [2021-02-05T12:30:00+00:00]>, <Arrow [2021-02-05T13:29:59.999999+00:00]>) (<Arrow [2021-02-05T13:30:00+00:00]>, <Arrow [2021-02-05T14:29:59.999999+00:00]>) (<Arrow [2021-02-05T14:30:00+00:00]>, <Arrow [2021-02-05T15:29:59.999999+00:00]>) (<Arrow [2021-02-05T15:30:00+00:00]>, <Arrow [2021-02-05T16:29:59.999999+00:00]>) (<Arrow [2021-02-05T16:30:00+00:00]>, <Arrow [2021-02-05T17:14:59.999999+00:00]>)
[NEW] Arrow now natively supports PEP 484-style type annotations.
[FIX] Fixed handling of maximum permitted timestamp on Windows systems.
[FIX] Corrections to French, German, Japanese and Norwegian locales.
[INTERNAL] Raise more appropriate errors when string parsing fails to match.
[WARN] Arrow will drop support for Python 2.7 and 3.5 in the upcoming 1.0.0 release. This is the last major release to support Python 2.7 and Python 3.5.
[NEW] Arrow now properly handles imaginary datetimes during DST shifts. For example:
- ..code-block:: python
>>> just_before = arrow.get(2013, 3, 31, 1, 55, tzinfo="Europe/Paris") >>> just_before.shift(minutes=+10) <Arrow [2013-03-31T03:05:00+02:00]>
- ..code-block:: python
>>> before = arrow.get("2018-03-10 23:00:00", "YYYY-MM-DD HH:mm:ss", tzinfo="US/Pacific") >>> after = arrow.get("2018-03-11 04:00:00", "YYYY-MM-DD HH:mm:ss", tzinfo="US/Pacific") >>> result=[(t, t.to("utc")) for t in arrow.Arrow.range("hour", before, after)] >>> for r in result: ... print(r) ... (<Arrow [2018-03-10T23:00:00-08:00]>, <Arrow [2018-03-11T07:00:00+00:00]>) (<Arrow [2018-03-11T00:00:00-08:00]>, <Arrow [2018-03-11T08:00:00+00:00]>) (<Arrow [2018-03-11T01:00:00-08:00]>, <Arrow [2018-03-11T09:00:00+00:00]>) (<Arrow [2018-03-11T03:00:00-07:00]>, <Arrow [2018-03-11T10:00:00+00:00]>) (<Arrow [2018-03-11T04:00:00-07:00]>, <Arrow [2018-03-11T11:00:00+00:00]>)
humanizeweek granularity translation for Tagalog.
[CHANGE] Calls to the
timestampproperty now emit a
DeprecationWarning. In a future release,
timestampwill be changed to a method to align with Python’s datetime module. If you would like to continue using the property, please change your code to use the
[CHANGE] Expanded and improved Catalan locale.
[FIX] Fixed a bug that caused
Arrow.range()to incorrectly cut off ranges in certain scenarios when using month, quarter, or year endings.
[FIX] Fixed a bug that caused day of week token parsing to be case sensitive.
[INTERNAL] A number of functions were reordered in arrow.py for better organization and grouping of related methods. This change will have no impact on usage.
[INTERNAL] A minimum tox version is now enforced for compatibility reasons. Contributors must use tox >3.18.0 going forward.
[WARN] Arrow will drop support for Python 2.7 and 3.5 in the upcoming 1.0.0 release. The 0.16.x and 0.17.x releases are the last to support Python 2.7 and 3.5.
[NEW] Implemented PEP 495 to handle ambiguous datetimes. This is achieved by the addition of the
foldattribute for Arrow objects. For example:
>>> before = Arrow(2017, 10, 29, 2, 0, tzinfo='Europe/Stockholm') <Arrow [2017-10-29T02:00:00+02:00]> >>> before.fold 0 >>> before.ambiguous True >>> after = Arrow(2017, 10, 29, 2, 0, tzinfo='Europe/Stockholm', fold=1) <Arrow [2017-10-29T02:00:00+01:00]> >>> after = before.replace(fold=1) <Arrow [2017-10-29T02:00:00+01:00]>
arrow.get. This is useful for parsing log files and/or any files that may contain inconsistent spacing. For example:
>>> arrow.get("Jun 1 2005 1:33PM", "MMM D YYYY H:mmA", normalize_whitespace=True) <Arrow [2005-06-01T13:33:00+00:00]> >>> arrow.get("2013-036 \t 04:05:06Z", normalize_whitespace=True) <Arrow [2013-02-05T04:05:06+00:00]>
[WARN] Arrow will drop support for Python 2.7 and 3.5 in the upcoming 1.0.0 release. The 0.15.x, 0.16.x, and 0.17.x releases are the last to support Python 2.7 and 3.5.
humanizeweek granularity translation for Czech.
arrow.getwill now pick sane defaults when weekdays are passed with particular token combinations, see #446.
[INTERNAL] Moved arrow to an organization. The repo can now be found here.
[INTERNAL] Started issuing deprecation warnings for Python 2.7 and 3.5.
[INTERNAL] Added Python 3.9 to CI pipeline.
[NEW] Added a number of built-in format strings. See the docs for a complete list of supported formats. For example:
>>> arw = arrow.utcnow() >>> arw.format(arrow.FORMAT_COOKIE) 'Wednesday, 27-May-2020 10:30:35 UTC'
[NEW] Arrow is now fully compatible with Python 3.9 and PyPy3.
[NEW] Added Makefile, tox.ini, and requirements.txt files to the distribution bundle.
[NEW] Added French Canadian and Swahili locales.
humanizeweek granularity translation for Hebrew, Greek, Macedonian, Swedish, Slovak.
[FIX] ms and μs timestamps are now normalized in
arrow.utcfromtimestamp(). For example:
>>> ts = 1591161115194556 >>> arw = arrow.get(ts) <Arrow [2020-06-03T05:11:55.194556+00:00]> >>> arw.timestamp 1591161115
[FIX] Refactored and updated Macedonian, Hebrew, Korean, and Portuguese locales.
[NEW] Added support for parsing and formatting ISO 8601 week dates via a new token
W, for example:
>>> arrow.get("2013-W29-6", "W") <Arrow [2013-07-20T00:00:00+00:00]> >>> utc=arrow.utcnow() >>> utc <Arrow [2020-01-23T18:37:55.417624+00:00]> >>> utc.format("W") '2020-W04-4'
[NEW] Formatting with
xtoken (microseconds) is now possible, for example:
>>> dt = arrow.utcnow() >>> dt.format("x") '1585669870688329' >>> dt.format("X") '1585669870'
humanizeweek granularity translation for German, Italian, Polish & Taiwanese locales.
[FIX] Consolidated and simplified German locales.
[INTERNAL] Moved testing suite from nosetest/Chai to pytest/pytest-mock.
[INTERNAL] Converted xunit-style setup and teardown functions in tests to pytest fixtures.
[INTERNAL] Setup Github Actions for CI alongside Travis.
[INTERNAL] Help support Arrow’s future development by donating to the project on Open Collective.
[WARN] Python 2 reached EOL on 2020-01-01. arrow will drop support for Python 2 in a future release to be decided (see #739).
[NEW] Added bounds parameter to
spanmethods. This allows you to include or exclude the start and end values.
arrow.get()can now create arrow objects from a timestamp with a timezone, for example:
>>> arrow.get(1367900664, tzinfo=tz.gettz('US/Pacific')) <Arrow [2013-05-06T21:24:24-07:00]>
humanizecan now combine multiple levels of granularity, for example:
>>> later140 = arrow.utcnow().shift(seconds=+8400) >>> later140.humanize(granularity="minute") 'in 139 minutes' >>> later140.humanize(granularity=["hour", "minute"]) 'in 2 hours and 19 minutes'
[NEW] Added Hong Kong locale (
humanizeweek granularity translation for Dutch.
[NEW] Numbers are now displayed when using the seconds granularity in
rangenow supports both the singular and plural forms of the
framesargument (e.g. day and days).
[FIX] Improved parsing of strings that contain punctuation.
[FIX] Improved behaviour of
humanizewhen singular seconds are involved.
[FIX] Fixed an issue that caused package installs to fail on Conda Forge.
factory.get()can now create arrow objects from a ISO calendar tuple, for example:
>>> arrow.get((2013, 18, 7)) <Arrow [2013-05-05T00:00:00+00:00]>
[NEW] Added a new token
xto allow parsing of integer timestamps with milliseconds and microseconds.
[NEW] Formatting now supports escaping of characters using the same syntax as parsing, for example:
>>> arw = arrow.now() >>> fmt = "YYYY-MM-DD h [h] m" >>> arw.format(fmt) '2019-11-02 3 h 32'
humanizeweek granularity translations for Chinese, Spanish and Vietnamese.
ParserErrorto module exports.
[FIX] Added support for midnight at end of day. See #703 for details.
[INTERNAL] Created Travis build for macOS.
[INTERNAL] Test parsing and formatting against full timezone database.
humanizeweek granularity translations for Portuguese and Brazilian Portuguese.
[NEW] Embedded changelog within docs and added release dates to versions.
[FIX] Fixed a bug that caused test failures on Windows only, see #668 for details.
humanizeweek granularity translations for Japanese.
[FIX] Fixed a bug that caused Arrow to fail when passed a negative timestamp string.
[FIX] Fixed a bug that caused Arrow to fail when passed a datetime object with
[NEW] Added support for DDD and DDDD ordinal date tokens. The following functionality is now possible:
[NEW] ISO 8601 basic format for dates and times is now supported (e.g.
humanizeweek granularity translations for French, Russian and Swiss German locales.
[CHANGE] Timestamps of type
strare no longer supported without a format string in the
arrow.get()method. This change was made to support the ISO 8601 basic format and to address bugs such as #447.
The following will NOT work in v0.15.0:
>>> arrow.get("1565358758") >>> arrow.get("1565358758.123413")
The following will work in v0.15.0:
>>> arrow.get("1565358758", "X") >>> arrow.get("1565358758.123413", "X") >>> arrow.get(1565358758) >>> arrow.get(1565358758.123413)
[CHANGE] When a meridian token (a|A) is passed and no meridians are available for the specified locale (e.g. unsupported or untranslated) a
[CHANGE] The timestamp token (
X) will now match float timestamps of type
[CHANGE] Strings with leading and/or trailing whitespace will no longer be parsed without a format string. Please see the docs for ways to handle this.
[FIX] The timestamp token (
X) will now only match on strings that strictly contain integers and floats, preventing incorrect matches.
[FIX] Most instances of
arrow.get()returning an incorrect
Arrowobject from a partial parsing match have been eliminated. The following issue have been addressed: #91, #196, #396, #434, #447, #456, #519, #538, #560.
ArrowParseWarningwill no longer be printed on every call to
arrow.get()with a datetime string. The purpose of the warning was to start a conversation about the upcoming 0.15.0 changes and we appreciate all the feedback that the community has given us!
[NEW] Added support for
Arrow.humanize(). For example,
arrow.utcnow().shift(weeks=-1).humanize(granularity="week")outputs “a week ago”. This change introduced two new untranslated words,
weeks, to all locale dictionaries, so locale contributions are welcome!
[NEW] Fully translated the Brazilian Portugese locale.
[CHANGE] Updated the Macedonian locale to inherit from a Slavic base.
[FIX] Fixed a bug that caused
arrow.get()to ignore tzinfo arguments of type string (e.g.
[FIX] Fixed a bug that occurred when
arrow.Arrow()was instantiated with a
[FIX] Fixed a bug that caused Arrow to fail when passed a sub-second token, that when rounded, had a value greater than 999999 (e.g.
arrow.get("2015-01-12T01:13:15.9999995")). Arrow should now accurately propagate the rounding for large sub-second tokens.
[NEW] Added Afrikaans locale.
[CHANGE] Removed deprecated
replaceshift functionality. Users looking to pass plural properties to the
replacefunction to shift values should use
[FIX] Fixed bug that occurred when
factory.get()was passed a locale kwarg.
[FIX] Fixed a regression in 0.14.3 that prevented a tzinfo argument of type string to be passed to the
get()function. Functionality such as
arrow.get("2019072807", "YYYYMMDDHH", tzinfo="UTC")should work as normal again.
Python 2.7installs to fix #495.
[NEW] Added full support for Python 3.8.
[CHANGE] Added warnings for upcoming factory.get() parsing changes in 0.15.0. Please see #612 for full details.
[FIX] Extensive refactor and update of documentation.
[FIX] factory.get() can now construct from kwargs.
[FIX] Added meridians to Spanish Locale.
[CHANGE] Travis CI builds now use tox to lint and run tests.
[FIX] Fixed UnicodeDecodeError on certain locales (#600).
ImportError: No module named 'dateutil'(#598).
[NEW] Added provisional support for Python 3.8.
[CHANGE] Removed support for EOL Python 3.4.
[FIX] Updated setup.py with modern Python standards.
[FIX] Upgraded dependencies to latest versions.
[FIX] Enabled flake8 and black on travis builds.
[FIX] Formatted code using black and isort.
[NEW] Add is_between method.
[FIX] Improved humanize behaviour for near zero durations (#416).
[FIX] Correct humanize behaviour with future days (#541).
[FIX] Documentation updates.
[FIX] Improvements to German Locale.
[NEW] Add support for Python 3.7.
[CHANGE] Remove deprecation decorators for Arrow.range(), Arrow.span_range() and Arrow.interval(), all now return generators, wrap with list() to get old behavior.
[FIX] Documentation and docstring updates.
[NEW] Added support for Python 3.6.
[CHANGE] Drop support for Python 2.6/3.3.
[CHANGE] Return generator instead of list for Arrow.range(), Arrow.span_range() and Arrow.interval().
[FIX] Make arrow.get() work with str & tzinfo combo.
[FIX] Make sure special RegEx characters are escaped in format string.
[NEW] Added support for ZZZ when formatting.
[FIX] Stop using datetime.utcnow() in internals, use datetime.now(UTC) instead.
[FIX] Return NotImplemented instead of TypeError in arrow math internals.
[NEW] Added Estonian Locale.
[FIX] Small fixes to Greek locale.
[FIX] TagalogLocale improvements.
[FIX] Added test requirements to setup.
[FIX] Improve docs for get, now and utcnow methods.
[FIX] Correct typo in depreciation warning.
[FIX] Allow universal wheels to be generated and reliably installed.
[FIX] Make humanize respect only_distance when granularity argument is also given.
[FIX] Compatibility fix for Python 2.x
[FIX] Fix grammar of ArabicLocale
[NEW] Add Nepali Locale
[FIX] Fix month name + rename AustriaLocale -> AustrianLocale
[FIX] Fix typo in Basque Locale
[FIX] Fix grammar in PortugueseBrazilian locale
[FIX] Remove pip –user-mirrors flag
[NEW] Add Indonesian Locale
[FIX] Fix getattr off by one for quarter
[FIX] Fix negative offset for UTC
[FIX] Update arrow.py
[NEW] Remove duplicate code
[NEW] Support gnu date iso 8601
[NEW] Add support for universal wheels
[NEW] Slovenian locale
[NEW] Slovak locale
[NEW] Romanian locale
[FIX] respect limit even if end is defined range
[FIX] Separate replace & shift functions
[NEW] Added tox
[FIX] Fix supported Python versions in documentation
[NEW] Azerbaijani locale added, locale issue fixed in Turkish.
[FIX] Format ParserError’s raise message
[NEW] Esperanto locale (batisteo)
[FIX] Parse localized strings #228 (swistakm)
[FIX] Modify tzinfo parameter in
getapi #221 (bottleimp)
[FIX] Fix Czech locale (PrehistoricTeam)
[FIX] Raise TypeError when adding/subtracting non-dates (itsmeolivia)
[FIX] Fix pytz conversion error (Kudo)
[FIX] Fix overzealous time truncation in span_range (kdeldycke)
[NEW] Humanize for time duration #232 (ybrs)
[NEW] Add Thai locale (sipp11)
[NEW] Adding Belarusian (be) locale (oire)
[NEW] Search date in strings (beenje)
[NEW] Note that arrow’s tokens differ from strptime’s. (offby1)
[FIX] Added support for Python 3
[FIX] Avoid truncating oversized epoch timestamps. Fixes #216.
[FIX] Fixed month abbreviations for Ukrainian
[FIX] Fix typo timezone
[FIX] A couple of dialect fixes and two new languages
[FIX] Spanish locale:
Miercolesshould have acute accent
[Fix] Fix Finnish grammar
[FIX] Fix typo in ‘Arrow.floor’ docstring
[FIX] Use read() utility to open README
[FIX] span_range for week frame
[NEW] Add minimal support for fractional seconds longer than six digits.
[NEW] Adding locale support for Marathi (mr)
[NEW] Add count argument to span method
[NEW] Improved docs
0.5.1 - 0.5.4¶
[FIX] test the behavior of simplejson instead of calling for_json directly (tonyseek)
[FIX] Add Hebrew Locale (doodyparizada)
[FIX] Update documentation location (andrewelkins)
[FIX] Update setup.py Development Status level (andrewelkins)
[FIX] Case insensitive month match (cshowe)
[NEW] struct_time addition. (mhworth)
[NEW] Version grep (eirnym)
[NEW] Default to ISO 8601 format (emonty)
[NEW] Raise TypeError on comparison (sniekamp)
[NEW] Adding Macedonian(mk) locale (krisfremen)
[FIX] Fix for ISO seconds and fractional seconds (sdispater) (andrewelkins)
[FIX] Use correct Dutch wording for “hours” (wbolster)
[FIX] Complete the list of english locales (indorilftw)
[FIX] Change README to reStructuredText (nyuszika7h)
[FIX] Parse lower-cased ‘h’ (tamentis)
[FIX] Slight modifications to Dutch locale (nvie)
[NEW] Include the docs in the released tarball
[NEW] Czech localization Czech localization for Arrow
[NEW] Add fa_ir to locales
[FIX] Fixes parsing of time strings with a final Z
[FIX] Fixes ISO parsing and formatting for fractional seconds
[FIX] test_fromtimestamp sp
[FIX] some typos fixed
[FIX] removed an unused import statement
[FIX] docs table fix
[FIX] Issue with specify ‘X’ template and no template at all to arrow.get
[FIX] Fix “import” typo in docs/index.rst
[FIX] Fix unit tests for zero passed
[FIX] Update layout.html
[FIX] In Norwegian and new Norwegian months and weekdays should not be capitalized
[FIX] Fixed discrepancy between specifying ‘X’ to arrow.get and specifying no template
[NEW] Turkish locale (Emre)
[NEW] Arabic locale (Mosab Ahmad)
[NEW] Danish locale (Holmars)
[NEW] Icelandic locale (Holmars)
[NEW] Hindi locale (Atmb4u)
[NEW] Malayalam locale (Atmb4u)
[NEW] Finnish locale (Stormpat)
[NEW] Portuguese locale (Danielcorreia)
hhstrings are now supported (Averyonghub)
[FIX] An incorrect inflection in the Polish locale has been fixed (Avalanchy)
arrow.getnow properly handles
[FIX] Tests are now declared in
setup.pyand the manifest (Pypingou)
__version__has been added to
[FIX] ISO 8601 strings can be parsed without a separator (Ivandiguisto / Root)
[FIX] Documentation is now more clear regarding some inputs on
[FIX] Some documentation links have been fixed (Vrutsky)
[FIX] Error messages for parse errors are now more descriptive (Maciej Albin)
[FIX] The parser now correctly checks for separators in strings (Mschwager)
getmethod now accepts a single
[NEW] Tokens SSSS, SSSSS and SSSSSS are supported in parsing.
Arrowobjects have a
[NEW] Vietnamese locale (Iu1nguoi)
getmethod now accepts a list of format strings (Dgilland)
[NEW] A MANIFEST.in file has been added (Pypingou)
[NEW] Tests can be run directly from
[FIX] Arrow docs now list ‘day of week’ format tokens correctly (Rudolphfroger)
[FIX] Several issues with the Korean locale have been resolved (Yoloseem)
humanizenow correctly returns unicode (Shvechikov)
Arrowobjects now pickle / unpickle correctly (Yoloseem)
[NEW] Table / explanation of formatting & parsing tokens in docs
[NEW] Brazilian locale (Augusto2112)
[NEW] Dutch locale (OrangeTux)
[NEW] Italian locale (Pertux)
[NEW] Austrain locale (LeChewbacca)
[NEW] Tagalog locale (Marksteve)
[FIX] Corrected spelling and day numbers in German locale (LeChewbacca)
getmethod should now handle unicode strings correctly (Bwells)
[FIX] Midnight and noon should now parse and format correctly (Bwells)
[NEW] Format-free ISO 8601 parsing in factory
[NEW] Support for ‘week’ / ‘weeks’ in
[NEW] Support for ‘weeks’ in
[NEW] Norwegian locale (Martinp)
[NEW] Japanese locale (CortYuming)
[FIX] Timezones no longer show the wrong sign when formatted (Bean)
[FIX] Microseconds are parsed correctly from strings (Bsidhom)
[FIX] Locale day-of-week is no longer off by one (Cynddl)
[FIX] Corrected plurals of Ukrainian and Russian nouns (Catchagain)
[CHANGE] Old 0.1
arrowmodule method removed
[CHANGE] Dropped timestamp support in
span_range(never worked correctly)
[CHANGE] Dropped parsing of single string as tz string in factory
getmethod (replaced by ISO 8601)
[NEW] French locale (Cynddl)
[NEW] Spanish locale (Slapresta)
[FIX] Ranges handle multiple timezones correctly (Ftobia)
[FIX] Humanize no longer sometimes returns the wrong month delta
__format__works correctly with no format string
[NEW] Python 2.6 support
[NEW] Initial support for locale-based parsing and formatting
[NEW] ArrowFactory class, now proxied as the module API
factoryapi method to obtain a factory for a custom type
[FIX] Python 3 support and tests completely ironed out
[NEW] Python 3+ support
[FIX] The old
arrowmodule function handles timestamps correctly as it used to
[NEW] Accept timestamps, datetimes and Arrows for datetime inputs, where reasonable
span_rangerespect end and limit parameters correctly
[CHANGE] Arrow objects are no longer mutable
[CHANGE] Plural attribute name semantics altered: single -> absolute, plural -> relative
[CHANGE] Plural names no longer supported as properties (e.g.
[NEW] Support for localized humanization
[NEW] English, Russian, Greek, Korean, Chinese locales
[NEW] Date parsing
[NEW] Date formatting
[NEW] Humanized time deltas
[FIX] Issues with conversions related to daylight savings time resolved
__str__uses ISO formatting
Started tracking changes
[NEW] Parsing of ISO-formatted time zone offsets (e.g. ‘+02:30’, ‘-05:00’)
[NEW] Resolved some issues with timestamps and delta / Olson time zones