251  /  382
Справочник

Форматирование дат в Javascript

Просмотров: 29414
Дата последнего изменения: 10.11.2023
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

В js-библиотеке есть расширение core_date.js, позволяющее форматировать дату.

Подключение в PHP

CJSCore::Init("date");

Вызов в Javascript

BX.date.format("формат", дата);

формат - полный аналог формата функции date, за исключением формата T и e (символьное название таймзоны). Также поддерживаются расширенные форматы функции FormatDate.

Если есть символы, которые не должны быть отформатированы, то необходимо эти символы оформить слешами.

BX.date.format("H:m:s \\m \\i\\s \\m\\o\\n\\t\\h")

Если формат начинается с символа ^, то функция обрежет нули. Примеры:

15.04.12 13:00:00 => 15.04.12 13:00
00:01:00 => 00:01
4 may 00:00:00 => 4 may
01-01-12 00:00 => 01-01-12

дата - это либо timestamp в секундах (тип Number), либо объект класса Date. Иначе по умолчанию текущее время (new Date()). Примеры:

BX.date.format("d-m-Y H:i:s");
BX.date.format("j F Y H:i:s");
BX.date.format("^d-m-Y H:i:s");
BX.date.format("H:m:s \\m \\i\\s \\m\\o\\n\\t\\h");
BX.date.format("Hago | dago | sago | iago | mago | Yago", new Date(2007, 2, 1, 0, 0, 0));
BX.date.format("sago | iago", 1320271200);

Также как и FormatDate, BX.date.format может принимать массив форматов для вычисление вида "1 секунда назад", "2 минуты назад" и так далее.

var format = [
	["tommorow", "tommorow, H:i:s"],
	["s" , "sago"],
	["H", "Hago"],
	["d", "dago"],
	["m100", "mago"],
	["m", "mago"],
	["-", ""]
];
BX.date.format(format, new Date(2007, 2, 1, 0, 0, 0));

Массив format состоит из элементов вида ["интервал формата", "формат"], где интервал формата определяет на каком интервале времени применится формат.
Массив format обрабатывается последовательно до первого совпадения.
Интервал времени определяется между указанной датой (первый параметр в BX.format.date) и текущей датой.

Стандарные значения "интервал формата"
s до 60 секунд
i до 60 минут
H до 24 часов
d до 31 дня
m до года
sN до N секунд *
iN до N минут *
HN до N часов *
dN до N дней *
mN до N месяцев *
today сегодня
yesterday вчера
tommorow завтра
- дефис означает дату в будущем

* - где N - это любое положительное число.

Рассмотрим пример:

var format = [
	["-", "d.m.Y H:i:s"]
	["s300" , "sago"],
	["H", "Hago"],
	["d", "dago"],
	["m", "mago"]
];

BX.date.format(format, new Date(2007, 2, 2, 9, 58, 0), new Date(2007, 2, 2, 10, 0, 0)); //1
BX.date.format(format, new Date(2007, 2, 2, 0, 0, 0), new Date(2007, 2, 2, 10, 0, 0)); //2
BX.date.format(format, new Date(2007, 2, 1, 0, 0, 0), new Date(2007, 2, 2, 10, 0, 0)); //3
BX.date.format(format, new Date(2007, 2, 3, 0, 0, 0), new Date(2007, 2, 2, 10, 0, 0)); //4

Третий параметр в BX.date.format - это текущая дата (описание смотри ниже).

  1. "120 секунд назад", сработало ["s300" , "sago"], т.к интервал времени меньше 300 секунд
  2. "10 часов назад", сработало ["H", "Hago"], т.к интервал времени меньше 24 часов
  3. "1 сутки назад", сработало ["d", "dago"], т.к интервал времени меньше 31 дня
  4. "03.03.2007 00:00:00" сработало ["-", "d.m.Y H:i:s"], так указана дата в будущем

Для значения по умолчанию последним элементом можно указать пустой "интервал формата":

var format = [
	["s" , "sago"],
	["H", "Hago"],
	["d", "dago"],
	["m", "mago"],
	["", "d.m.Y H:i:s"]
];
BX.date.format(format, new Date(2007, 2, 1, 0, 0, 0));

Полная сигнатура BX.date.format

BX.date.format("формат", дата, текущее время, utc);

текущая дата - дата (timestamp в секундах, либо объект класса Date), которая используется для вычислений типа "1 секунда назад", "2 года назад". Если не задано, по умолчанию new Date().

utc - дата в UTC. По умолчанию false. Если необходимо работать с датами в UTC.


Небольшая шпаргалка для соответствия серверного и клиентского кода:

time() = new Date()
mktime(...) = new Date(...)
gmmktime(...) = new Date(Date.UTC(...))
mktime(0,0,0, 1, 1, 1970) != 0          new Date(1970,0,1).getTime() != 0
gmmktime(0,0,0, 1, 1, 1970) == 0        new Date(Date.UTC(1970,0,1)).getTime() == 0
date("d.m.Y H:i:s") = BX.date.format("d.m.Y H:i:s")
gmdate("d.m.Y H:i:s") = BX.date.format("d.m.Y H:i:s", null, null, true);

BX.date.convertBitrixFormat

Функция конвертирует битрикс-формат даты в формат функции date. Форматы даты текущего сайта можно получить так:

BX.message("FORMAT_DATE");
BX.message("FORMAT_DATETIME");

19
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии