Передача datetime между Python и Javascript через JSON
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для преобразования объекта datetime в JSON, нужно сериализовать объект datetime
в Python в строку согласно стандарту ISO 8601, используя метод datetime.isoformat()
, и десериализовать её в JavaScript при помощи конструктора new Date()
. Оба языка поддерживают этот формат, что гарантирует совместимость.
В Python:
json_datetime = datetime.datetime.now().isoformat() # '2023-04-01T12:34:56.789Z'
В JavaScript:
const dateFromJson = new Date('2023-04-01T12:34:56.789Z');
Кастомизация сериализации datetime
При сериализации datetime в JSON вам может понадобиться учесть разные типы объектов и часовые пояса. В Python для этого поможет параметр default
функции json.dumps
. Вы можете использовать лямбда-функцию или пользовательскую функцию для настройки сериализации по своему желанию.
В Python с настройками пользовательской функции:
import datetime
import json
def datetime_handler(x):
if isinstance(x, (datetime.datetime, datetime.date)):
return x.isoformat()
raise TypeError("Объект не поддерживается")
json_data = json.dumps(datetime.datetime.now(), default=datetime_handler)
Часовые пояса и универсальные форматы
Для корректного учёта часовых поясов актуально сохранять время в формате UTC. Используйте метод strftime('%Y-%m-%dT%H:%M:%SZ')
, чтобы получить строки в UTC формате.
Формат datetime в Python для UTC:
json_datetime = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
Визуализация пути datetime
Рассмотрим, как datetime в формате JSON передаётся от Python к JavaScript:
Python (🐍) время: "2023-04-12T10:00:00.000Z"
JavaScript (🕸) время: new Date("2023-04-12T10:00:00.000Z")
Схема передачи через JSON
:
🐍 --> 📦 (JSON) --> 🕸
Суть в следующем:
- Стандарт ISO 8601 поддерживается обоими языками
- `JSON` служит "переводчиком" для datetime
- `JSON` можно представить, как универсального переводчика из фильма на научно-фантастическую тематику
От Python к JSON:
datetime.datetime.now().isoformat()
JavaScript "переводит" из JSON:
new Date(jsonDateString)
Помните: в мире программирования даты и времени, ISO 8601
— ваш универсальный язык.
Обработка сложных/вложенных данных
Дата и время в реальных проектах часто содержатся в сложных, вложенных структурах данных. При работе с ними используйте класс JSONEncoder
в Python или параметр object_hook
для точного представления datetime.
В Python с пользовательским кодировщиком:
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
json_data = json.dumps(your_data, cls=DateTimeEncoder)
Точность передачи
Для сохранения микросекунд при переводе между языками, подумайте об их обнулении, так как некоторые системы, например объект Date
в JavaScript, не работают с ними.
В Python:
json_datetime = datetime.datetime.now().replace(microsecond=0).isoformat()
Продвинутая десериализация в JavaScript
Конструктор new Date()
довольно удобен, но при работе со специфическими формами или старыми движками JavaScript стоит рассмотреть использование библиотек, таких как Moment.js или date-fns, своей поддержкой ISO 8601 они превосходят встроенный конструктор.
Десериализация в JavaScript с использованием Moment.js:
const moment = require('moment');
const dateFromJson = moment('2023-04-01T12:34:56.789Z').toDate();
При необходимости используйте библиотеки
Встроенные функции языков хорошо справляются с форматом ISO 8601, но иногда использование библиотек, таких как dateutil для Python, предоставляет больше возможностей для работы с часовыми поясами и форматами.
Пример работы в Python с помощью dateutil:
from dateutil import parser
json_datetime = parser.parse('2023-04-01T12:34:56.789Z')
Трудности сериализации
Будьте внимательны к специальным случаям, например, когда в строках с сериализованной датой появляются отметки часового пояса (+02:00
). В своих функциях предусмотрите обработку таких случаев для обеспечения целостности данных при десериализации.
Полезные материалы
- Работа с данными JSON в Python – Real Python – Python легко работает с JSON.
- ISO – Формат даты и времени по стандарту ISO 8601 – Международный стандарт ISO диктует универсальный формат для даты и времени.
- Date.prototype.toJSON() – JavaScript | MDN – Преобразование дат в формат JSON в JavaScript.
- Как работать с JSON в JavaScript | DigitalOcean – Инструкции по работе с JSON в JavaScript.
- datetime — Работа с датами и временем в Python — Документация Python 3.12.2 – Справочник по модулю datetime в Python.
- Moment.js | Документация – Преобразование строк даты ISO 8601 в JavaScript при помощи библиотеки Moment.js.
- Полное руководство по датам в JavaScript – Детальный обзор работы с датами в JavaScript.