从JS日期对象获取YYYYMMDD格式的字符串?

IVR*_*ger 366 javascript date

我正在尝试使用JS将格式date object转换为字符串YYYYMMDD.难道还有比串联更简单的方法Date.getYear(),Date.getMonth()Date.getDay()

o-o*_*o-o 594

改变了我经常使用的代码段:

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();
Run Code Online (Sandbox Code Playgroud)

  • 你应该用`.length === 2`替换`[1]`,因为不完全支持字符串上的索引器.[请参阅此答案以了解原因.](http://stackoverflow.com/a/5943760/613176) (16认同)
  • 对于想要@Aidiakapi修复的实际例子的人,我在这里创建一个小提琴:https://jsfiddle.net/pcr8xbt5/1/ (7认同)
  • var mm =(this.getMonth()+ 101).toStrung().substring(0,2); (5认同)
  • @ 9dan不应该是`var mm =(this.getMonth()+ 101).toString().substring(1,3)` (3认同)
  • 如果你想要点分隔符:`[this.getFullYear(), mm<10 ? '0'+ 毫米:毫米,dd<10 ? '0'+ dd : dd].join('.')` (2认同)

Pie*_*ert 297

我不喜欢加入原型.另一种选择是:

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;
Run Code Online (Sandbox Code Playgroud)

  • 这通常不起作用,因为Date.toISOString()创建UTC格式的日期,因此可以根据时区跳转日期边界.例如GMT + 1 :(新日期(2013,13,25)).toISOString()=='2013-12-24T23:00:00.000Z' (57认同)
  • 如果你不需要`rightNow`变量,你可以包装`new Date`并将它全部放回一行:`(new Date()).toISOString().slice(0,10).replace (/ - /克, "")` (50认同)
  • 如果10000年的某个人使用你的"怀旧"代码,这将失败. (26认同)
  • 建议改进以应对时区.`rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().片(0,10)` (8认同)
  • 我想要'YYYYMMDDHHmmSSsss`,所以我这样做:`var ds =(new Date()).toISOString().replace(/ [^ 0-9]/g,"");`.很简单,但应该封装. (5认同)
  • @Aʟᴀɢᴀʀᴏs 在这种情况下, `(new Date).toISOString().split('T')[0].replace(/-/g,"");`? (2认同)
  • 正如@weberste 指出的那样,根据您的时区,这可能无法按您的预期工作。所以我强烈建议使用从 oo 中选择的答案。 (2认同)

小智 167

您可以使用toISOString函数:

var today = new Date();
today.toISOString().substring(0, 10);
Run Code Online (Sandbox Code Playgroud)

它会给你一个"yyyy-mm-dd"格式.

  • 如果你在+1时区,并且有一个日期[2015-09-01 00:00:00 GMT + 1],那么toISOString()方法将返回字符串'2015-08-31T23:00:00.000Z '因为日期在字符串化之前转换为UTC/0-offset. (31认同)
  • 在某些情况下,这将不包括正确的一天,因为时区日光等...... (20认同)
  • 不要使用这个。我曾经有过这样的感觉,因为你可能离 UTC 很近,它会经常工作,偶尔会失败。 (6认同)
  • 也许我的创造力被打破了@Miguel,但我想不出会发生这种情况的情况。你介意提供一个例子吗? (2认同)

H6.*_*H6. 121

Moment.js可能是你的朋友

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它DID添加40kb(缩小,非gZip)到我的app.js,但我去了它,谢谢:). (16认同)
  • 我甚至不打算等到我不可避免地需要时刻,我只是在项目开始时添加它:) (9认同)
  • 你可以让它变得更容易:`var formattedDate = moment().format('YYYYMMDD');` (3认同)

NLe*_*may 36

如果您不需要纯JS解决方案,可以使用jQuery UI来完成这样的工作:

$.datepicker.formatDate('yymmdd', new Date());
Run Code Online (Sandbox Code Playgroud)

我通常不喜欢导入太多的库.但是jQuery UI非常有用,你可能会在项目的其他地方使用它.

有关更多示例,请访问http://api.jqueryui.com/datepicker/


Bri*_*ell 35

这是一行代码,您可以使用它来创建YYYY-MM-DD今天日期的字符串.

var d = new Date().toISOString().slice(0,10);
Run Code Online (Sandbox Code Playgroud)

  • 警告强硬,如果您的日期是2016-01-01 00:00:00 GMT +2,它将返回**2015-12-31**因为`toISOString()`将给出2015-12-31T22:00:00 GMT +0(两小时前). (19认同)

Eri*_*itz 23

除了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();
Run Code Online (Sandbox Code Playgroud)

RiZKiT建议的更多干小提琴

https://jsfiddle.net/EricHerlitz/tuhhfxz9/


gon*_*gqj 22

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'
Run Code Online (Sandbox Code Playgroud)

  • 最好的灵魂。 (4认同)

alf*_*edo 18

当地时间:

var date = new Date();
date = date.toJSON().slice(0, 10);
Run Code Online (Sandbox Code Playgroud)

UTC时间:

var date = new Date().toISOString();
date = date.substring(0, 10);
Run Code Online (Sandbox Code Playgroud)

在我写这篇文章时,日期将在今天打印 2020-06-15。

