将JavaScript日期格式设置为yyyy-mm-dd


382

我有一个日期格式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。我怎样才能解决这个问题?


7
我怀疑上面的代码除了语法错误还给您带来了其他好处。
plalx 2014年

确实考虑使用像Moment.js这样的库。它将以所需的结果格式:)
Ankur

5
为什么在5行代码就能完成工作的情况下使用库?@Ankur
黑曼巴


相关:什么是JavaScript中有效的日期时间字符串?请注意,“ Sun May 11,2014”不是有效的日期字符串,因此在某些浏览器中解析它可能会失败。
str

Answers:


524

你可以做:

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

用法示例:

alert(formatDate('Sun May 11,2014'));

输出:

2014-05-11

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


11
同一条语句中确实有多个变量声明?stackoverflow.com/questions/694102/...
bhspencer

8
@ Fuser97381同一条语句中的多个变量声明不仅仅是美观样式的首选项。这是一种危险的做法。如果您无意中失败,则在每个声明后添加一个逗号,最终将创建全局变量。在可能成为问题的规范答案的地方,不应鼓励采取任何措施。
bhspencer 2015年

6
'use strict';@bhspencer
Vix

3
重新格式化日期字符串不应该依赖于内置解析器对非标准字符串的成功解析。给定OP格式,可以用更少的代码重新格式化,而根本不用日期。
RobG

如何在1〜31范围内增加30天?
史蒂夫·安吉洛

455

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

yourDate.toISOString().split('T')[0]

其中yourDate是您的日期对象。

编辑:有人在评论中写了这个来处理时区:

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() + (offset*60*1000))
return yourDate.toISOString().split('T')[0]

238
请谨慎使用此方法,因为它首先将日期转换为UTC。如果您处于+时区,并且您的时间部分是一天中的早些,那么它可能会回滚一天。另外,如果您处于-时区,并且您的时间部分是一天中的晚,那么它可能会向前一天。
卢克·鲍尔奇

4
尝试以下方法:new Date(yourDateStr).toISOString().split('T')[0]
exbuddha

24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] 这应该可以解决时区问题
mjwrazor

5
now.toISOString().substring(0,10); 这是一种更清洁的选择,因为它会提醒您这YYYY-MM-DD是完整iso格式的前十个字符
Gutimore,

4
注意:使用@mjwrazor评论的有用的解决方案,我不得不减去而不是添加偏移量来获取正确的日期(将更+ (offset改为- (offset
rococo

135

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

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

14
您如何处理@Luke_Baulch在此处提到的一天中的日期切换?
Malvineous

7
您可以执行以下操作:var todayDate = new Date(); todayDate.setMinutes(todayDate.getMinutes()-todayDate.getTimezoneOffset()); todayDate.toISOString()。slice(0,10); 这应该有助于避免UTC问题。
费尔南多·阿吉拉尔

1
@FernandoAguilar但是,有一个疑问,我们如何知道我们需要减去偏移量还是将其相加?
whyAto8

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"
Salman A

2
并不总是有效。由于UTC转换,有时会减去一天。
NickG,

110

将日期转换为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);


20
没有人吓到这是最简单的方法吗?
差距,

.toISOString()不能与夏令时一起正常使用。
乔的想法

2
@JoeDevmon:我在这里看不到有什么关系。该- (date.getTimezoneOffset() * 60000 )位应消除任何时区差异,包括夏时制的影响。
John Slegers

2
@JohnSlegers这就是我的想法,但是在某些情况下,我还是要过一天。我重构了,您的示例现在可以使用了。我一定有一个奇怪的日期字符串之类的东西。感谢您坚持并指出这一点。+1👍
乔的想法

2
我在SO和其他站点的高空搜寻,找到了处理JS中的日期与时区问题的最佳方法,而这无疑是最简单,最好的方法。谢谢!
哈特利圣玛尔

34
format = function date2str(x, y) {
    var z = {
        M: x.getMonth() + 1,
        d: x.getDate(),
        h: x.getHours(),
        m: x.getMinutes(),
        s: x.getSeconds()
    };
    y = y.replace(/(M+|d+|h+|m+|s+)/g, function(v) {
        return ((v.length > 1 ? "0" : "") + eval('z.' + v.slice(-1))).slice(-2)
    });

    return y.replace(/(y+)/g, function(v) {
        return x.getFullYear().toString().slice(-v.length)
    });
}

结果:

format(new Date('Sun May 11,2014'), 'yyyy-MM-dd')
"2014-05-11

1
我喜欢此解决方案赋予该问题其他答案的灵活性。我尚未对此进行全面测试,但是对于我想要的格式(即“ yyyy-MM-dd hh:mm:ss”),它可以按预期工作。
porcus

3
您可以轻松地避免eval
Salman A

3
这是一个避免评估的版本,可以更好地注释jsfiddle.net/8904cmLd/2
m1m1k 18-4-5

2
我从这个回应中受益。我确实用eval语句替换了该行return ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
JesusIsMyDriver.dll 18-10-10

26

一些答案的组合:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');

我最喜欢该解决方案-易于阅读,并且不依赖于toISOString()使用该功能的潜在时区陷阱。
matt.fc

这是第一个不伤脑筋的人。
ckapilla

22

如果您不反对使用任何库,则可以使用Moments.js库,如下所示:

var now = new Date();
var dateString = moment(now).format('YYYY-MM-DD');

var dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


很酷的解决方案,但是它是一个300kb的文件包
Adam

13

只需使用以下命令:

var date = new Date('1970-01-01'); // Or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());

简单而甜美;)


4
2字母格式没有填充。如果日期或月份小于10,它将显示一位数字,这就是为什么不能直接使用它的原因。
Yatender Singh

是的,但是可以简单地使用javascript来实现,我认为是完全符合您的要求的,不是吗?@YatenderSingh
Pardeep Jain

4
是的,但请检查他想要的问题“ yyyy-mm-dd”格式的标题:)
Yatender Singh

