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

我试图使用JS将date object转换为YYYYMMDD格式的字符串。有没有比连接Date.getYear()Date.getMonth()Date.getDay()更简单的方法?

1375030 次浏览

这个家伙=> http://blog.stevenlevithan.com/archives/date-time-format为Javascript的Date对象写了一个format()函数,所以它可以用熟悉的文字格式使用。

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

似乎mootools提供了Date().format(): https://mootools.net/more/docs/1.6.0/Types/Date

但我不确定是否值得只针对这个特定的任务。

我经常使用的一段修改代码:

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

我不喜欢增加原型。另一种选择是:

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;

如果你不需要一个纯JS的解决方案,你可以使用jQuery UI来做这样的工作:

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

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

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

如果你不介意包含一个额外的(但较小的)库,Sugar.js为在JavaScript中使用日期提供了许多不错的功能。 要格式化日期,使用格式函数:

new Date().format("{yyyy}{MM}{dd}")

这里有一个简洁的小函数,易于阅读,并避免了局部变量,这在JavaScript中可能是时间消耗。我不使用原型来修改标准模块,因为它会污染名称空间,并可能导致代码不能执行您认为应该执行的操作。

main函数有一个愚蠢的名字,但它传达了思想。

function dateToYYYYMMDDhhmmss(date) {
function pad(num) {
num = num + '';
return num.length < 2 ? '0' + num : num;
}
return date.getFullYear() + '/' +
pad(date.getMonth() + 1) + '/' +
pad(date.getDate()) + ' ' +
pad(date.getHours()) + ':' +
pad(date.getMinutes()) + ':' +
pad(date.getSeconds());
}

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

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/

纯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的回答的评论。

下面是对https://stackoverflow.com/users/318563/o-o的答案的一点改进

Date.prototype.ddmmyyyy = function(delimiter) {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
var dd  = this.getDate().toString();
return (dd[1]?dd:"0"+dd[0]) + delimiter + (mm[1]?mm:"0"+mm[0]) + delimiter +yyyy  ; // padding
};

希望对大家有所帮助!

:)

你可以使用toISOString函数:

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

它会给你一个“yyyy-mm-dd”格式。

Try this:

函数showdate () {

var a = new Date();
var b = a.getFullYear();
var c = a.getMonth();
(++c < 10)? c = "0" + c : c;
var d = a.getDate();
(d < 10)? d = "0" + d : d;
var final = b + "-" + c + "-" + d;


return final;




}


document.getElementById("todays_date").innerHTML = showdate();

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


console.log(dateFormated);

除了o-o的答案之外,我还建议将逻辑操作与返回值分离,并将它们作为三元放入变量中。

另外,使用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>

根据@o-o的答案,这将根据格式字符串返回日期的字符串。您可以轻松地添加一个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的工作。

注意:我保留了预定义的类定义,但你可能想把它放在一个函数或自定义类根据最佳实践。

下面是一种更通用的方法,它允许日期时间组件,并且可以作为数字或字符串进行相同的排序。

根据“Date ISO format”中的数字顺序,转换为本地时区,去掉非数字。例如:

// 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"

.
// 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

这篇文章帮助我写了这个助手,所以我分享它以防有人 正在寻找这个解决方案,它支持yyyy, mm, dd

的所有变化
Date.prototype.formattedDate = function (pattern) {
formattedDate = pattern.replace('yyyy', this.getFullYear().toString());
var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based
mm = mm.length > 1 ? mm : '0' + mm;
formattedDate = formattedDate.replace('mm', mm);
var dd = this.getDate().toString();
dd = dd.length > 1 ? dd : '0' + dd;
formattedDate = formattedDate.replace('dd', dd);
return formattedDate;
};


d = new Date();
pattern = 'yyyymmdd';  // 20150813
d.formattedDate(pattern);


pattern = 'yyyy-mm-dd';
d.formattedDate(pattern); // 2015-08-13

Moment.js可以是你的朋友

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

当我需要这样做时,我通常使用下面的代码。

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"

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

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

< >强dateformat < / >强是一个非常常用的包。

使用方法:

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

const dateFormat = require('dateformat');

然后格式化你的东西:

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

这个线程中最流行的答案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;
}
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'

js有很多有用的日期解析方法。

require("datejs")

(new Date()).toString("yyyyMMdd")

我试图写一个简单的库操作JavaScript日期对象。你可以试试这个。

var dateString = timeSolver.getString(date, "YYYYMMDD")
< p > Libarary: https://github.com/sean1093/timeSolver < / p >

很好,很简单:

    var date = new Date();
