Получить строку в формате ГГГГММДД из объекта даты JS?

398

Я пытаюсь использовать JS, чтобы превратить date objectв строку в YYYYMMDDформате. Есть более простой способ , чем конкатенации Date.getYear(), Date.getMonth()и Date.getDay()?

IVR Avenger
источник
4
Конкатенация эти три является путь
Хуан Кортес
5
если вам нужна строка, которая будет обрабатывать одну и ту же дату, не забудьте увеличить месяц. Чтобы соответствовать вашей спецификации, вам также нужно добавить однозначные цифры в месяце и дате с '0'
kennebec

Ответы:

621

Измененный кусок кода, который я часто использую:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();
оо
источник
16
Вы должны заменить [1]на .length===2, потому что индексатор для строки не полностью поддерживается. Смотрите этот ответ по причинам, почему.
Aidiakapi
6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9
7
Для тех, кому нужен практический пример исправления @Aidiakapi, я создаю скрипку здесь: jsfiddle.net/pcr8xbt5/1
killercowuk
1
Если вы хотите иметь разделитель точек:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski
3
@ 9дана не должно бытьvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Пнар Сби Вэр
318

Мне не понравилось добавление к прототипу. Альтернативой будет:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;

Пьер Гильбер
источник
51
Если вам не нужна rightNowпеременная вокруг, вы можете обернуть new Dateи вернуть все обратно в одну строку:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat
5
Я хотел YYYYMMDDHHmmSSsss, поэтому я сделал это var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Довольно просто, но должно быть заключено в капсулу.
Джесс
65
Это не будет работать вообще, так как Date.toISOString () создает дату в формате UTC и, следовательно, может пересекать границы даты в зависимости от часового пояса. Например, по Гринвичу + 1: (новая дата (2013, 13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste
26
Это потерпит неудачу, если кто-то в 10000 году будет использовать ваш «ностальгический» код.
Треви Авод
10
Предлагаемое улучшение, чтобы справиться с часовыми поясами. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Андреас
182

Вы можете использовать toISOStringфункцию:

var today = new Date();
today.toISOString().substring(0, 10);

Это даст вам формат "гггг-мм-дд".

Рамзи САЯГ
источник
24
В некоторых случаях это не будет включать правильный день, из-за дневного света часового пояса и т.д ...
Мигель
1
Может быть, мое творчество сломлено @Miguel, но я не могу вспомнить случай, когда это произойдет. Не могли бы вы привести пример?
облачные работы
35
Если вы находитесь в часовом поясе +1 и у вас есть дата [2015-09-01 00:00:00 GMT + 1], то метод toISOString () вернет строку '2015-08-31T23: 00: 00.000Z 'потому что дата преобразуется в UTC / 0-смещение до того, как будет преобразована в строку.
Люк Баулч
Немного короче ... var today = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit
Сбой с другой GMT
Тобиа
133

Moment.js может быть вашим другом

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');
H6.
источник
18
Ну, это добавило 40kb (минимизировано, не gZip) к моему app.js, но я пошел на это, спасибо :).
Барт
лучший ответ до сих пор!
TrulyXax
9
Я даже не удосуживаюсь ждать, пока мне неизбежно понадобится момент, я просто добавляю его в начале проекта :)
martinedwards
1
Вы можете сделать это проще:var formattedDate = moment().format('YYYYMMDD');
ns16
37

Если вам не нужно чистое решение JS, вы можете использовать jQuery UI для выполнения этой работы:

$.datepicker.formatDate('yymmdd', new Date());

Я обычно не люблю импортировать слишком много библиотек. Но jQuery UI настолько полезен, что вы, вероятно, будете использовать его где-то еще в своем проекте.

Посетите http://api.jqueryui.com/datepicker/ для большего количества примеров

NLemay
источник
37

Это одна строка кода, которую вы можете использовать для создания YYYY-MM-DDстроки сегодняшней даты.

var d = new Date().toISOString().slice(0,10);
Брайан Пауэлл
источник
^ это! FTW! +1 .. надо хоть немного проверить.
Гоголь
21
Предупреждение, если ваша дата была 2016-01-01 00:00:00 GMT +2, она вернется 2015-12-31, потому toISOString()что даст 2015-12-31T22: 00: 00 GMT +0 (двумя часами ранее).
Жером Жиллар
29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'
gongqj
источник
5
Лучшая душа.
زياد
По какой-то причине нужно было добавить время (даже если 00:00), чтобы конверсия не пропускала день назад, когда я запускаю формулу здесь, восточное побережье США. Как только я это сделал, он начал работать надежно. Что мне нравится в этом, так это то, что она может принимать входную дату в нескольких форматах, поэтому мне больше не нужно об этом беспокоиться. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea
24

