将 JavaScript 日期格式化为 yyyy-mm-dd

IT技术 javascript date formatting date-format
2021-01-17 07:58:40

我有一个格式为 的日期Sun May 11,2014如何将其转换为2014-05-11使用 JavaScript?

function taskDate(dateMilli) {
    var d = (new Date(dateMilli) + '').split(' ');
    d[2] = d[2] + ',';

    return [d[0], d[1], d[2], d[3]].join(' ');
}

var datemilli = Date.parse('Sun May 11,2014');
console.log(taskDate(datemilli));

上面的代码给了我相同的日期格式,sun may 11,2014. 我怎样才能解决这个问题?

6个回答

只需利用将toISOString日期转换为 ISO 8601 格式的内置方法即可:

const yourDate = new Date()
yourDate.toISOString().split('T')[0]

其中 yourDate 是您的日期对象。

编辑@exbuddha写了这个来处理评论中的时区

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() - (offset*60*1000))
return yourDate.toISOString().split('T')[0]
试试这个: new Date(yourDateStr).toISOString().split('T')[0]
2021-03-15 07:58:40
注意:使用@mjwrazor 评论的有用解决方案,我不得不减去而不是添加偏移量以获得正确的日期(将 the 更改+ (offset为 a - (offset
2021-03-18 07:58:40
小心使用此方法,因为它首先将日期转换为 UTC。如果您在 + 时区并且您的时间部分在当天早些时候,那么它可能会回滚一天。或者,如果您在 - 时区并且您的时间部分在当天晚些时候,那么它可以向前滚动一天。
2021-04-06 07:58:40
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] 这应该可以解决时区问题
2021-04-06 07:58:40
now.toISOString().substring(0,10); 这是一个更简洁的替代方案,因为它提醒您这YYYY-MM-DD是完整 iso 格式的前十个字符
2021-04-06 07:58:40

你可以做:

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-');
}
 
console.log(formatDate('Sun May 11,2014'));

用法示例:

console.log(formatDate('Sun May 11,2014'));

输出:

2014-05-11

JSFiddle 上的演示:http : //jsfiddle.net/abdulrauf6182012/2Frm3/

@Fuser97381 同一语句中的多个变量声明不仅仅是一种审美风格偏好。这是一种危险的做法。如果您无意中失败,请在每个声明后添加一个逗号,您最终会创建全局变量。不应该鼓励什么可能成为问题的规范答案。
2021-03-11 07:58:40
这很有魅力,但我不明白为什么 javascript 没有针对此的本机解决方案......我的意思是,我们在 2020 年,日期是网络应用程序的一个重要方面。
2021-03-15 07:58:40
重新格式化日期字符串不应依赖于内置解析器对非标准字符串的成功解析。鉴于 OP 格式,它可以在不使用 Date 的情况下用更少的代码重新格式化。
2021-03-22 07:58:40
在同一个语句中真的有多个变量声明吗?stackoverflow.com/questions/694102/...
2021-03-24 07:58:40
'use strict'; @bhspencer
2021-03-24 07:58:40

我使用这种方式以 yyyy-mm-dd 格式获取日期:)

var todayDate = new Date().toISOString().slice(0, 10);
console.log(todayDate);

你如何处理@Luke_Baulch 在这里提到的一天的日期切换?
2021-03-10 07:58:40
并不总是有效。由于 UTC 转换,它有时会减去一天。
2021-03-29 07:58:40
你可以这样做: var todayDate = new Date(); todayDate.setMinutes(todayDate.getMinutes() - todayDate.getTimezoneOffset()); todayDate.toISOString().slice(0,10); 这应该有助于避免 UTC 问题。
2021-03-30 07:58:40
@FernandoAguilar 不过有一个疑问,我们怎么知道我们需要减去偏移量还是添加它?
2021-03-30 07:58:40
var todayDate = new Date(2018, 3 - 1, 26); todayDate.toISOString().slice(0, 10);给我"2018-03-25"在另一个系统上var todayDate = new Date(2018, 3 - 1, 26, 17, 0, 0); todayDate.toISOString().slice(0, 10);给我"2018-03-27".
2021-04-01 07:58:40