var yyyy = date.getFullYear();
var mm = date.getMonth() + 1; // getMonth() is zero-based
if (mm < 10) mm='0'+mm;
var dd = date.getDate();
if (dd < 10) dd='0'+dd;
/*date.yyyymmdd();*/


console.log('test - '+yyyy+'-'+mm+'-'+dd);

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

(10000年后依然有效)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")
@o-o解决方案在我的情况下行不通。 我的解决方案如下:

Date.prototype.yyyymmdd = function() {
var mm = this.getMonth() + 1; // getMonth() is zero-based
var dd = this.getDate();
var ret = [this.getFullYear(), (mm<10)?'0':'', mm, (dd<10)?'0':'', dd].join('');


return ret; // padding
};

另一种方法是将toLocaleDateString与具有大端日期格式标准的地区一起使用,例如瑞典,立陶宛,匈牙利,韩国,…:

date.toLocaleDateString('se')

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

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

This does not have the potential error you can get with UTC date formats: the UTC date may be one day off compared to the date in the local time zone.

var dateDisplay = new Date( 2016-11-09 05:27:00 UTC );
dateDisplay = dateDisplay.toString()
var arr = (dateDisplay.split(' '))
var date_String =  arr[0]+','+arr[1]+' '+arr[2]+' '+arr[3]+','+arr[4]

这将显示像Wed,Nov 09 2016,10:57:00这样的字符串

要获得本地日期,YYYYMMDD格式,我使用:

var todayDate = (new Date()).toLocaleString('en-GB').slice(0,10).split("\/").reverse().join("");

您可以简单地使用这一行代码来获取日期

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

如果使用AngularJs(最多1.5),你可以使用日期过滤器:

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
<pre>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]));
var ampm = (hh >= 12) ? "PM" : "AM";
format = format.replace(/ampm/g, (ampm[1]?ampm:"0"+ampm[0]));
return format;
};
var time_var = $('#899_TIME');
var myVar = setInterval(myTimer, 1000);
function myTimer() {
var d = new Date();
var date = d.getFromFormat('dd-mm-yyyy hh:ii:ss:ampm');
time_var.text(date);


} </pre>


use the code and get the output like **26-07-2017 12:29:34:PM**


check the below link for your reference


https://parthiban037.wordpress.com/2017/07/26/date-and-time-format-in-oracle-apex-using-javascript/

回答另一个简单&可读性。< br > 此外,不鼓励使用新方法编辑现有的预定义类成员:

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

原生Javascript:

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

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

date-shortcode来拯救!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'

您可以创建自己的函数,如下所示

function toString(o, regex) {
try {
if (!o) return '';
if (typeof o.getMonth === 'function' && !!regex) {
let splitChar = regex.indexOf('/') > -1 ? '/' : regex.indexOf('-') > -1 ? '-' : regex.indexOf('.') > -1 ? '.' : '';
let dateSeparate = regex.split(splitChar);
let result = '';
for (let item of dateSeparate) {
let val = '';
switch (item) {
case 'd':
val = o.getDate();
break;
case 'dd':
val = this.date2Char(o.getDate());
break;
case 'M':
val = o.getMonth() + 1;
break;
case 'MM':
val = this.date2Char(o.getMonth() + 1);
break;
case 'yyyy':
val = o.getFullYear();
break;
case 'yy':
val = this.date2Char(o.getFullYear());
break;
default:
break;
}
result += val + splitChar;
}
return result.substring(0, result.length - 1);
} else {
return o.toString();
}
} catch(ex) { return ''; }
}


function concatDateToString(args) {
if (!args.length) return '';
let result = '';
for (let i = 1; i < args.length; i++) {
result += args[i] + args[0];
}
return result.substring(0, result.length - 1);
}


function date2Char(d){
return this.rightString('0' + d);
}


function rightString(o) {
return o.substr(o.length - 2);
}

使用:

var a = new Date();
console.log('dd/MM/yyyy: ' + toString(a, 'dd/MM/yyyy'));
console.log('MM/dd/yyyy: ' + toString(a, 'MM/dd/yyyy'));
console.log('dd/MM/yy: ' + toString(a, 'dd/MM/yy'));
console.log('MM/dd/yy: ' + toString(a, 'MM/dd/yy'));

Day.js呢?

它只有2KB,你也可以dayjs().format('YYYY-MM-DD')

https://github.com/iamkun/dayjs

我希望这个函数会有用

function formatDate(dDate,sMode){
var today = dDate;
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
if(dd<10) {
dd = '0'+dd
}
if(mm<10) {
mm = '0'+mm
}
if (sMode+""==""){
sMode = "dd/mm/yyyy";
}
if (sMode == "yyyy-mm-dd"){
return  yyyy + "-" + mm + "-" + dd + "";
}
if (sMode == "dd/mm/yyyy"){
return  dd + "/" + mm + "/" + yyyy;
}


}

