Skip to main content

flake8 plugin which bans the usage of datetime.datetime.utcnow and datetime.datetime.utcfromtimestamp

Project description

ci pre-commit.ci status

flake8-ban-utcnow

flake8 plugin which checks that datetime.utcnow() and datetime.utcfromtimestamp() are not used. It suggests using datetime.now(timezone.utc) and datetime.fromtimestamp(ts, tz=timezone.utc)instead respectively.

Also, utcnow and utcfromtimestamp are finally deprecated in Python 3.12:

note: timezone must be imported from datetime first:

from datetime import datetime
from datetime import timezone

datetime.now(timezone.utc)
from datetime import datetime
from datetime import timezone

datetime.fromtimestamp(1684079261, tz=timezone.utc)

installation

pip install flake8-ban-utcnow

flake8 code

Code Description
UTC001 don't use datetime.datetime.utcnow(), use datetime.datetime.now(datetime.timezone.utc) instead or datetime.now(datetime.UTC) on >= 3.11.
UTC002 don't use datetime.datetime.utcfromtimestamp(), use datetime.datetime.fromtimestamp(..., tz=datetime.timezone.utc) instead or datetime.datetime.fromtimestamp(..., tz=datetime.UTC) on >= 3.11.

as a pre-commit hook

See pre-commit for instructions

Sample .pre-commit-config.yaml:

- repo: https://github.com/pycqa/flake8
  rev: 6.0.0
  hooks:
    - id: flake8
      additional_dependencies: [flake8-ban-utcnow==0.2.0]

rationale

One could expect that when explicitly calling datetime.utcnow() the datetime object would be timezone aware, but it's not! A common pitfall is, deriving a timestamp from the datetime object created using datetime.utcnow().

example

  • the computer is in CEST and we want to derive a datetime in UTC formatted as a timestamp hence calling utcnow().timestamp().

    >>> from datetime import datetime
    >>> datetime.utcnow()
    datetime.datetime(2022, 8, 7, 23, 40, 17, 7858)
    >>> datetime.utcnow().timestamp()
    1659908656.048843
    
  • if we convert the timestamp, it says this, which is obviously incorrect.

    GMT: Sunday, 7. August 2022 21:44:16
    Your time zone: Sunday, 7. August 2022 23:44:16 GMT+02:00 DST
    Relative: 2 hours ago
    
  • converting it using python and datetime.fromtimestamp, we by accident get the correct datetime in UTC

    >>> datetime.fromtimestamp(1659908656.048843)
    datetime.datetime(2022, 8, 7, 23, 44, 16, 48843)
    
  • being aware that the timestamp should be in UTC we call utcfromtimestamp instead and get the result as above, since the timestamp actually is in local time, but unaware of this.

    >>> datetime.utcfromtimestamp(1659908656.048843)
    datetime.datetime(2022, 8, 7, 21, 44, 16, 48843)
    

the correct way

  • the computer is in CEST and we want to actually derive a datetime in UTC formatted as a timestamp.

    >>> from datetime import timezone
    >>> from datetime import datetime
    >>> datetime.now(timezone.utc).timestamp()
    1659916399.651218
    
  • we now get what we actually expect

    GMT: Sunday, 7. August 2022 23:53:19
    Your time zone: Monday, 8. August 2022 01:53:19 GMT+02:00 DST
    Relative: A few seconds ago
    
  • the next thing to keep in mind is, that only timezone-aware datetime objects can be compared hence using this forces us to always make sure all objects are timezone aware.

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

flake8_ban_utcnow-0.2.0.tar.gz (4.3 kB view details)

Uploaded Source

Built Distribution

flake8_ban_utcnow-0.2.0-py2.py3-none-any.whl (4.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file flake8_ban_utcnow-0.2.0.tar.gz.

File metadata

  • Download URL: flake8_ban_utcnow-0.2.0.tar.gz
  • Upload date:
  • Size: 4.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.3

File hashes

Hashes for flake8_ban_utcnow-0.2.0.tar.gz
Algorithm Hash digest
SHA256 7fe9d5a180658b65ff94ca9742e0f764b7841791b7e7bb4e1435f0c8f8a641b8
MD5 02da9b7bafdf9e9cde3e5add1e1b788b
BLAKE2b-256 1bb320e684866416fb4af24dcfac2687f0279e9e8cd247bb690081a22eb2a97c

See more details on using hashes here.

File details

Details for the file flake8_ban_utcnow-0.2.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for flake8_ban_utcnow-0.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 b7d9069142ccd96fb1e99c9c892f5c0d03929f6bc94dae58bbabfff27e6510db
MD5 7a48d99f0a5f9aa475aaa40260cadc21
BLAKE2b-256 0a2542cbd902af681271dcf990dbaa5df448ea7c89c66ce9d223dcd354a5ebc9

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