В дополнение к ответу oo, я бы хотел порекомендовать отделить логические операции от возврата и вместо этого поместить их в тройные переменные.

Кроме того, используйте concat()для обеспечения безопасной конкатенации переменных

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>

Эрик Херлиц
источник
Если кому-то нравится использовать это, я предлагаю здесь СУХОЙ, повторно использовать уже созданные функции вместо того, чтобы делать то же самое снова и снова.
RiZKiT
@RiZKiT DRY - это принцип, а не шаблон, но, конечно, это можно значительно улучшить. Если бы я сам использовал это, я бы использовал другой шаблон и убрал бы методы из прототипа. Я в основном написал пример, чтобы показать там, где другие способы решения проблемы. Где люди берут это там, зависит от них самих
Эрик Херлиц
Ницца! Я использую ("00" + (this.getDate())).slice(-2)для получения двухзначных чисел. Нет оператора «if» или «?:» И меньше вызовов функции .getX (). Если не чуть быстрее, то, по крайней мере, более читабельно.
le hollandais volant
22

Мне не нравится модифицировать нативные объекты, и я думаю, что умножение яснее, чем строка, дополняющая принятое решение.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Скрипка: http://jsfiddle.net/gbdarren/Ew7Y4/

Даррен Гриффит
источник
4
Этот ответ был отклонен, и я не знаю почему. Я чувствовал, что математика быстрее и понятнее, чем манипуляции со струнами. Если кто-нибудь знает, почему это плохой ответ, пожалуйста, дайте мне знать.
Даррен Гриффит
4
Мультипликатор 10000 предназначен для смещения влево на YYYY на 4 позиции (для цифр месяца и дня нужно 2 цифры каждая), и он не имеет ничего общего с ошибкой Y10K. Мне нравится этот ответ, и он заслуживает уважения!
А. Массон
1
Спасибо за этот ответ, я создал скрипку здесь jsfiddle.net/amwebexpert/L6j0omb4
А. Массон
1
Мне не нужно было умножение вообще, и я не понимаю, почему оно там. jsfiddle.net/navyjax2/gbqmv0t5 В противном случае, оставьте это, и это отличный ответ, который мне очень помог.
vapcguy
1
@ D-Money Ах, я понял, что вы имеете в виду - вы делаете конкатенацию другого рода, складывая числа вместе, чтобы они не выполняли разные математические операции друг над другом - операцию, чтобы запретить обычную операцию, которая иначе мы их испортили. Отличная работа! Мой работает, потому что я использую разделители (которые я должен был сделать, .replace('-', '')чтобы ответить на вопрос ОП), в то время как вы были верны первоначальному вопросу ОП, и для этого не требовался этот дополнительный шаг. Отлично!
vapcguy
15

Простое решение JS (ES5) без каких-либо возможных проблем с переходом по дате, вызванных печатью Date.toISOString () в UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Это в ответ на комментарий @ weberste к ответу @Pierre Guilbert.

соня
источник
now.getMonth () вернет 0 за январь, должно быть (now.getMonth () + 1)
Jas
2
Неправильно. Функция даты в формате UTC предполагает, что месяц будет в диапазоне от 0 до 11 (но разрешены другие <0 и> 11).
соня
Почему вы заменяете несколько дефисов одним? Может ли toISOStringвернуть несколько последовательных дефисов?
Микаэль Витрант
Майкл - он заменяет каждый найденный дефис одиночным дефисом. До сих пор не знаю, почему (возможно, строка замены является просто заполнителем для разделителя). «Г» означает все вхождения. Шаблон, о котором вы думаете, это / [-] + / g
Джерард ONeill
2
Вы сделали мой день. В течение нескольких дней я искал простой способ обойти ужасную обработку TimeZone в Javascript, и это делает свое дело!
Гийом Ф.
10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509