当然,您可以为日期字符串表示形式的每种变化构建特定的函数。如果您考虑国际日期格式,那么您会得到几十个名称荒谬且难以区分的特定函数。

没有匹配所有格式的合理函数,但有一个合理的函数组合:

const pipe2 = f => g => x =>
g(f(x));


const pipe3 = f => g => h => x =>
h(g(f(x)));


const invoke = (method, ...args) => o =>
o[method] (...args);


const padl = (c, n) => s =>
c.repeat(n)
.concat(s)
.slice(-n);


const inc = n => n + 1;


// generic format date function


const formatDate = stor => (...args) => date =>
args.map(f => f(date))
.join(stor);


// MAIN


const toYYYYMMDD = formatDate("") (
invoke("getFullYear"),
pipe3(invoke("getMonth")) (inc) (padl("0", 2)),
pipe2(invoke("getDate")) (padl("0", 2)));


console.log(toYYYYMMDD(new Date()));

是的,这是一大堆代码。但是你可以通过简单地改变传递给高阶函数formatDate的函数参数来逐字地表达每一个字符串日期表示。一切都是显式的和声明性的,也就是说,你几乎可以读到发生了什么。

使用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('-');
};
[day,,month,,year]= Intl.DateTimeFormat(undefined, { year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(new Date()),year.value+month.value+day.value

new Date().toJSON().slice(0,10).replace(/\/|-/g,'')

从ES6开始,你可以使用模板字符串使它更短:

var now = new Date();
var todayString = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}`;

这个解决方案没有零垫。看看其他好的答案,看看如何做到这一点。

当地时间:

var date = new Date();
date = date.toJSON().slice(0, 10);

UTC时间:

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

在我写这篇文章的时候,日期将在今天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``;

在.join ' '中,你可以添加空格、点或任何你喜欢的东西。

最短的

.toJSON().slice(0,10).split`-`.join``;

let d = new Date();


let s = d.toJSON().slice(0,10).split`-`.join``;


console.log(s);

这里很多答案都使用toisostring函数。这个函数在输出之前将时间转换为zulu时间,这可能会导致问题。

function datestring(time) {
return new Date(time.getTime() - time.getTimezoneOffset()*60000).toISOString().slice(0,10).replace(/-/g,"")
}


mydate = new Date("2018-05-03")
console.log(datestring(mydate))

datestring函数修复了时区问题,或者更好的是,你可以通过使用zulu时间来避免整个问题:

mydate = new Date("2018-05-03Z")
// mydate = new Date(Date.UTC(2018,5,3))
console.log(mydate.toISOString().slice(0,10).replace(/-/g,""))

对公认答案的一点变化:

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

一个衬线(2022),带正确的时区偏移

var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON().slice(0, 10).replaceAll("-", "");

// YearMonthDay


var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON().slice(0, 10).replaceAll("-", "");


console.log("YearMonthDay");
console.log(dateDisplay);


// Year-Month-Day


var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON().slice(0, 10);


console.log("Year-Month-Day");
console.log(dateDisplay);


// Year-Month-Day Hour:Minute:Second


var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON().slice(0, 19).replace("T", " ");


console.log("Year-Month-Day Hour:Minute:Second");
console.log(dateDisplay);


// Year-Month-Day Hour-Minute-Second


var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON().slice(0, 19).replace("T", " ").replaceAll(":", "-");


console.log("Year-Month-Day Hour-Minute-Second");
console.log(dateDisplay);


// ISO-8601 standard: YYYY-MM-DDTHH:mm:ss.sssZ


var dateDisplay = new Date(Date.now() - (new Date().getTimezoneOffset() * 1000 * 60)).toJSON();


console.log("ISO-8601 standard: YYYY-MM-DDTHH:mm:ss.sssZ");
console.log(dateDisplay);

我写了一个简单的函数,它可以用日期数字月数 (with 补零)和年数量按自定义顺序将Date对象转换为String。你可以将它与你喜欢的任何分隔符一起使用,也可以将此参数保留为空以使输出中没有分隔符。请看一看。

function dateToString(date, $1, $2, $3, separator='') {
const dateObj = {
date: String(date.getDate()).padStart(2, '0'),
month: String(date.getMonth() + 1).padStart(2, '0'),
year: date.getFullYear()
};


return dateObj[$1] + separator + dateObj[$2] + separator + dateObj[$3];
}


const date = new Date();


const dateString1 = dateToString(date, 'year', 'month', 'date');
console.log(dateString1);


// Manipulate arguments order to get output you want
const dateString2 = dateToString(date, 'date', 'month', 'year', '-');
console.log(dateString2);