Как отформатировать дату в JavaScript?
Как отформатировать объект Date
в строку в JavaScript? (Предпочтительный формат: 10-Aug-2010
)
4 ответ(ов)
Пользовательская функция форматирования:
Для фиксированных форматов простая функция решает задачу. В следующем примере выводится международный формат YYYY-MM-DD:
function dateToYMD(date) {
var d = date.getDate();
var m = date.getMonth() + 1; // Месяцы нумеруются с 0 до 11
var y = date.getFullYear();
return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}
console.log(dateToYMD(new Date(2017, 10, 5))); // Nov 5
Формат, указанный в вопросе, может быть сгенерирован так:
function dateToYMD(date) {
var strArray = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var d = date.getDate();
var m = strArray[date.getMonth()];
var y = date.getFullYear();
return '' + (d <= 9 ? '0' + d : d) + '-' + m + '-' + y;
}
console.log(dateToYMD(new Date(2017, 10, 5))); // 05-Nov-2017
Примечание: Обычно не рекомендуется расширять стандартные библиотеки JavaScript (например, добавляя эту функцию в прототип объекта Date).
Более продвинутая функция может генерировать вывод, настраиваемый в зависимости от параметра формата.
Если написание функции форматирования занимает слишком много времени, существуют множество библиотек, которые это делают. Некоторые другие ответы уже перечислили их. Однако увеличение числа зависимостей также имеет свои недостатки.
Стандартные функции форматирования ECMAScript:
С более поздними версиями ECMAScript класс Date
получил несколько специфических функций форматирования:
toDateString: Зависит от реализации, отображает только дату.
new Date().toDateString(); // Например, "Fri Nov 11 2016"
toISOString: Отображает дату и время в формате ISO 8601.
new Date().toISOString(); // Например, "2016-11-21T08:00:00.000Z"
toJSON: Строка для JSON.
new Date().toJSON(); // Например, "2016-11-21T08:00:00.000Z"
toLocaleDateString: Зависит от реализации, отображает дату в локальном формате.
new Date().toLocaleDateString(); // Например, "21/11/2016"
toLocaleString: Зависит от реализации, отображает дату и время в локальном формате.
new Date().toLocaleString(); // Например, "21/11/2016, 08:00:00 AM"
toLocaleTimeString: Зависит от реализации, отображает время в локальном формате.
new Date().toLocaleTimeString(); // Например, "08:00:00 AM"
toString: Общая строка для Date.
new Date().toString(); // Например, "Fri Nov 21 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"
Примечание: Можно сгенерировать пользовательский вывод из этих функций форматирования:
new Date().toISOString().slice(0, 10); // Возвращает YYYY-MM-DD
Примеры:
console.log("1) " + new Date().toDateString());
console.log("2) " + new Date().toISOString());
console.log("3) " + new Date().toJSON());
console.log("4) " + new Date().toLocaleDateString());
console.log("5) " + new Date().toLocaleString());
console.log("6) " + new Date().toLocaleTimeString());
console.log("7) " + new Date().toString());
console.log("8) " + new Date().toISOString().slice(0, 10));
Указание локали для стандартных функций:
Некоторые перечисленные выше стандартные функции зависят от локали:
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
Это связано с тем, что в разных культурах используются разные форматы, и они выражают дату или время по-разному. Функция по умолчанию вернет формат, настроенный на устройстве, на котором она выполняется, но это можно указать, установив аргументы (ECMA-402).
toLocaleDateString([locales[, options]])
toLocaleTimeString([locales[, options]])
toLocaleString([locales[, options]])
// Например, toLocaleDateString('ko-KR');
Параметр options
позволяет настроить более специфичный формат внутри выбранной локали. Например, месяц может отображаться как в полном формате, так и в сокращенном.
toLocaleString('en-GB', { month: 'short' })
toLocaleString('en-GB', { month: 'long' })
Примеры:
console.log("1) " + new Date().toLocaleString('en-US'));
console.log("2) " + new Date().toLocaleString('ko-KR'));
console.log("3) " + new Date().toLocaleString('de-CH'));
console.log("4) " + new Date().toLocaleString('en-GB', { hour12: false }));
console.log("5) " + new Date().toLocaleString('en-GB', { hour12: true }));
Некоторые хорошие практики, касающиеся локалей:
- Большинству людей не нравится, когда их даты отображаются в иностранном формате, поэтому старайтесь по возможности оставлять формат по умолчанию (вместо установки 'en-US' повсюду).
- Реализация преобразования из/в UTC может быть сложной (учитывая переход на летнее/зимнее время, временные зоны, которые не являются кратными 1 часу и т.д.). Когда это возможно, используйте хорошо протестированные библиотеки.
- Не предполагайте, что локаль коррелирует с конкретной страной: несколько стран имеют множество локалей (Канада, Индия и т.д.).
- Избегайте определения локали с помощью нестандартных методов. Вы можете ознакомиться с множеством подводных камней: определение раскладки клавиатуры, определение локали по географическому положению и т.д.
Вы можете использовать регулярное выражение для форматирования даты в строку без использования библиотек и методов Date. Вот пример одного из решений:
var d = (new Date()).toString().replace(/\S+\s(\S+)\s(\d+)\s(\d+)\s.*/, '$2-$1-$3');
// Дата будет отформатирована как "14-Oct-2015" (вы можете подставить любой объект даты вместо 'new Date()')
В моем тестировании это решение работает надежно в основных браузерах (Chrome, Safari, Firefox и IE). Как указал @RobG, вывод Date.prototype.toString() зависит от реализации, поэтому для международных или нестандартных реализаций обязательно протестируйте вывод, чтобы убедиться, что он работает правильно в вашем JavaScript-движке. Вы даже можете добавить код для проверки строкового вывода и убедиться, что он соответствует вашим ожиданиям перед выполнением замены с помощью регулярного выражения.
Для обеспечения поддержки во всех браузерах, вы можете использовать следующую конструкцию для форматирования даты с помощью метода toLocaleDateString
. Приведенный вами код правильно создает объект даты и форматирует его в соответствии с желаемым форматом ('дд.мм.гггг') на немецком языке:
new Date(parseInt(496407600) * 1000).toLocaleDateString('de-DE', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).replace(/\./g, '/');
Этот код использует toLocaleDateString
, который позволяет вам указать локализацию и параметры форматирования даты. В данном случае вы выбираете немецкую локализацию ('de-DE'). Чтобы заменить точки на слэши, вы используете метод replace
.
Ссылка на документацию: MDN - Date.prototype.toLocaleDateString
Если вы ищете более общий пример с использованием шаблонных литералов и форматирования даты, вот пример с использованием высших порядка:
const date = new Date(Date.UTC(2020, 4, 2, 3, 23, 16, 738));
const fmt = (dt, lc = "en-US") => (str, ...expr) =>
str.map((str, i) => str + (expr[i] ? dt.toLocaleDateString(lc, expr[i]) : '')).join('');
console.log(fmt(date)`${{year: 'numeric'}}-${{month: '2-digit'}}-${{day: '2-digit'}}`);
// ожидаемый вывод: "2020-05-02"
В этом примере функция fmt
позволяет вам форматировать дату с использованием разных параметров локализации и выражений, которые вы передаете. Вы просто указываете, какие компоненты даты (год, месяц, день) вы хотите видеть в выводе. Это делает код более модульным и гибким.
Для форматирования даты в строковом шаблоне ECMAScript Edition 6 (ES6/ES2015) вы можете использовать следующий код:
let d = new Date();
let formatted = `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;
В этом примере создается строка, содержащая год, месяц и день, разделенные символом дефиса (-
).
Если вам нужно изменить разделители, вы можете сделать это с помощью метода join()
. Например:
const delimiter = '/';
let formatted = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join(delimiter);
Этот код создаст строку, где элементы даты будут разделены символом, указанным в переменной delimiter
, в данном случае — косой чертой (/
).
Как получить текущую дату в JavaScript?
Где найти документацию по форматированию даты в JavaScript?
Форматирование даты в JavaScript в виде yyyy-mm-dd
Как вычесть дни из обычной даты?
Как преобразовать дату в UTC?