π Python ΡΡΠΈΡΠ°Π΅Ρ ΡΡΠΈ Π΄Π²Π΅ Π΄Π°ΡΡ ΡΠ°Π²Π½ΡΠΌΠΈ. Π₯ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΡΠ΅Π»ΡΠΉ ΡΠ°Ρ. ΠΡΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ°ΡΠ°Π΄ΠΎΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π±Ρ ΡΠ΄ΠΈΠ²ΠΈΡ.

ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ Π½ΠΎΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΠ°ΡΠΎΠ² Π² ΠΠ΅ΡΠ»ΠΈΠ½Π΅:
25 ΠΎΠΊΡΡΠ±ΡΡ 2026 Π³ΠΎΠ΄Π° Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΡ Ρ 03:00 Π½Π° 02:00.
ΠΠΎΡΡΠΎΠΌΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ 02:30 Π½Π°ΡΡΡΠΏΠ°Π΅Ρ Π΄Π²Π°ΠΆΠ΄Ρ:
- ΠΏΠ΅ΡΠ²ΠΎΠ΅ 02:30 – UTC+02:00;
- Π²ΡΠΎΡΠΎΠ΅ 02:30 – UTC+01:00.
ΠΡΠΎ Π΄Π²Π° ΡΠ°Π·Π½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΡΠ°Π·Π½ΠΈΡΠ΅ΠΉ ΡΠΎΠ²Π½ΠΎ Π² ΠΎΠ΄ΠΈΠ½ ΡΠ°Ρ.
from datetime import datetime
from zoneinfo import ZoneInfo
tz = ZoneInfo("Europe/Berlin")
a = datetime(
2026, 10, 25, 2, 30,
tzinfo=tz,
fold=0,
)
b = datetime(
2026, 10, 25, 2, 30,
tzinfo=tz,
fold=1,
)
Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
print(a)
# 2026-10-25 02:30:00+02:00
print(b)
# 2026-10-25 02:30:00+01:00
print(a == b)
# True
print(b - a)
# 0:00:00
ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ, Π±ΡΠ΄ΡΠΎ Python ΠΏΠΎΡΠ΅ΡΡΠ» ΡΠ΅Π»ΡΠΉ ΡΠ°Ρ.
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ, ΡΡΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΡΠ°Π·Π½ΡΠ΅:
print(a.timestamp())
print(b.timestamp())
print(b.timestamp() - a.timestamp())
# 3600.0
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ
Π£ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² a ΠΈ b ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ tzinfo.
ΠΡΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ ΡΠ°ΠΊΠΈΡ
datetime Python ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Π³ΠΎΠ΄
ΠΌΠ΅ΡΡΡ
Π΄Π΅Π½Ρ
ΡΠ°Ρ
ΠΌΠΈΠ½ΡΡΠ°
ΡΠ΅ΠΊΡΠ½Π΄Π°
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ tzinfo ΠΈ fold ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΡΡ.
Π£ ΠΎΠ±Π΅ΠΈΡ Π΄Π°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅:
2026-10-25 02:30
ΠΠΎΡΡΠΎΠΌΡ Python Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
a == b # True
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ fold
fold ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² PEP 495 ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π³ΠΎΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π΅ Ρ Π»Π΅ΡΠ½Π΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π·ΠΈΠΌΠ½Π΅Π΅.
fold=0 - ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ 02:30
fold=1 - Π²ΡΠΎΡΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ 02:30
ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ UTC:
print(a.utcoffset())
# 2:00:00
print(b.utcoffset())
# 1:00:00
ΠΠ΄Π½Π°ΠΊΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ fold Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ tzinfo.
Production-Π±Π°Π³
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΄Π°Π»ΡΠ΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΠ΅ΡΠ΅Π· set:
events = {a, b}
print(len(events))
# 1
ΠΠ²Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»ΠΈΡΡ Π² ΠΎΠ΄Π½ΠΎ.
ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΡΠΎΠ½ΡΡΡ:
- ΠΏΠ»Π°ΡΠ΅ΠΆΠΈ;
- Π·Π°ΠΊΠ°Π·Ρ;
- ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ;
- Π±ΡΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ;
- Π»ΠΎΠ³ΠΈ;
- ΡΠΎΠ½ΠΎΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ;
- Π½Π°ΡΠΈΡΠ»Π΅Π½ΠΈΡ;
- Π°Π½Π°Π»ΠΈΡΠΈΠΊΡ;
- Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π²Π° ΠΏΠ»Π°ΡΠ΅ΠΆΠ° ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΈ Π² ΡΠ°Π·Π½ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ, Π½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ Π΄Π°ΡΠ° Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΠΊΠ»ΡΡ Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΎΠ΄Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΠΎΡΠ±ΡΠΎΡΠ΅Π½Π°.
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ
ΠΠ΅ΡΠ΅Π΄ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π΄Π°ΡΡ ΠΊ UTC:
from datetime import UTC
a_utc = a.astimezone(UTC)
b_utc = b.astimezone(UTC)
print(a_utc)
# 2026-10-25 00:30:00+00:00
print(b_utc)
# 2026-10-25 01:30:00+00:00
print(a_utc == b_utc)
# False
print(b_utc - a_utc)
# 1:00:00
Π’Π΅ΠΏΠ΅ΡΡ Python ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ:
00:30 UTC
01:30 UTC
Π Π°Π·Π½ΠΈΡΠ°:
print((b_utc - a_utc).total_seconds())
# 3600.0
ΠΠΎΠΆΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΈ Unix timestamp:
a.timestamp() == b.timestamp()
# False
ΠΠ°ΠΆΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
ΠΠ΅Π»ΡΠ·Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² UTC ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΡΡΡ Π·Π°ΠΌΠ΅Π½Ρ tzinfo:
a.replace(tzinfo=UTC)
replace() ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΊΡ ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°. Π‘Π°ΠΌΠΎ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ.
ΠΠ»Ρ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ:
a.astimezone(UTC)
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ
Π Π±Π°Π·Π΅ ΠΈ ΠΊΠ»ΡΡΠ°Ρ ΡΠΎΠ±ΡΡΠΈΠΉ Ρ ΡΠ°Π½ΠΈΡΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ Π² UTC:
created_at = local_time.astimezone(UTC)
ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
display_time = created_at.astimezone(
ZoneInfo("Europe/Berlin")
)
ΠΡΠ»ΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ, ΡΠΎΡ ΡΠ°Π½ΡΠΉΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ:
UTC-ΠΌΠΎΠΌΠ΅Π½Ρ
Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Ρ
Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ
fold ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΡ ΠΏΡΠΎΡΠΈΠ² ΡΠ°ΠΊΠΎΠ³ΠΎ Π±Π°Π³Π°:
def test_repeated_local_time():
tz = ZoneInfo("Europe/Berlin")
first = datetime(
2026, 10, 25, 2, 30,
tzinfo=tz,
fold=0,
)
second = first.replace(fold=1)
first_utc = first.astimezone(UTC)
second_utc = second.astimezone(UTC)
assert first_utc != second_utc
assert second_utc - first_utc == timedelta(hours=1)
ΠΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΡΠΈΡΡΡ Π½Π° ΡΠ°ΡΠ°Ρ Π΅ΡΡ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
t.me/ai_machinelearning_big_data