2020 答案

您可以使用本机.toLocaleDateString()函数,该函数支持多个有用的参数,例如语言环境(选择 MM/DD/YYYY 或 YYYY/MM/DD格式)、时区(转换日期)和格式详细信息选项(例如: 1 对 01 对 1 月)。

例子

const testCases = [
  new Date().toLocaleDateString(), // 8/19/2020
  new Date().toLocaleString(undefined, {year: 'numeric', month: '2-digit', day: '2-digit', weekday:"long", hour: '2-digit', hour12: false, minute:'2-digit', second:'2-digit'}),
  new Date().toLocaleDateString('en-US', {year: 'numeric', month: '2-digit', day: '2-digit'}), // 08/19/2020 (month and day with two digits)
  new Date().toLocaleDateString('en-ZA'), // 2020/08/19 (year/month/day) notice the different locale
  new Date().toLocaleDateString('en-CA'), // 2020-08-19 (year-month-day) notice the different locale
  new Date().toLocaleString("en-US", {timeZone: "America/New_York"}), // 8/19/2020, 9:29:51 AM. (date and time in a specific timezone)
  new Date().toLocaleString("en-US", {hour: '2-digit', hour12: false, timeZone: "America/New_York"}),  // 09 (just the hour)
]

for (const testData of testCases) {
  console.log(testData)
}

请注意,有时要以您想要的特定格式输出日期,您必须找到与该格式兼容的语言环境。您可以在此处找到语言环境示例:https : //www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tolocalestring_date_all

请注意,语言环境只是更改格式,如果您想将特定日期转换为特定国家或城市的等效时间,则需要使用时区参数。

@TimHobbs 您可以设置所需的时区,例如:("timeZone: "America/New_York") 并且日期将转换为该时区。
2021-03-21 07:58:40
你能格式化为yyyy/mm/ddintoLocaleDateString()吗?
2021-03-30 07:58:40
这仍然存在时区问题,因为它基于 UTC,因此您仍然必须跳过确定偏移量和更改日期的所有环节。
2021-03-31 07:58:40
对于我不需要时区的情况,new Date().toLocaleDateString('en-CA')是完美的
2021-04-04 07:58:40
应该是新的,被接受的答案
2021-04-06 07:58:40

将日期转换为 yyyy-mm-dd 格式的最简单方法是:

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

这个怎么运作:

  • new Date("Sun May 11,2014")根据当前区域设置(主机系统设置)将字符串转换为"Sun May 11,2014"表示Sun May 11 2014 00:00:00时区时间的日期对象
  • new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))Sun May 11 2014 00:00:00通过减去时区偏移量将您的日期转换为与UTC(标准时间)中的时间相对应的日期对象
  • .toISOString() 将日期对象转换为 ISO 8601 字符串 2014-05-11T00:00:00.000Z
  • .split("T") 将字符串拆分为数组 ["2014-05-11", "00:00:00.000Z"]
  • [0] 取该数组的第一个元素

演示

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

console.log(dateString);

没有其他人对这是最简单的方法感到震惊?
2021-03-11 07:58:40
很遗憾,但这是将 js 日期格式化为您需要的字符串的最简单方法。我是 js 新手,但在 java 中,将日期格式化为任何格式要容易 100 倍。这就是为什么认为有更简单的方法,但在我尝试了不同的解决方案后,我选择了这个。谢谢您的回答。
2021-03-11 07:58:40
@JoeDevmon:我不明白这有什么关系。- (date.getTimezoneOffset() * 60000 )位应消除任何时区差异,包括夏令时的影响。
2021-03-22 07:58:40
我已经在 SO 和其他网站上进行了高低搜索,以找到处理 JS 中日期时区问题的最佳方法,并且毫无疑问,这是迄今为止最简单和最好的方法。谢谢!
2021-03-26 07:58:40
@JohnSlegers 这就是我的想法,但在某些情况下,我仍然在前一天。我重构了,你的例子现在可以工作了。我一定有一个奇怪的日期字符串或其他东西。感谢您坚持并指出这一点。+1 👍
2021-03-28 07:58:40