Передача datetime между Python и Javascript через JSON

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для преобразования объекта datetime в JSON, нужно сериализовать объект datetime в Python в строку согласно стандарту ISO 8601, используя метод datetime.isoformat(), и десериализовать её в JavaScript при помощи конструктора new Date(). Оба языка поддерживают этот формат, что гарантирует совместимость.

В Python:

Python
Скопировать код
json_datetime = datetime.datetime.now().isoformat()  # '2023-04-01T12:34:56.789Z'

В JavaScript:

JS
Скопировать код
const dateFromJson = new Date('2023-04-01T12:34:56.789Z');
Кинга Идем в IT: пошаговый план для смены профессии

Кастомизация сериализации datetime

При сериализации datetime в JSON вам может понадобиться учесть разные типы объектов и часовые пояса. В Python для этого поможет параметр default функции json.dumps. Вы можете использовать лямбда-функцию или пользовательскую функцию для настройки сериализации по своему желанию.

В Python с настройками пользовательской функции:

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:

Python
Скопировать код
json_datetime = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')

Визуализация пути datetime

Рассмотрим, как datetime в формате JSON передаётся от Python к JavaScript:

Markdown
Скопировать код
Python (🐍) время: "2023-04-12T10:00:00.000Z"
JavaScript (🕸) время: new Date("2023-04-12T10:00:00.000Z")

Схема передачи через JSON:

Markdown
Скопировать код
🐍 --> 📦 (JSON) --> 🕸

Суть в следующем:

Markdown
Скопировать код
- Стандарт ISO 8601 поддерживается обоими языками
- `JSON` служит "переводчиком" для datetime
- `JSON` можно представить, как универсального переводчика из фильма на научно-фантастическую тематику

От Python к JSON:

Python
Скопировать код
datetime.datetime.now().isoformat()

JavaScript "переводит" из JSON:

JS
Скопировать код
new Date(jsonDateString)

Помните: в мире программирования даты и времени, ISO 8601 — ваш универсальный язык.

Обработка сложных/вложенных данных

Дата и время в реальных проектах часто содержатся в сложных, вложенных структурах данных. При работе с ними используйте класс JSONEncoder в Python или параметр object_hook для точного представления datetime.

В Python с пользовательским кодировщиком:

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:

Python
Скопировать код
json_datetime = datetime.datetime.now().replace(microsecond=0).isoformat()

Продвинутая десериализация в JavaScript

Конструктор new Date() довольно удобен, но при работе со специфическими формами или старыми движками JavaScript стоит рассмотреть использование библиотек, таких как Moment.js или date-fns, своей поддержкой ISO 8601 они превосходят встроенный конструктор.

Десериализация в JavaScript с использованием Moment.js:

JS
Скопировать код
const moment = require('moment');
const dateFromJson = moment('2023-04-01T12:34:56.789Z').toDate();

При необходимости используйте библиотеки

Встроенные функции языков хорошо справляются с форматом ISO 8601, но иногда использование библиотек, таких как dateutil для Python, предоставляет больше возможностей для работы с часовыми поясами и форматами.

Пример работы в Python с помощью dateutil:

Python
Скопировать код
from dateutil import parser
json_datetime = parser.parse('2023-04-01T12:34:56.789Z')

Трудности сериализации

Будьте внимательны к специальным случаям, например, когда в строках с сериализованной датой появляются отметки часового пояса (+02:00). В своих функциях предусмотрите обработку таких случаев для обеспечения целостности данных при десериализации.

Полезные материалы

  1. Работа с данными JSON в Python – Real Python – Python легко работает с JSON.
  2. ISO – Формат даты и времени по стандарту ISO 8601 – Международный стандарт ISO диктует универсальный формат для даты и времени.
  3. Date.prototype.toJSON() – JavaScript | MDN – Преобразование дат в формат JSON в JavaScript.
  4. Как работать с JSON в JavaScript | DigitalOcean – Инструкции по работе с JSON в JavaScript.
  5. datetime — Работа с датами и временем в Python — Документация Python 3.12.2 – Справочник по модулю datetime в Python.
  6. Moment.js | Документация – Преобразование строк даты ISO 8601 в JavaScript при помощи библиотеки Moment.js.
  7. Полное руководство по датам в JavaScript – Детальный обзор работы с датами в JavaScript.