This rule raises an issue when the functions `datetime.datetime.utcnow` or `datetime.datetime.utcfromtimestamp` are used.

== Why is this an issue?

Python's `datetime` API provide several different ways to create `datetime` objects. One possibility is the to use
`datetime.datetime.utcnow` or `datetime.datetime.utcfromtimestamp` functions. The issue with these two functions is they are not time zone aware, even if their name would suggest otherwise.

Using these functions could cause issue as they may not behave as expected, for example:

[source,python]
----
from datetime import datetime
timestamp = 1571595618.0
date = datetime.utcfromtimestamp(timestamp)
date_timestamp = date.timestamp()

assert timestamp == date_timestamp
----

This assertion will fail if the system locale is not set to UTC.
For this reason these 2 functions are deprecated in Python 3.12.

== How to fix it

To fix this issue, prefer the usage of a timezone-aware datetime.

=== Code examples

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
from datetime import datetime

datetime.utcnow() # Noncompliant

timestamp = 1571595618.0
datetime.utcfromtimestamp(timestamp) # Noncompliant
----

==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
from datetime import datetime, timezone

datetime.now(timezone.utc) # Compliant

timestamp = 1571595618.0
datetime.fromtimestamp(timestamp, timezone.utc) # Compliant
----
== Resources
=== Documentation

* Python documentation - https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow[utcnow reference]
* Python documentation - https://docs.python.org/3/library/datetime.html#datetime.datetime.utcfromtimestamp[utcfromtimestamp reference]

=== Articles & blog posts

* Paul Ganssle blog - https://blog.ganssle.io/articles/2019/11/utcnow.html[Stop using utcnow and utcfromtimestamp]
