如何以 YYYY-MM-DD 格式获取日期?

33

通常,如果我想获取日期,我可以执行以下操作:

var d = new Date(); console.log(d);

问题在于,当我运行该代码时,它会返回:

Mon Aug 24 2015 4:20:00 GMT-0800 (Pacific Standard Time)

我如何使Date()方法返回一个"MM-DD-YYYY"格式的值,以便返回以下结果:

8/24/2015

或者,也可以是 MM-DD-YYYY H:M

8/24/2016 4:20


3
我建议在你的 JavaScript 日期需求中使用 http://momentjs.com/,它会让所有事情变得更加容易。 - house9
2
可能是重复的问题:如何格式化JavaScript日期 - Felipe Oriani
7
在UTC时区,d.toISOString().split('T')[0]的意思是将日期对象d转换为ISO格式的字符串,并将其按照'T'字符拆分为两部分,然后返回第一部分(即只包含日期信息的部分)。 - Paul S.
d.toLocaleDateString()怎么样?这将给你与你第一个示例完全相同的结果。 - cezar
1
我简直不敢相信一个如此简单的请求居然无法通过Javascript原生函数解决。 - Zhang Buzz
15个回答

0
如果您想要一个适合排序的文本格式,请使用以下格式:
function formatDateYYYYMMDDHHMMSS(date){
  // YYYY-MM-DD HH:MM:SS
  const datePart = date.toISOString().split("T")[0]
  const timePart = date.toLocaleString('en-US', {hour12: false}).split(",")[1]
  return datePart + timePart
}

作为原型:

Date.prototype.toSortString = function(){
  const date = new Date(this.valueOf());
  return date.toISOString().split("T")[0] + 
         date.toLocaleString('en-US', {hour12: false}).split(",")[1]
}

除非您的时区是GMT,否则这不会始终正常工作,因为 toISOString 会从本地时间转换为UTC时间。 - Auspex

0
如果您想获取“本地ISO”日期字符串,请尝试以下代码。
function (date) {
    return new Date(+date - date.getTimezoneOffset() * 60 * 1000).toISOString().split(/[TZ]/).slice(0, 2).join(' ');
}

+date 从日期中获取毫秒。

参考:Date.prototype.getTimezoneOffset 玩得开心 :)


这只是在DST边界(以及其他一些更奇怪的时区/语言环境)上寻求问题。 - Ry-

0
这是一个简单的函数,我曾经在一个项目中不断需要以这种格式获取今天、昨天和明天的日期时创建了它。
function returnYYYYMMDD(numFromToday = 0){
  let d = new Date();
  d.setDate(d.getDate() + numFromToday);
  const month = d.getMonth() < 9 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
  const day = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
  return `${d.getFullYear()}-${month}-${day}`;
}

console.log(returnYYYYMMDD(-1)); // returns yesterday
console.log(returnYYYYMMDD()); // returns today
console.log(returnYYYYMMDD(1)); // returns tomorrow

可以轻松地修改以传递日期,但在这里您传递一个数字,它将从今天开始返回那么多天。


还有一个问题是缺少前导零,因为有人可能使用不到4位数的年份。 - ErroneousFatality
1
@ErroneousFatality 说得好,但正如我在回答中所述,这只是一个示例,说明我如何获取今天/明天/昨天等的日期。所以除非 OP 是个时间旅行者... - Lou Bagel

0
我喜欢这样获取到精确到秒的时间戳,当按字母数字顺序排序时,时间顺序是正确的。
(new Date().toLocaleString("en-CA", 
    { timeZone: 'America/Los_Angeles', hourCycle: 'h24', 
      year: 'numeric', month: '2-digit', day: '2-digit', 
      hour: '2-digit', minute: '2-digit', second: '2-digit'})).replace(/\D+/g, '-')

// Output: '2023-10-03-09-16-12'

每个字段的长度始终相同。您可以随意更改时区(我在我的JS客户端中使用它进行日志记录,以使时间戳与西雅图服务器日志中的时间戳匹配)。如果您愿意,您可以去掉一些精度,甚至可以通过将其添加到选项列表中将其减少到毫秒级别:
fractionalSecondDigits: '3'
看起来这应该更容易,但现在您有了这个一行代码,它就变得简单了....

-2

const padTo2Digits = num => {
  return num.toString().padStart(2, '0')
}

const formatDate = date => {
  return [
    date.getFullYear(),
    padTo2Digits(date.getMonth() + 1),
    padTo2Digits(date.getDate())
  ].join('-')
}

let value = formatDate(new Date())

document.getElementById('dayFormatUS').innerHTML = value

const transformDate = date => {
  const convert = date.split('-').reverse()
  return convert.join('/')
}

document.getElementById('dayFormatBR').innerHTML = transformDate(value)
<div>
  Format US - 
  <span id='dayFormatUS'></span>
</div>

<div>
  Format BR - 
  <span id='dayFormatBR'></span>
</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接