Кус
источник
Это ответ, который я использовал. Один лайнер, который учитывает часовой пояс. Чтобы ответить на оригинальный вопрос автора, мы можем сделать следующее: (new Date (Date.now () - (new Date ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
Томвудс
спасибо, чтобы получить ГГГГ-ММ-ДД я использовал: новую дату (Date.now () - (новая дата ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / г, "-")
Ник Хамфри
7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);

Томас Шивицкас
источник
Очень умно. Спасибо
JMaylin
4
Не будет работать, поскольку новый Date () имеет часовой пояс, а Date.toISOString () имеет UTC. Смотри мой ответ.
Соня
@ Соня, не правда ли? new Date()создает новый объект даты, который является просто оберткой вокруг nr. мс с 1970/01/01 00: 00: 00.000 UTC. Затем toISOStringраспечатывает в местном часовом поясе.
Стейн де Витт
Нет, Date.toISOString () печатает в формате UTC.
Соня
7

Другой способ заключается в использовании toLocaleDateStringс локалью, которая имеет стандарт формата даты с прямым порядком байтов , такой как Швеция, Литва, Венгрия, Южная Корея, ...:

date.toLocaleDateString('se')

Чтобы удалить разделители ( -), нужно просто заменить нецифровые символы:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Это не имеет потенциальной ошибки, которую вы можете получить с форматами даты UTC: дата UTC может быть одним выходным по сравнению с датой в местном часовом поясе.

trincot
источник
6

Вы можете просто использовать этот однострочный код, чтобы получить дату в году

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();
Мухаммед Ахсан
источник
5

Немного упрощенная версия для самого популярного ответа в этой теме https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}
Герой ку
источник
5

dateformat - очень используемый пакет.

Как пользоваться:

Загрузите и установите dateformatиз NPM. Требуйте это в вашем модуле:

const dateFormat = require('dateformat');

а затем просто отформатировать ваши вещи:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');

Milkncookiez
источник
4

Этот парень здесь => http://blog.stevenlevithan.com/archives/date-time-format написал format()функцию для Dateобъекта Javascript , поэтому его можно использовать с известными литеральными форматами.

Если вам нужно полнофункциональное форматирование даты в Javascript вашего приложения, используйте его. В противном случае, если вы хотите сделать что-то одно, то объединение getYear (), getMonth (), getDay (), вероятно, будет проще всего.

Strelok
источник
4

Исходя из ответа @ oo, вы получите строку даты в соответствии со строкой формата. Вы можете легко добавить двухзначное регулярное выражение для года и миллисекунд и тому подобное, если вам это нужно.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Однако я не знаю, насколько это эффективно, особенно с точки зрения совершенства, потому что в нем много регулярных выражений. Вероятно, он мог бы использовать какую-то работу, которой я не владею pure js.

Том Том
источник
4

Этот код исправлен в ответе Пьера Гильберта:

(работает даже через 10000 лет)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")
anmml
источник
3

Я обычно использую код ниже, когда мне нужно сделать это.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Чтобы объяснить, .slice (-2) дает нам последние два символа строки.

Поэтому, несмотря ни на что, мы можем добавить «0» к дню или месяцу и просто спросить последние два, так как это всегда те два, которые мы хотим.

Поэтому, если MyDate.getMonth () вернет 9, это будет:

("0" + "9") // Giving us "09"

поэтому добавление .slice (-2) дает нам два последних символа:

("0" + "9").slice(-2)

"09"

Но если date.getMonth () вернет 10, это будет:

("0" + "10") // Giving us "010"

поэтому добавление .slice (-2) дает нам последние два символа, или:

("0" + "10").slice(-2)

"10"
Ogglas
источник
3

Если вы используете AngularJ (до 1.5), вы можете использовать фильтр даты :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
зарин
источник
3

Отвечая на другой за простоту и удобочитаемость.
Кроме того, редактирование существующих предопределенных членов класса новыми методами не рекомендуется:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);
Манохар Редди Поредди
источник
2

Если вы не против включить дополнительную (но небольшую) библиотеку, Sugar.js предоставляет множество полезных функций для работы с датами в JavaScript. Чтобы отформатировать дату, используйте функцию форматирования :

new Date().format("{yyyy}{MM}{dd}")
andersh
источник
2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));

Enam
источник
1
добавление некоторого описания к вашему ответу поможет вам вспомнить, что вы делаете в этом коде, чтобы другие могли понять его более четко.
Мухаммед Омер Аслам
В строгом режиме или машинописи вместо этого используйте «let f, yyyymmdd = x => ...». В противном случае функции yyyymmdd и f не определены.
Макс
2

Используйте padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};
yajuliv
источник
1

Вот более общий подход, который позволяет и дату и время компоненты и идентично сортируется как число или строка.

На основе порядкового номера формата Date ISO, конвертируйте в местный часовой пояс и удалите нецифровые символы. то есть:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Применение

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"
chriskelly
источник
1

Родной Javascript:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Лонни Бест
источник
1
Это не дополняет месяцы 0, чтобы месяц состоял из 2 цифр.
Аттила Сереми,
Вы правы. Я позже заметил это сам. Вы должны тщательно проверять форматирование даты в двухзначных месяцах и днях.
Лонни Бест