toISOString() 方法返回符合 ISO 标准的日期 YYYY-MM-DDTHH:mm:ss.sssZ

该代码采用 YYYY-MM-DD 格式所需的前 10 个字符。

如果您想要没有“-”的格式,请使用:

var date = new Date();
date = date.toJSON().slice(0, 10).split`-`.join``;
Run Code Online (Sandbox Code Playgroud)

在 .join`` 中,您可以添加空格、点或任何您想要的内容。

  • 不给出当地时间。 (2认同)

Dar*_*ith 16

我不喜欢修改本机对象,我认为乘法比填充接受的解决方案的字符串更清晰.

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));
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/gbdarren/Ew7Y4/

  • 虽然这对于[Y10K](http://tools.ietf.org/html/rfc2550)错误已经成熟!;) (9认同)
  • 10000乘数在那里向左移YYYY 4个位置(月和日数字各需要2位数)并且与Y10K错误无关.我喜欢这个答案,值得尊重! (3认同)
  • 这个答案被低估了,我不知道为什么.我觉得数学比字符串操作更快更清晰.如果有人知道为什么这是一个错误的答案,请告诉我. (2认同)

Dor*_*use 15

Plain 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, '');
Run Code Online (Sandbox Code Playgroud)

这是对@weberste对@Pierre Guilbert答案的评论的回应.

  • 错误.日期的UTC函数要求月份在0到11之间(但允许其他<0和> 11). (2认同)
  • 你让我今天一整天都感觉很好。我一直在寻找一种简单的方法来绕过Java中糟糕的TimeZone处理,这确实可以解决问题! (2认同)

Kus*_*Kus 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
Run Code Online (Sandbox Code Playgroud)


小智 8

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

console.log(dateFormated);
Run Code Online (Sandbox Code Playgroud)

  • 由于新的Date()有一个时区而Date.toISOString()是UTC,因此无法工作.看我的回答. (3认同)

Tam*_*kar 8

接受的答案有一点变化:

function getDate_yyyymmdd() {

    const date = new Date();

    const yyyy = date.getFullYear();
    const mm = String(date.getMonth() + 1).padStart(2,'0');
    const dd = String(date.getDate()).padStart(2,'0');

    return `${yyyy}${mm}${dd}`
}

console.log(getDate_yyyymmdd())
Run Code Online (Sandbox Code Playgroud)


Mil*_*iez 7

dateformat是一个非常常用的包。

如何使用:

dateformat从 NPM下载并安装。在你的模块中需要它:

const dateFormat = require('dateformat');

然后格式化你的东西:

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


tri*_*cot 7

另一种方法是使用toLocaleDateString具有大端日期格式标准的语言环境,例如瑞典,立陶宛,匈牙利,韩国,......:

date.toLocaleDateString('se')
Run Code Online (Sandbox Code Playgroud)

要删除分隔符(-)只需要替换非数字:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );
Run Code Online (Sandbox Code Playgroud)

这没有您可以通过UTC日期格式获得的潜在错误:与当地时区中的日期相比,UTC日期可能是一天假.


Tom*_*oms 6

根据 @oo 的答案,这将根据格式字符串返回日期字符串。如果需要,您可以轻松添加 2 位数字的年份正则表达式来表示年份和毫秒等。

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);
Run Code Online (Sandbox Code Playgroud)

然而,我不知道它的效率如何,尤其是性能方面,因为它使用了大量的正则表达式。它可能会使用一些我不掌握纯js的工作。

注意:我保留了预定义的类定义,但您可能想根据最佳实践将其放入函数或自定义类中。


Muh*_*san 6

您只需使用此一行代码即可获得年份中的日期

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();
Run Code Online (Sandbox Code Playgroud)


Str*_*lok 5

这里的人 => http://blog.stevenlevithan.com/archives/date-time-formatformat()为 Javascript 的Date对象编写了一个函数,因此它可以与熟悉的文字格式一起使用。

如果您需要应用程序的 Javascript 中的全功能日期格式,请使用它。否则,如果您想要一次性完成,那么连接 getYear()、getMonth()、getDay() 可能是最简单的。


Her*_* Qu 5

这个帖子中最受欢迎的答案有点简化版本/sf/answers/214752751/:

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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这段代码修复了Pierre Guilbert的答案:

(即使在10000年后也能正常工作)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")
Run Code Online (Sandbox Code Playgroud)


Noo*_*bTW 5

Day.js怎么样?

只有2KB,而且还可以dayjs().format('YYYY-MM-DD')

https://github.com/iamkun/dayjs


小智 5

使用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('-');
};
Run Code Online (Sandbox Code Playgroud)


Cha*_*pul 5

[day,,month,,year]= Intl.DateTimeFormat(undefined, { year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(new Date()),year.value+month.value+day.value
Run Code Online (Sandbox Code Playgroud)

或者

new Date().toJSON().slice(0,10).replace(/\/|-/g,'')
Run Code Online (Sandbox Code Playgroud)


Kam*_*ski 5

最短的

.toJSON().slice(0,10).split`-`.join``;
Run Code Online (Sandbox Code Playgroud)

.toJSON().slice(0,10).split`-`.join``;
Run Code Online (Sandbox Code Playgroud)