Skip to main content

# flake8-datetimez

A plugin for flake8 to ban the usage of unsafe naive datetime class.

## Consider using Ruff instead

The checks of this plugin have been adopted into [Ruff](https://docs.astral.sh/ruff/) as its [flake8-datetimez (DTZ) rule set](https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz). Many thanks to the Ruff project for carrying these rules forward — their implementation is faster, more actively maintained, and handles more cases than this plugin does.

If you are starting a new project, or already run Ruff, please prefer it:

`toml # pyproject.toml [tool.ruff.lint] extend-select = ["DTZ"] `

This plugin remains for codebases that are still on flake8, and is maintained on a best-effort basis for backward compatibility — keeping the existing rules working across the supported Python and flake8 versions, rather than growing new ones.

## List of warnings

  • DTZ001 : The use of datetime.datetime() without tzinfo argument is not allowed.

  • DTZ002 : The use of datetime.datetime.today() is not allowed. Use datetime.datetime.now(tz=) instead.

  • DTZ003 : The use of datetime.datetime.utcnow() is not allowed. Use datetime.datetime.now(tz=) instead.

  • DTZ004 : The use of datetime.datetime.utcfromtimestamp() is not allowed. Use datetime.datetime.fromtimestamp(, tz=) instead.

  • DTZ005 : The use of datetime.datetime.now() without tz argument is not allowed.

  • DTZ006 : The use of datetime.datetime.fromtimestamp() without tz argument is not allowed.

  • DTZ007 : The use of datetime.datetime.strptime() without %z must be followed by .replace(tzinfo=).

  • DTZ011 : The use of datetime.date.today() is not allowed. Use datetime.datetime.now(tz=).date() instead.

  • DTZ012 : The use of datetime.date.fromtimestamp() is not allowed. Use datetime.datetime.fromtimestamp(, tz=).date() instead.

  • DTZ901 : The use of datetime.datetime.min or datetime.datetime.max without .replace(tzinfo=) is not allowed.

## About .astimezone()

Calling .astimezone() on a naive datetime attaches the local timezone to it, so it is accepted as a way to resolve DTZ001, DTZ002, DTZ005, DTZ006 and DTZ007:

`python datetime.datetime.now().astimezone() # ok datetime.datetime(2000, 1, 1).astimezone() # ok `

It is deliberately not accepted for the remaining warnings:

  • DTZ003, DTZ004 : utcnow() and utcfromtimestamp() return a UTC wall clock. Reading that value as local time shifts the instant, so utcnow().astimezone() is off by the local UTC offset, which is exactly what these two warnings are meant to prevent.

  • DTZ011, DTZ012 : datetime.date has no .astimezone() at all.

  • DTZ901 : datetime.min and datetime.max overflow when converted to another timezone.

## Install

Install with pip

` $ pip install flake8-datetimez `

## Requirements - Python 3.8 or above (tested on 3.8 through 3.14) - flake8 3.0.0 or above

## Running the tests

The test suite runs against every supported Python version with [tox](https://tox.wiki). No interpreter has to be installed beforehand, they are downloaded automatically by [uv](https://docs.astral.sh/uv/):

` $ uvx --with tox-uv tox `

That covers py38 through py314 plus a lint environment, and it is exactly what CI runs, one job per environment. To run a single environment, or the tests with the current interpreter only:

` $ uvx --with tox-uv tox -e py314 $ python -m unittest discover -p "test_*.py" -v `

## Linting and formatting

The code is formatted and linted with [ruff](https://docs.astral.sh/ruff/):

` $ uvx ruff format . $ uvx ruff check . `

## License

MIT

Download files

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

Source Distribution

flake8_datetimez-26.8.0.tar.gz (7.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flake8_datetimez-26.8.0-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

Details for the file flake8_datetimez-26.8.0.tar.gz.

File metadata

  • Download URL: flake8_datetimez-26.8.0.tar.gz
  • Upload date:
  • Size: 7.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.9

File hashes

Hashes for flake8_datetimez-26.8.0.tar.gz
Algorithm Hash digest
SHA256 124b7798b05ff6323a5cdefc9faebf94f566d579bdf33efdf963fb672f23960c
MD5 0ca1bf54cf97a1f0912f601b5c6587bd
BLAKE2b-256 f9260f666a31d581e9c64eded43be3d42b5baa6649bb2b3544cbb795f429940f

See more details on using hashes here.

File details

Details for the file flake8_datetimez-26.8.0-py3-none-any.whl.

File metadata

File hashes

Hashes for flake8_datetimez-26.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4cda28e3f887d51c4f125b03de4156a5eb90efd7255dc4e32b29e43656af283b
MD5 224660a179acd581b57aa5698dcae8b6
BLAKE2b-256 ecc4d5a218f007eb8360f435d1f2ffc6f2267488dad6cbe700ac4809696454ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page