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

Posted

技术标签:

【中文标题】从 JS 日期对象获取 YYYYMMDD 格式的字符串?【英文标题】:Get String in YYYYMMDD format from JS date object? 【发布时间】:2011-03-05 05:46:36 【问题描述】:

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

【问题讨论】:

连接这三个是要走的路 如果你想要一个解析到相同日期的字符串,不要忘记增加月份。为了匹配您的规范,您还需要在月份和日期中使用 '0' 填充单个数字 【参考方案1】:

为什么不使用 jQuery?

在您的页面中只需下载/导入文件:

<script th:src="@/scripts/jquery-dateformat.min.js"></script>

以及您要在哪里格式化日期:

$.format.date(aDate, 'yyyyMMdd');

您可以在此处查看更多详细信息/示例: https://www.npmjs.com/package/jquery-dateformat

【讨论】:

【参考方案2】:

这里很多答案都使用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,""))

【讨论】:

【参考方案3】:

根据@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的工作。

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

【讨论】:

【参考方案4】:

当地时间:

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`` 中,您可以添加空格、点或任何您喜欢的内容。

【讨论】:

错误。因为.toISOString(); 将返回UTC 时间。因此,根据时间和您的时区,您将获得的最终日期可能是 +1 天或 -1 天 已编辑。你说的对。使用 ' var date = new Date();日期 = date.toJSON().slice(0, 10); ' 给出当地时间。 不提供当地时间。【参考方案5】:

最短

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

let d = new Date();

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

console.log(s);

【讨论】:

【参考方案6】:

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

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

此解决方案不补零。看看其他好的答案,看看如何做到这一点。

【讨论】:

您的代码中有两个错误:1) 您没有考虑到 getMonth() 是从零开始的事实,以及 2) 您没有用零填充。总之,“2020 年 1 月 1 日”将导致2020-0-1,这远非理想。 其他答案中已经显示了许多零填充技术,我真的只是想显示模板字符串。但我会在答案中添加免责声明。【参考方案7】:
[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,'')

【讨论】:

这对我来说非常接近,但DateTimeFormat 的顺序不同。我怀疑它是本地化的。 第二行错误。 .toISOString(); 将返回 UTC 时间。因此,根据时间和您的时区,您将获得的最终日期可能是 +1 天或 -1 天【参考方案8】:

dateformat 是一个非常常用的包。

如何使用:

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

const dateFormat = require('dateformat');

然后格式化你的东西:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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/

【讨论】:

这个答案被否决了,我不知道为什么。我觉得数学比字符串操作更快更清晰。如果有人知道为什么这是一个不好的答案,请告诉我。 10000 乘法器用于将 YYYY 左移 4 位(月和日数字各需要 2 位数字),与 Y10K 错误无关。我喜欢这个答案,值得尊重! 感谢您的回答我在这里创建了小提琴jsfiddle.net/amwebexpert/L6j0omb4 我根本不需要乘法,我不明白它为什么存在。 jsfiddle.net/navyjax2/gbqmv0t5 否则,请忽略它,这是一个很好的答案,对我帮助很大。 @D-Money 啊,我明白你的意思了 - 你正在通过将数字相加来进行不同类型的连接,以避免它们对彼此进行不同的数学运算 - 运算禁止正常的,否则会搞砸他们。好工作!我的工作是因为我使用了分隔符(我必须在上面做一个.replace('-', '') 才能让它回答 OP 的问题),而你对 OP 的原始问题是真实的,它不需要额外的步骤。太棒了!【参考方案11】:

除了 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>

【讨论】:

如果有人喜欢使用它,我建议在这里 DRY,重用已经创建的函数,而不是从头再来。 @RiZKiT DRY 是一个原则,而不是一个模式,但可以肯定的是,这可以改进很多。如果我自己在哪里使用它,我可能会使用另一种模式并将方法从原型中移开。我主要写了这个例子来展示其他解决问题的方法。人们从那里拿走它取决于他们自己 不错!我使用("00" + (this.getDate())).slice(-2) 来获取两位数的数字。没有“if”或“?:”语句,对 .getX() 函数的调用也更少。如果不是更快一点,它至少更具可读性。【参考方案12】:

你可以使用toISOString函数:

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

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

【讨论】:

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

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

不过,我不确定是否值得只为这项特定任务包括在内。

【讨论】:

【参考方案14】:

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

没有一个合理的函数可以匹配所有格式,但是有一个合理的函数组合可以做到:

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 的函数参数来表达每个字符串日期表示。一切都是明确的和声明性的,也就是说,您几乎可以阅读正在发生的事情。

【讨论】:

