diff --git a/docs/install.rst b/docs/install.rst
index cdc17bb9..ea47311f 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -64,7 +64,6 @@ automatically installed without any action on your part:
* `pygments `_, for syntax highlighting
* `docutils `_, for supporting
reStructuredText as an input format
-* `pytz `_, for timezone definitions
* `blinker `_, an object-to-object and
broadcast signaling system
* `unidecode `_, for ASCII
diff --git a/pelican/contents.py b/pelican/contents.py
index b756f92d..4541e2ae 100644
--- a/pelican/contents.py
+++ b/pelican/contents.py
@@ -9,9 +9,9 @@ from html import unescape
from urllib.parse import unquote, urljoin, urlparse, urlunparse
try:
- import zoneinfo
+ from zoneinfo import ZoneInfo
except ModuleNotFoundError:
- from backports import zoneinfo
+ from backports.zoneinfo import ZoneInfo
from pelican.plugins import signals
@@ -127,7 +127,7 @@ class Content:
# manage timezone
default_timezone = settings.get("TIMEZONE", "UTC")
timezone = getattr(self, "timezone", default_timezone)
- self.timezone = zoneinfo.ZoneInfo(timezone)
+ self.timezone = ZoneInfo(timezone)
if hasattr(self, 'date'):
self.date = set_date_tzinfo(self.date, timezone)
diff --git a/pelican/tests/test_utils.py b/pelican/tests/test_utils.py
index 2dab2ab4..e1758726 100644
--- a/pelican/tests/test_utils.py
+++ b/pelican/tests/test_utils.py
@@ -3,10 +3,14 @@ import logging
import os
import shutil
import time
+from datetime import timezone
from sys import platform
from tempfile import mkdtemp
-import pytz
+try:
+ from zoneinfo import ZoneInfo
+except ModuleNotFoundError:
+ from backports.zoneinfo import ZoneInfo
from pelican import utils
from pelican.generators import TemplatePagesGenerator
@@ -50,21 +54,21 @@ class TestUtils(LoggedTestCase):
year=2012, month=11, day=22, hour=22, minute=11)
date_hour_z = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11,
- tzinfo=pytz.timezone('UTC'))
+ tzinfo=timezone.utc)
date_hour_est = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11,
- tzinfo=pytz.timezone('EST'))
+ tzinfo=ZoneInfo("EST"))
date_hour_sec = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11, second=10)
date_hour_sec_z = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11, second=10,
- tzinfo=pytz.timezone('UTC'))
+ tzinfo=timezone.utc)
date_hour_sec_est = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11, second=10,
- tzinfo=pytz.timezone('EST'))
+ tzinfo=ZoneInfo("EST"))
date_hour_sec_frac_z = utils.SafeDatetime(
year=2012, month=11, day=22, hour=22, minute=11, second=10,
- microsecond=123000, tzinfo=pytz.timezone('UTC'))
+ microsecond=123000, tzinfo=timezone.utc)
dates = {
'2012-11-22': date,
'2012/11/22': date,
@@ -86,13 +90,13 @@ class TestUtils(LoggedTestCase):
iso_8601_date = utils.SafeDatetime(year=1997, month=7, day=16)
iso_8601_date_hour_tz = utils.SafeDatetime(
year=1997, month=7, day=16, hour=19, minute=20,
- tzinfo=pytz.timezone('CET'))
+ tzinfo=ZoneInfo("Europe/London"))
iso_8601_date_hour_sec_tz = utils.SafeDatetime(
year=1997, month=7, day=16, hour=19, minute=20, second=30,
- tzinfo=pytz.timezone('CET'))
+ tzinfo=ZoneInfo("Europe/London"))
iso_8601_date_hour_sec_ms_tz = utils.SafeDatetime(
year=1997, month=7, day=16, hour=19, minute=20, second=30,
- microsecond=450000, tzinfo=pytz.timezone('CET'))
+ microsecond=450000, tzinfo=ZoneInfo("Europe/London"))
iso_8601 = {
'1997-07-16': iso_8601_date,
'1997-07-16T19:20+01:00': iso_8601_date_hour_tz,
diff --git a/pelican/utils.py b/pelican/utils.py
index 8d91c487..d8cf15b4 100644
--- a/pelican/utils.py
+++ b/pelican/utils.py
@@ -19,9 +19,9 @@ from operator import attrgetter
import dateutil.parser
try:
- import zoneinfo
+ from zoneinfo import ZoneInfo
except ModuleNotFoundError:
- from backports import zoneinfo
+ from backports.zoneinfo import ZoneInfo
from markupsafe import Markup
@@ -921,7 +921,7 @@ class FileSystemWatcher:
def set_date_tzinfo(d, tz_name=None):
"""Set the timezone for dates that don't have tzinfo"""
if tz_name and not d.tzinfo:
- timezone = zoneinfo.ZoneInfo(tz_name)
+ timezone = ZoneInfo(tz_name)
d = d.replace(tzinfo=timezone)
return SafeDatetime(
d.year, d.month, d.day, d.hour, d.minute, d.second, d.microsecond, d.tzinfo