**Основи datetime**
```python
from datetime import datetime, date, time, timezone
# Поточний UTC час (naive vs aware)
datetime.now() # naive — без часового поясу, використовує локальний годинник
datetime.utcnow() # naive UTC — застарілий у Python 3.12
datetime.now(timezone.utc) # aware UTC — рекомендований
# Створення конкретних дат
d = date(2024, 3, 15) # рік, місяць, день
dt = datetime(2024, 3, 15, 10, 30) # рік, місяць, день, година, хвилина
```
**Naive vs aware datetime**
Об'єкт *naive* datetime не має інформації про часовий пояс — Python не знає, чи це UTC, Нью-Йорк, чи Токіо. Об'єкт *aware* datetime містить `tzinfo` і може порівнюватись між часовими поясами:
```python
from datetime import datetime, timezone, timedelta
naive = datetime(2024, 3, 15, 10, 0) # без tzinfo
aware = datetime(2024, 3, 15, 10, 0, tzinfo=timezone.utc) # UTC
# Порівняння naive і aware неможливе:
naive < aware # TypeError: can't compare offset-naive and offset-aware
# Кастомний зсув часового поясу:
tz_kyiv = timezone(timedelta(hours=3)) # UTC+3
dt_kyiv = datetime(2024, 3, 15, 13, 0, tzinfo=tz_kyiv)
```
**zoneinfo — іменовані часові пояси (Python 3.9+)**
```python
from zoneinfo import ZoneInfo
tz = ZoneInfo('Europe/Kyiv')
dt = datetime(2024, 3, 15, 10, 0, tzinfo=tz)
dt.isoformat() # '2024-03-15T10:00:00+02:00'
# Конвертувати між часовими поясами:
dt_ny = dt.astimezone(ZoneInfo('America/New_York'))
# Той самий момент, інший локальний час
```
**Парсинг та форматування**
```python
# Парсити з рядка
dt = datetime.strptime('2024-03-15 10:30', '%Y-%m-%d %H:%M')
# Форматувати в рядок
dt.strftime('%d %B %Y') # '15 March 2024'
dt.isoformat() # '2024-03-15T10:30:00'
# Парсити ISO-формат напряму (Python 3.7+):
datetime.fromisoformat('2024-03-15T10:30:00') # без Z до Python 3.11
```
Поширені коди `strftime` / `strptime`:
```
%Y 4-значний рік %m місяць (01-12) %d день (01-31)
%H година (00-23) %M хвилина (00-59) %S секунда (00-59)
%A назва дня тижня %B назва місяця %f мікросекунди
```
Арифметика timedelta, модуль calendar та isoweekday
Розберіть рядок '2024-03-15' в об'єкт `datetime.date` і поверніть його.
from datetime import date
def parse_date(s):
# ваш код тут
pass
print(parse_date('2024-03-15')) # 2024-03-15
print(type(parse_date('2024-03-15'))) # <class 'datetime.date'>
Рішення
from datetime import date
def parse_date(s):
return date.fromisoformat(s)
Для заданого об'єкта `datetime` поверніть рядок у форматі 'March 15, 2024' (повна назва місяця, день, рік).
from datetime import datetime
def format_date(dt):
# ваш код тут
pass
from datetime import datetime
print(format_date(datetime(2024, 3, 15))) # March 15, 2024
print(format_date(datetime(2024, 11, 7))) # November 7, 2024
Рішення
from datetime import datetime
def format_date(dt):
return dt.strftime('%B %-d, %Y')
Серіалізуйте словник в рядок JSON. Словник може містити об'єкти date — перетворіть їх у рядки ISO (YYYY-MM-DD) перед серіалізацією.
import json
from datetime import date
def serialize(data):
# ваш код тут
pass
d = {'name': 'Alice', 'birthday': date(1990, 5, 21), 'score': 42}
print(serialize(d)) # '{"name": "Alice", "birthday": "1990-05-21", "score": 42}'
Рішення
import json
from datetime import date
def serialize(data):
def default(obj):
if isinstance(obj, date):
return obj.isoformat()
raise TypeError(f'Object of type {type(obj)} is not JSON serializable')
return json.dumps(data, default=default)
Розберіть рядок JSON в об'єкт Python. Якщо ключ закінчується на '_date', перетворіть його значення з рядка в `datetime.date`.
import json
from datetime import date
def deserialize(s):
# ваш код тут
pass
s = '{"name": "Alice", "start_date": "2024-01-15", "score": 42}'
result = deserialize(s)
print(result['start_date']) # 2024-01-15
print(type(result['start_date'])) # <class 'datetime.date'>
print(result['score']) # 42
Рішення
import json
from datetime import date
def deserialize(s):
def object_hook(d):
for k, v in d.items():
if k.endswith('_date') and isinstance(v, str):
d[k] = date.fromisoformat(v)
return d
return json.loads(s, object_hook=object_hook)
Для заданої дати поверніть дату першого дня того самого місяця.
from datetime import date
def first_of_month(d):
# ваш код тут
pass
from datetime import date
print(first_of_month(date(2024, 3, 15))) # 2024-03-01
print(first_of_month(date(2024, 12, 31))) # 2024-12-01
Рішення
from datetime import date
def first_of_month(d):
return d.replace(day=1)
Для списку JSON-записів (кожен з полем 'amount') обчисліть загальну суму. Поверніть 0, якщо список порожній.
import json
def total_amount(records_json):
# ваш код тут
pass
records = '[{"item": "book", "amount": 12.5}, {"item": "pen", "amount": 3.0}, {"item": "bag", "amount": 25.0}]'
print(total_amount(records)) # 40.5
print(total_amount('[]')) # 0
Рішення
import json
def total_amount(records_json):
records = json.loads(records_json)
return sum(r['amount'] for r in records)
No split tab
Налаштування cookies
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.