var old_date = new Date(date); var new_date = old_date.getFullYear()+'-'+(old_date.getMonth()+ 1)+'-'+ old_date.getDate()
Sitti Munirah Abdul Razak

1
大。它有效并且简单明了!
Waleed93

12

toISOString()假设您的日期为当地时间,并将其转换为UTC。您将得到一个不正确的日期字符串。

以下方法应返回您需要的内容。

Date.prototype.yyyymmdd = function() {         

    var yyyy = this.getFullYear().toString();                                    
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
    var dd  = this.getDate().toString();             

    return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

资料来源:https : //blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/


8

检索年,月和日,然后将它们放在一起。直观,简单,准确。

function formatDate(date) {
    var year = date.getFullYear().toString();
    var month = (date.getMonth() + 101).toString().substring(1);
    var day = (date.getDate() + 100).toString().substring(1);
    return year + "-" + month + "-" + day;
}

//Usage example:
alert(formatDate(new Date()));


8

您可以toLocaleDateString('fr-CA')Date对象上使用

console.log(new Date('Sun May 11,2014').toLocaleDateString('fr-CA'));

我还发现这些语言环境从该语言环境列表中列出所有语言环境及其短代码的结果正确?

'en-CA'
'fr-CA'
'lt-LT'
'sv-FI'
'sv-SE'


知道为什么这行得通吗?ISO格式只是默认格式,还是这些语言环境真正使用该格式?如果是前者,我会担心它将来可能会发生意外变化。
jymbob

这在浏览器之外无法与NodeJS一起使用。
多纳托

@jymbob我认为这些语言环境确实使用了这些格式。通过查看以下Wi​​kipedia页面,我得到了相同的答案:en.wikipedia.org/wiki/Date_format_by_country
CiprianTomoiagă

5

同样要考虑时区,这种单行代码在没有任何库的情况下应该很好:

new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]

5

您可以尝试以下方法:https : //www.npmjs.com/package/timesolver

npm i timesolver

在您的代码中使用它:

const timeSolver = require('timeSolver');
const date = new Date();
const dateString = timeSolver.getString(date, "YYYY-MM-DD");

您可以使用以下方法获取日期字符串:

getString

4

这些答案都没有一个令我满意。我想要一个跨平台的解决方案,该解决方案可以让我在本地时区工作,而无需使用任何外部库。

这是我想出的:

function localDay(time) {
  var minutesOffset = time.getTimezoneOffset()
  var millisecondsOffset = minutesOffset*60*1000
  var local = new Date(time - millisecondsOffset)
  return local.toISOString().substr(0, 10)
}

这应该以日期参考的时区以YYYY-MM-DD格式返回日期的日期。

因此,例如,即使已经是UTC的第24位,它localDay(new Date("2017-08-24T03:29:22.099Z"))也会返回"2017-08-23"

你需要填充工具 Date.prototype.toISOString为它工作在Internet Explorer 8,但应在其他地方支持。


也许值得注意的是,如果您远远落后于UTC(例如在美国),它只会给您2017-08-23。
西蒙D


3
new Date().toLocaleDateString('pt-br').split( '/' ).reverse( ).join( '-' );

要么

new Date().toISOString().split('T')[0]
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString()
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString().split('T')[0]

尝试这个!


第二个选项可能显示错误的日期,因为它将以UTC时区显示数据。
Ever Dev