【参考方案15】:

希望这个功能有用

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;
        

    

【讨论】:

【参考方案16】:

纯 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) 错了。 Date 的 UTC 函数期望月份介于 0 和 11 之间(但允许其他 11)。 为什么要用一个连字符替换多个连字符? toISOString 可以返回多个连续的连字符吗? Michael -- 他正在用单个连字符替换找到的 每个 连字符。仍然不知道为什么(也许替换字符串只是分隔符的占位符)。 “g”表示所有出现。您正在考虑的模式是 /[-]+/g 你成就了我的一天。我一直在寻找一种简单的方法来绕过 javascript 中可怕的 TimeZone 处理,这可以解决问题!【参考方案17】:

Day.js怎么样?

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

https://github.com/iamkun/dayjs

【讨论】:

【参考方案18】:

您可以创建自己的功能如下

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

【讨论】:

【参考方案19】:

我不喜欢添加到原型中。另一种选择是:

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;

【讨论】:

如果您不需要 rightNow 变量,您可以将 new Date 包装起来并在一行中将其全部取回:(new Date()).toISOString().slice(0,10).replace(/-/g,"") 我想要YYYYMMDDHHmmSSsss,所以我这样做了:var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");。很简单,但应该封装。 这通常不起作用,因为 Date.toISOString() 创建了一个 UTC 格式的日期,因此可以根据时区跳转日期边界。例如。在 GMT+1 中:(new Date(2013,13, 25)).toISOString() == '2013-12-24T23:00:00.000Z' 如果 10000 年有人使用您的“怀旧”代码,这将失败。 应对时区的建议改进。 rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)【参考方案20】:

date-shortcode 来救援!

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

【讨论】:

【参考方案21】:

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

【讨论】:

在您的答案中添加一些描述会让您获得支持尝试在此代码中描述一下您在做什么,以便其他人可以更清楚地理解它。 在严格模式或打字稿中使用“let f,yyyymmdd=x=>...”代替。函数 yyyymmdd 和 f 是未定义的。【参考方案22】:

原生 Javascript:

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

【讨论】:

这不会用 0 填充月份以确保月份为 2 位数。 你是对的。后来我自己也注意到了这一点。您必须小心测试两位数月份和日期的日期格式。【参考方案23】:

为了简单性和可读性而回答另一个问题。 此外,不鼓励使用新方法编辑现有的预定义类成员:

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

【讨论】:

【参考方案24】:
<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/ 

【讨论】:

不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释【参考方案25】:

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

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

【讨论】:

【参考方案26】:

Moment.js 可能是你的朋友

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

【讨论】:

嗯,它确实为我的 app.js 添加了 40kb(缩小,非 gZip),但我去了,谢谢 :)。 迄今为止最好的答案! 我什至懒得等到我不可避免地需要时刻了,我只是在项目开始时添加它:) 你可以让它更简单:var formattedDate = moment().format('YYYYMMDD'); 我不知道为什么我一直在回避这个答案,但仍然回来确认这是完美的解决方案。 Moment.js 是必备库【参考方案27】:

如果使用 AngularJs(最高 1.5),您可以使用 date filter:

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

【讨论】:

那么,为了格式化一个变量,他需要将整个应用程序从任何东西重构为 AngularJS? @SangDang OP 在问题中提到了 Javascript。所有答案都给出了不同的 Javascript 可能性。基于 Javascript 的框架是一种可能的答案。【参考方案28】:

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

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

【讨论】:

【参考方案29】:

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

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

【讨论】:

您应该将[1] 替换为.length===2,因为不完全支持字符串上的索引器。 See this answer for reasons why. var mm = (this.getMonth() + 101).toStrung().substring(0, 2); 对于任何想要@Aidiakapi 修复的实际示例的人,我在这里创建了一个小提琴:jsfiddle.net/pcr8xbt5/1 如果你想要点分隔符:[this.getFullYear(), mm&lt;10 ? '0'+ mm: mm, dd&lt;10 ? '0'+ dd : dd].join('.') @9dan 不应该是var mm = (this.getMonth() + 101).toString().substring(1, 3)【参考方案30】:
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 这样的字符串

【讨论】:

这个解决方案太hack-ish了。不惜一切代价避免

以上是关于从 JS 日期对象获取 YYYYMMDD 格式的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

怎么将YYYYMMDD字符串格式转换为日期YYYY-MM-DD

JS最简便日期格式化YYYYMMDD的方法

js时间转换,能够把时间转换成yyyymmdd格式或yyyymm格式

如何将日期格式yyyymmdd

用js实现日期时间格式化?

以YYYYMMDD格式获取当前日期