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


397

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


4
将这三个连接
JuanCortés2010年

5
如果您想将一个字符串解析为相同的日期,请不要忘记增加月份。为了符合您的规格,您还需要在月份和日期中用'0'填充个位数
kennebec 2010年

Answers:


620

我经常使用的修改过的代码:

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 2014年

6
var mm =(this.getMonth()+ 101).toStrung()。substring(0,2);
2015年

7
对于任何想要@Aidiakapi修复的实际示例的人,我在这里创建一个小提琴:jsfiddle.net/pcr8xbt5/1
killercowuk

1
如果您想使用点分隔符:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
KamilKiełczewski16年

3
@ 9dan不应该var mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

316

我不喜欢添加原型。一种替代方法是:

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 2013年

5
我想要YYYYMMDDHHmmSSsss,所以我这样做了: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");。很简单,但是应该封装。
杰西(Jess)2013年

65
由于Date.toISOString()创建UTC格式的日期,因此通常无法正常工作,因此可以根据时区跳过日期边界。例如在GMT + 1:(新日期(2013,13,25))toISOString()== '2013-12-24T23:00:00.000Z'。
weberste

26
如果某人在10000年使用您的“怀旧”代码,则此操作将失败。
Trevi Awater

9
为应对时区而建议的改进。 rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
安德里亚斯(Andreas)

181

您可以使用以下toISOString功能:

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

它将为您提供“ yyyy-mm-dd”格式。


24
在某些情况下,由于时区日光等原因,这将不包括合适的日期...
Miguel

1
也许我的创造力被破坏了@Miguel,但我想不出会发生这种情况。您介意提供一个例子吗?
cloudworks

35
如果您位于+1时区,并且具有日期[2015-09-01 00:00:00 GMT + 1],则toISOString()方法将返回字符串'2015-08-31T23:00:00.000Z ',因为日期在进行字符串化之前已转换为UTC / 0-offset。
卢克·鲍尔奇

短一点...今天是var =(new Date())。toISOString()。substring(0,10);
teawithfruit

因格林尼治标准时间(GMT)不同而失败
托比亚

131

Moment.js可能是您的朋友

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
好吧,它向我的app.js中添加了40kb(最小化,非gZip),但是我去了,谢谢:)。
巴特

到目前为止最好的答案!
TrulyXax

9
我什至不必等到我不可避免地需要片刻,我只是在项目开始时添加它:)
马丁

1
您可以var formattedDate = moment().format('YYYYMMDD');
简化操作

37

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

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

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

访问http://api.jqueryui.com/datepicker/了解更多示例


37

这是一行代码,可用于创建YYYY-MM-DD今天的日期字符串。

var d = new Date().toISOString().slice(0,10);

^这!FTW!+1 ..虽然需要测试。
Gogol

21
强烈警告您,如果您的日期是2016年1月1日00:00:00(格林尼治标准时间+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'

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>


如果有人喜欢使用它,我建议在这里进行DRY,重用已经创建的函数,而不是再做一次。
RiZKiT

@RiZKiT DRY是一个原则,而不是一种模式,但是可以肯定的是,这可以大大改善。如果我自己在哪里使用,我可能会使用另一种模式,并将方法从原型移开。我主要是通过编写示例来说明那里还有其他方法可以解决问题。人们从那里拿走它的地方取决于自己
Eric Herlitz

真好!我("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错误无关。我喜欢这个答案,值得您的尊重!
A. Masson

1
感谢您的回答,我在这里创建了小提琴jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
我根本不需要乘法,也不知道为什么要乘法。 jsfiddle.net/navyjax2/gbqmv0t5 否则,请不要理会,这是一个很好的答案,对我有很大帮助。
vapcguy

1
@ D-Money啊,我明白了你的意思-通过将数字加在一起以避免它们彼此进行不同的数学运算,您正在进行另一种串联-一种不允许使用普通数字的运算。否则就把他们搞砸了。做得好!我的作品之所以有效,是因为我使用的是分隔符(我必须.replace('-', '')对它进行回答才能使其回答OP的问题),而您对OP的原始问题是正确的,并且不需要采取额外的步骤。优秀的!
vapcguy

15

普通JS(ES5)解决方案,没有因UTC中的Date.toISOString()打印而引起的任何可能的日期跳转问题:

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)

2
错误。日期的UTC函数期望月份在0到11之间(但允许其他<0和> 11)。
Dormouse 2015年

为什么用单个连字符替换多个连字符?可以toISOString返回多个连续的连字符吗?
米切尔·维特兰特(MichaëlWitrant)

迈克尔-他正在用一个连字符替换找到的每个连字符。仍然不知道为什么(也许替换字符串只是分隔符的占位符)。“ g”表示所有出现。您正在考虑的模式是/ [-] + / g
Gerard ONeill,2016年

2
你让我今天一整天都感觉很好。我一直在寻找一种简单的方法来绕过Java中糟糕的TimeZone处理,这确实可以解决问题!
Guillaume F.

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)
-tomwoods

thx,要获取YYYY-MM-DD,我使用了:new Date(Date.now()-(new Date())。getTimezoneOffset()* 60000).toISOString()。slice(0,10).replace(/ [ ^ 0-9] / g,“-”)
尼克·汉弗莱

7

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

console.log(dateFormated);


很聪明。谢谢
JMaylin 2015年

4
由于新的Date()具有时区并且Date.toISOString()为UTC,因此无法使用。看我的答案。
睡鼠

@Dormouse不是吗?new Date()创建一个新的date对象,该对象只是nr的包装。自1970/01/01 00:00:00.000 UTC以来的毫秒数。然后toISOString在当地时区打印。
Stijn de Witt

否,Date.toISOString()以UTC打印。
睡鼠

7

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

date.toLocaleDateString('se')

删除定界符(-)只是替换非数字的问题:

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

这没有使用UTC日期格式会出现的潜在错误:与当地时区的日期相比,UTC日期可能会放假一天。



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');


4

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

如果您需要在应用程序的Javascript中使用全功能的日期格式,请使用它。否则,如果您想要做的是一次性的,则将getYear(),getMonth(),getDay()串联起来可能是最简单的。


4

从@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);

但是,我不知道这样做的效率如何,尤其是在明智的情况下,因为它使用了大量的正则表达式。它可能会使用一些我不精通纯js的工作。


4

这段代码是Pierre Guilbert的答案的修正:

(即使在10000年后仍然有效)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


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"

3

如果使用AngularJs(最大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}")

2

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


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('-');
};

1

这是一种更通用的方法,可以同时使用日期时间部分,并且可以作为数字或字符串进行相同的排序。

根据日期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"

1

本机Javascript:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
这不会用0填充月份,以确保月份为2位数字。
Attila Szeremi

你是对的。后来我自己注意到了这一点。您必须小心测试两位数月和日的日期格式。
Lonnie Best,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.