2

这是一种实现方法:

var date = Date.parse('Sun May 11,2014');

function format(date) {
  date = new Date(date);

  var day = ('0' + date.getDate()).slice(-2);
  var month = ('0' + (date.getMonth() + 1)).slice(-2);
  var year = date.getFullYear();

  return year + '-' + month + '-' + day;
}

console.log(format(date));

2

Date.js对此非常有用。

require("datejs")
(new Date()).toString("yyyy-MM-dd")

1

function myYmd(D){
    var pad = function(num) {
        var s = '0' + num;
        return s.substr(s.length - 2);
    }
    var Result = D.getFullYear() + '-' + pad((D.getMonth() + 1)) + '-' + pad(D.getDate());
    return Result;
}

var datemilli = new Date('Sun May 11,2014');
document.write(myYmd(datemilli));


1

var d = new Date("Sun May 1,2014");

var year  = d.getFullYear();
var month = d.getMonth() + 1;
var day   = d.getDate(); 

month = checkZero(month);             
day   = checkZero(day);

var date = "";

date += year;
date += "-";
date += month;
date += "-";
date += day;

document.querySelector("#display").innerHTML = date;
    
function checkZero(i) 
{
    if (i < 10) 
    {
        i = "0" + i
    };  // add zero in front of numbers < 10

    return i;
}
<div id="display"></div>


1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)

1

前面的几个答案还可以,但是它们不是很灵活。我想要一种可以真正处理更多边缘情况的东西,所以我接受了@orangleliu的答案并进行了扩展。https://jsfiddle.net/8904cmLd/1/

function DateToString(inDate, formatString) {
    // Written by m1m1k 2018-04-05

    // Validate that we're working with a date
    if(!isValidDate(inDate))
    {
        inDate = new Date(inDate);
    }

    // See the jsFiddle for extra code to be able to use DateToString('Sun May 11,2014', 'USA');
    //formatString = CountryCodeToDateFormat(formatString);

    var dateObject = {
        M: inDate.getMonth() + 1,
        d: inDate.getDate(),
        D: inDate.getDate(),
        h: inDate.getHours(),
        m: inDate.getMinutes(),
        s: inDate.getSeconds(),
        y: inDate.getFullYear(),
        Y: inDate.getFullYear()
    };

    // Build Regex Dynamically based on the list above.
    // It should end up with something like this: "/([Yy]+|M+|[Dd]+|h+|m+|s+)/g"
    var dateMatchRegex = joinObj(dateObject, "+|") + "+";
    var regEx = new RegExp(dateMatchRegex,"g");
    formatString = formatString.replace(regEx, function(formatToken) {
        var datePartValue = dateObject[formatToken.slice(-1)];
        var tokenLength = formatToken.length;

        // A conflict exists between specifying 'd' for no zero pad -> expand
        // to '10' and specifying yy for just two year digits '01' instead
        // of '2001'.  One expands, the other contracts.
        //
        // So Constrict Years but Expand All Else
        if (formatToken.indexOf('y') < 0 && formatToken.indexOf('Y') < 0)
        {
            // Expand single digit format token 'd' to
            // multi digit value '10' when needed
            var tokenLength = Math.max(formatToken.length, datePartValue.toString().length);
        }
        var zeroPad = (datePartValue.toString().length < formatToken.length ? "0".repeat(tokenLength) : "");
        return (zeroPad + datePartValue).slice(-tokenLength);
    });

    return formatString;
}

用法示例:

DateToString('Sun May 11,2014', 'MM/DD/yy');
DateToString('Sun May 11,2014', 'yyyy.MM.dd');
DateToString(new Date('Sun Dec 11,2014'),'yy-M-d');

干净整洁的评论解决方案。但是,我对第一个论点持怀疑态度,如果未将其视为有效日期,它将被一个新的新日期默默替换。我宁愿将此“可选默认值”作为第二个参数,并返回某种异常(可以是返回的简单“无效日期格式”字符串),以防格式无法识别,从而使错误清楚地显示为测试人员/用户
-Balmipour

1

这对我来说可以用所需的格式(YYYYMMDD HH:MM:SS)获取当前日期:

var d = new Date();

var date1 = d.getFullYear() + '' +
            ((d.getMonth()+1) < 10 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1)) +
            '' +
            (d.getDate() < 10 ? "0" + d.getDate() : d.getDate());

var time1 = (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) +
            ':' +
            (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) +
            ':' +
            (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());

print(date1+' '+time1);

1

无需图书馆

只是纯JavaScript。

下面的示例从今天开始获取最近的两个月:

var d = new Date()
d.setMonth(d.getMonth() - 2);
var dateString = new Date(d);
console.log('Before Format', dateString, 'After format', dateString.toISOString().slice(0,10))


危险的。在这种情况下,您将忽略时区偏移。
maxence51 '19

1

PHP兼容日期格式

这是一个小函数,可以采用与PHP函数相同的参数,date()并在JavaScript中返回日期/时间字符串。

请注意,并非支持PHP中的所有date()格式选项。您可以扩展parts对象以创建缺少的格式令牌

/**
 * Date formatter with PHP "date()"-compatible format syntax.
 */
const formatDate = (format, date) => {
  if (!format) { format = 'Y-m-d' }
  if (!date) { date = new Date() }

  const parts = {
    Y: date.getFullYear().toString(),
    y: ('00' + (date.getYear() - 100)).toString().slice(-2),
    m: ('0' + (date.getMonth() + 1)).toString().slice(-2),
    n: (date.getMonth() + 1).toString(),
    d: ('0' + date.getDate()).toString().slice(-2),
    j: date.getDate().toString(),
    H: ('0' + date.getHours()).toString().slice(-2),
    G: date.getHours().toString(),
    i: ('0' + date.getMinutes()).toString().slice(-2),
    s: ('0' + date.getSeconds()).toString().slice(-2)
  }

  const modifiers = Object.keys(parts).join('')
  const reDate = new RegExp('(?<!\\\\)[' + modifiers + ']', 'g')
  const reEscape = new RegExp('\\\\([' + modifiers + '])', 'g')

  return format
    .replace(reDate, $0 => parts[$0])
    .replace(reEscape, ($0, $1) => $1)
}

// ----- EXAMPLES -----
console.log( formatDate() ); // "2019-05-21"
console.log( formatDate('H:i:s') ); // "16:21:32"
console.log( formatDate('Y-m-d, o\\n H:i:s') ); // "2019-05-21, on 16:21:32"
console.log( formatDate('Y-m-d', new Date(2000000000000)) ); // "2033-05-18"

要旨

这是具有该formatDate()功能更新版本和其他示例的要点:https : //gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9


0

答案的另一个组合。可读性很好,但有点冗长。

function getCurrentDayTimestamp() {
  const d = new Date();

  return new Date(
    Date.UTC(
      d.getFullYear(),
      d.getMonth(),
      d.getDate(),
      d.getHours(),
      d.getMinutes(),
      d.getSeconds()
    )
  // `toIsoString` returns something like "2017-08-22T08:32:32.847Z"
  // and we want the first part ("2017-08-22")
  ).toISOString().slice(0, 10);
}

0

如果日期在所有时区都需要相同,例如代表数据库中的某个值,那么请确保在JavaScript日期对象上使用UTC版本的日,月,全年功能,因为它将以UTC时间和避免在某些时区出现一对一的错误。

更好的是,使用Moment.js日期库进行这种格式化。


0

我修改了Samit Satpute的回复,如下所示:

var newstartDate = new Date();
// newstartDate.setDate(newstartDate.getDate() - 1);
var startDate = newstartDate.toISOString().replace(/[-T:\.Z]/g, ""); //.slice(0, 10); // To get the Yesterday's Date in YYYY MM DD Format
console.log(startDate);


0

格式化并从哈希图数据中找到最大和最小日期:

var obj = {"a":'2001-15-01', "b": '2001-12-02' , "c": '2001-1-03'};

function findMaxMinDate(obj){
  let formatEncode = (id)=> { let s = id.split('-'); return `${s[0]+'-'+s[2]+'-'+s[1]}`}
  let formatDecode = (id)=> { let s = id.split('/'); return `${s[2]+'-'+s[0]+'-'+s[1]}`}
  let arr = Object.keys( obj ).map(( key )=> { return new Date(formatEncode(obj[key])); });
  let min = new Date(Math.min.apply(null, arr)).toLocaleDateString();
  let max = new Date(Math.max.apply(null, arr)).toLocaleDateString();
  return {maxd: `${formatDecode(max)}`, mind:`${formatDecode(min)}`}
}

console.log(findMaxMinDate(obj));


这与问题(格式化日期)有什么关系?
彼得·莫滕森

0

重新格式化日期字符串非常简单,例如

var s = 'Sun May 11,2014';

function reformatDate(s) {
  function z(n){return ('0' + n).slice(-2)}
  var months = [,'jan','feb','mar','apr','may','jun',
                 'jul','aug','sep','oct','nov','dec'];
  var b = s.split(/\W+/);
  return b[3] + '-' +
    z(months.indexOf(b[1].substr(0,3).toLowerCase())) + '-' +
    z(b[2]);
}

console.log(reformatDate(s));

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.