15

Где найти документацию по форматированию даты в JavaScript?

19

Я заметил, что функция JavaScript <code>new Date()</code> очень умна и принимает даты в различных форматах.

Xmas95 = new Date("25 Dec, 1995 23:15:00");
Xmas95 = new Date("2009 06 12,12:52:39");
Xmas95 = new Date("20 09 2006,12:52:39");

Я не смог найти документацию, где указаны все допустимые строковые форматы для вызова функции <code>new Date()</code>.

Это касается преобразования строки в дату. Если же рассмотреть обратную задачу, а именно преобразование объекта даты в строку, то до недавнего времени у меня было мнение, что в JavaScript нет встроенного API для форматирования объекта даты в строку.

Примечание редактора: Следующий подход является попыткой задающего вопрос, который работал в определённом браузере, но не работает в общем; см. ответы на этой странице, чтобы увидеть некоторые реальные решения.

Сегодня я поэкспериментировал с методом <code>toString()</code> на объекте даты и, к моему удивлению, он выполняет задачу форматирования даты в строки.

var d1 = new Date();
d1.toString('yyyy-MM-dd');       // Возвращает "2009-06-29" в Internet Explorer, но не в Firefox или Chrome
d1.toString('dddd, MMMM ,yyyy'); // Возвращает "Monday, June 29,2009" в Internet Explorer, но не в Firefox или Chrome

Также здесь я не нашел никакой документации по всем способам форматирования объекта даты в строку.

Где можно найти документацию, которая перечисляет спецификаторы формата, поддерживаемые объектом <code>Date()</code>?

5 ответ(ов)

2

Пользовательская функция форматирования:

Для фиксированных форматов простая функция выполняет задачу. Пример ниже генерирует международный формат YYYY-MM-DD:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

Примечание: Обычно не рекомендуется расширять стандартные библиотеки JavaScript (например, добавлять эту функцию в прототип Date).

Более продвинутая функция может генерировать настраиваемый вывод в зависимости от параметра формата. На данной странице есть несколько хороших примеров.

Если написание функции форматирования слишком длинное, существует множество библиотек, которые это делают. Некоторые другие ответы уже перечислили их. Но увеличение зависимостей также имеет свои недостатки.

Стандартные функции форматирования ECMAScript:

С более современными версиями ECMAScript класс Date получил некоторые специфические функции форматирования:

toDateString: Зависит от реализации, показывает только дату.

ECMA Specification

new Date().toDateString(); // например, "Пт Ноя 11 2016"

toISOString: Показывает дату и время в формате ISO 8601.

ECMA Specification

new Date().toISOString(); // например, "2016-11-21T08:00:00.000Z"

toJSON: Преобразует в строку для JSON.

ECMA Specification

new Date().toJSON(); // например, "2016-11-21T08:00:00.000Z"

toLocaleDateString: Зависит от реализации, дата в локальном формате.

ECMA Specification

new Date().toLocaleDateString(); // например, "21/11/2016"

toLocaleString: Зависит от реализации, дата и время в локальном формате.

ECMA Specification

new Date().toLocaleString(); // например, "21/11/2016, 08:00:00"

toLocaleTimeString: Зависит от реализации, время в локальном формате.

ECMA Specification

new Date().toLocaleTimeString(); // например, "08:00:00"

toString: Общее представление даты в строковом формате.

ECMA Specification

new Date().toString(); // например, "Пт Ноя 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

Примечание: Можно генерировать пользовательский вывод на основе этих функций форматирования:

new Date().toISOString().slice(0, 10); // По @Image72, возвращает YYYY-MM-DD
0

Ваш код преобразует текущую дату в строку формата "Год Месяц День Время". Он работает без использования каких-либо фреймворков и довольно легок в использовании. Давайте разберемся:

  1. Вы создаете новый объект Date, который получает текущую дату и время.
  2. Затем вы преобразуете этот объект в строку и разбиваете её на массив с помощью метода split(' '), получая отдельные компоненты даты.
  3. Из полученного массива вы выбираете необходимые элементы: год (d[3]), месяц (d[1]), день (d[2]) и время (d[4]).
  4. Наконец, вы соединяете их в строку, используя метод join(' ').

Ваш окончательный результат будет выглядеть так: "2013 Sep 03 21:58:03". Это удобно для представления даты в сжатом формате.

Обратите внимание, что это решение работает с учетом формата даты, возвращаемого методом Date.toString(). Если вам нужно работать с разными форматами дат или временем в разных часовых поясах, вы можете рассмотреть более специализированные библиотеки, такие как date-fns или moment.js.

0

Посмотрев на несколько предложенных вариантов в других ответах, я решил написать свое собственное ограниченное, но простое решение, которое может быть полезно и другим.

/**
* Форматирует дату в строку
* @param date - объект даты (обычно "new Date();")
* @param format - строка формата, например, "DD-MM-YYYY"
*/
function dateFormat(date, format) {
    // Вычисляем компоненты даты и заменяем соответствующие части в строке формата
    format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Дополняем нулем, если необходимо
    format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Месяцы начинаются с нуля
    format = format.replace("YYYY", date.getFullYear());
    return format;
}

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

console.log("Дата: " + dateFormat(new Date(), "DD/MM/YYYY"));
0

Вот функция, которую я часто использую. Результат будет в формате yyyy-mm-dd hh:mm:ss.nnn.

function date_and_time() {
    var date = new Date();
    // добавляем ведущий ноль, если значение меньше 10
    var zp = function (val){
        return (val <= 9 ? '0' + val : '' + val);
    }

    // добавляем ведущие нули, если значение меньше 100
    var zp2 = function(val){
        return val <= 99 ? (val <= 9 ? '00' + val : '0' + val) : ('' + val);
    }

    var d = date.getDate();
    var m = date.getMonth() + 1; // месяцы начинаются с 0
    var y = date.getFullYear();
    var h = date.getHours();
    var min = date.getMinutes();
    var s = date.getSeconds();
    var ms = date.getMilliseconds();
    return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}

Эта функция создает строку, представляющую текущую дату и время, с правильно отформатированными числами. Убедитесь, что вы вызываете функцию, когда хотите получить текущее время в указанном формате.

0

Чтобы продолжить хороший ответ gongzhitaao, вот версия метода форматирования даты, которая учитывает AM/PM:

Date.prototype.format = function (format) { // автор: meizz
    var hours = this.getHours();
    var ttime = "AM";
    if (format.indexOf("t") > -1 && hours > 12) {
        hours = hours - 12;
        ttime = "PM";
    }

    var o = {
        "M+": this.getMonth() + 1, // месяц
        "d+": this.getDate(), // день
        "h+": hours, // час
        "m+": this.getMinutes(), // минута
        "s+": this.getSeconds(), // секунда
        "q+": Math.floor((this.getMonth() + 3) / 3), // квартал
        "S": this.getMilliseconds(), // миллисекунда
        "t+": ttime // AM/PM
    };

    if (/(y+)/.test(format)) {
        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var k in o) {
        if (new RegExp("(" + k + ")").test(format)) {
            format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
        }
    }
    return format;
}

Этот код добавляет поддержку формата времени с указанием AM/PM. Если в строке формата присутствует символ "t" и часы превышают 12, то они преобразуются в 12-часовой формат с пометкой AM или PM.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь