Перейти к основному содержимому

Дата и время (DateTime)

Поле типа Дата и время используется для хранения точных временных меток с учетом даты и времени.

Основные характеристики

  • Тип данных: Дата и время (timestamp)
  • Формат хранения: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
  • Часовой пояс: UTC (с возможностью конвертации для отображения)
  • Точность: До миллисекунд

Форматы отображения

DateTime можно отображать в различных форматах:

  • DD.MM.YYYY HH:mm — 25.11.2025 14:30
  • MM/DD/YYYY hh:mm A — 11/25/2025 02:30 PM
  • YYYY-MM-DD HH:mm:ss — 2025-11-25 14:30:00
  • D MMMM YYYY, HH:mm — 25 ноября 2025, 14:30
  • Относительный — "2 часа назад", "через 3 дня"
  • Полный ISO — 2025-11-25T14:30:00.000Z

Настройки поля

При создании поля типа "Дата и время" доступны следующие настройки:

  • Название поля: Отображаемое имя поля
  • Системное имя: Уникальный идентификатор для API
  • Описание: Подсказка для пользователей
  • Обязательное поле: Требовать заполнения
  • Значение по умолчанию:
    • Не задано
    • Текущая дата и время
    • Конкретная дата и время
  • Формат отображения: Выбор формата из списка
  • Часовой пояс: Часовой пояс для отображения
  • Включить секунды: Показывать секунды
  • Автозаполнение: Автоматически устанавливать текущее время при создании
  • Автообновление: Обновлять время при каждом изменении записи

Примеры использования

Время создания записи

{
"name": "created_at",
"type": "datetime",
"default": "now",
"readonly": true
}

Время последнего обновления

{
"name": "updated_at",
"type": "datetime",
"autoUpdate": true
}

Время начала события

{
"name": "event_start",
"type": "datetime",
"required": true
}

Дедлайн с точным временем

{
"name": "deadline",
"type": "datetime",
"required": true
}

Работа через API

Создание записи

const record = await emd.database.collection('events').create({
title: 'Встреча с клиентом',
event_start: '2025-11-25T14:30:00.000Z'
});

// Или с объектом Date
const record = await emd.database.collection('events').create({
title: 'Встреча с клиентом',
event_start: new Date('2025-11-25T14:30:00')
});

// Текущее время
const record = await emd.database.collection('logs').create({
message: 'Пользователь вошел в систему',
timestamp: new Date()
});

Поиск по дате и времени

// События, начинающиеся после определенного времени
const events = await emd.database.collection('events').find({
event_start: { $gt: '2025-11-25T12:00:00.000Z' }
});

// События в диапазоне времени
const events = await emd.database.collection('events').find({
event_start: {
$gte: '2025-11-25T09:00:00.000Z',
$lte: '2025-11-25T18:00:00.000Z'
}
});

Обновление времени

await emd.database.collection('events').update(recordId, {
event_start: '2025-11-25T15:00:00.000Z'
});

// Установить текущее время
await emd.database.collection('tasks').update(recordId, {
completed_at: new Date()
});

Операторы для полей DateTime

  • $eq — равно
  • $ne — не равно
  • $gt — позже (больше)
  • $gte — позже или равно
  • $lt — раньше (меньше)
  • $lte — раньше или равно

Специальные запросы

События на сегодня

const startOfDay = new Date();
startOfDay.setHours(0, 0, 0, 0);

const endOfDay = new Date();
endOfDay.setHours(23, 59, 59, 999);

const events = await emd.database.collection('events').find({
event_start: {
$gte: startOfDay,
$lte: endOfDay
}
});

Записи за последний час

const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);

const records = await emd.database.collection('logs').find({
created_at: { $gte: oneHourAgo }
});

События на этой неделе

const now = new Date();
const startOfWeek = new Date(now);
startOfWeek.setDate(now.getDate() - now.getDay());
startOfWeek.setHours(0, 0, 0, 0);

const endOfWeek = new Date(startOfWeek);
endOfWeek.setDate(startOfWeek.getDate() + 7);

const events = await emd.database.collection('events').find({
event_start: {
$gte: startOfWeek,
$lte: endOfWeek
}
});

Записи старше 30 дней

const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);

const oldRecords = await emd.database.collection('logs').find({
created_at: { $lt: thirtyDaysAgo }
});

Работа с часовыми поясами

Конвертация в локальный часовой пояс

const record = await emd.database.collection('events').get(recordId);
const localTime = new Date(record.event_start).toLocaleString('ru-RU', {
timeZone: 'Europe/Moscow'
});

Сохранение с учетом часового пояса

// Пользователь вводит время в своем часовом поясе
const userInput = '2025-11-25 14:30'; // Время в Москве
const moscowTime = new Date(userInput + ' GMT+0300');

await emd.database.collection('events').create({
title: 'Встреча',
event_start: moscowTime.toISOString() // Сохраняется в UTC
});

Сортировка по времени

// От старых к новым
const events = await emd.database.collection('events')
.find()
.sort({ event_start: 1 });

// От новых к старым
const logs = await emd.database.collection('logs')
.find()
.sort({ created_at: -1 });

Вычисления с датами

Длительность события

const record = await emd.database.collection('events').get(recordId);
const start = new Date(record.event_start);
const end = new Date(record.event_end);
const durationMs = end - start;
const durationHours = durationMs / (1000 * 60 * 60);

Добавление времени

const now = new Date();
const inOneWeek = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);

await emd.database.collection('tasks').update(recordId, {
deadline: inOneWeek
});

Автоматические поля

created_at и updated_at

// Эти поля можно настроить для автоматического заполнения
{
"name": "created_at",
"type": "datetime",
"default": "now",
"readonly": true
}

{
"name": "updated_at",
"type": "datetime",
"autoUpdate": true
}

Рекомендации

  • Всегда храните время в UTC, конвертируйте для отображения
  • Используйте автозаполнение для полей created_at
  • Используйте автообновление для полей updated_at
  • Для календарных событий без точного времени используйте тип Дата
  • Учитывайте часовые пояса при работе с международными пользователями
  • Используйте ISO 8601 формат для передачи дат через API
  • Для хранения длительности используйте тип Число (в секундах или минутах)

Отличие от других типов

  • DateTime vs Date: DateTime для точного времени, Date только для календарных дат
  • DateTime vs Number: DateTime для читаемых дат, Number (timestamp) для вычислений
  • DateTime vs String: DateTime обеспечивает валидацию и специальные операторы

Форматирование для разных локалей

const record = await emd.database.collection('events').get(recordId);
const date = new Date(record.event_start);

// Русский формат
console.log(date.toLocaleString('ru-RU'));
// 25.11.2025, 14:30:00

// Американский формат
console.log(date.toLocaleString('en-US'));
// 11/25/2025, 2:30:00 PM

// ISO формат
console.log(date.toISOString());
// 2025-11-25T14:30:00.000Z