在 JavaScript 中将字符串解析为日期

Posted

技术标签:

【中文标题】在 JavaScript 中将字符串解析为日期【英文标题】:Parsing a string to a date in JavaScript 【发布时间】:2011-08-02 21:58:58 【问题描述】:

如何在 javascript 中将字符串转换为 Date 对象?

var st = "date in some format"
var dt = new Date();

var dt_st = // st in Date format, same as dt.

【问题讨论】:

convert Java datestring to javascript date 和 a lot more 的可能重复项 哦,我现在很困惑。你想要Date -> String 还是String -> Date 考虑momentjs.com 简单解决方案:使用 ISOString 格式 var st = "05/05/2020" var dateTime1 = new Date(st).toISOString().replace(/T.+/, ' 00:00: 00') console.log(dateTime1) 如果var st = "Monday, August 10th 2020" 会怎样?任何和这个? 【参考方案1】:

字符串解析的最佳字符串格式是日期 ISO 格式以及 JavaScript Date 对象构造函数。

ISO 格式示例:YYYY-MM-DDYYYY-MM-DDTHH:MM:SS

等一下! 仅使用“ISO 格式”本身并不能可靠地工作。字符串有时被解析为 UTC,有时被解析为本地时间(基于浏览器供应商和版本)。最佳做法应始终将日期存储为 UTC,并以 UTC 进行计算。

要将日期解析为 UTC,请附加 Z - 例如:new Date('2011-04-11T10:20:30Z')

要以 UTC 显示日期,请使用 .toUTCString(), 要以用户的本地时间显示日期,请使用.toString()

有关MDN | Date 和this answer 的更多信息。

对于旧的 Internet Explorer 兼容性(IE 版本小于 9 不支持日期构造函数中的 ISO 格式),您应该将日期时间字符串表示拆分为其部分,然后您可以使用使用日期时间部分的构造函数,例如:new Date('2011', '04' - 1, '11', '11', '51', '00')。注意月份数必须少1。


替代方法 - 使用适当的库:

您还可以利用库Moment.js,它允许使用指定时区解析日期。

【讨论】:

对于 Paul Tomblin 提出的同一个“Nan”问题,我还必须对 safari 使用“拆分字符串”方法。 new Date('2011-04-11 11:51:00') 将返回“无效日期”。 @Amos:注意字母 T,它分隔日期和时间。如果您写new Date('2011-04-11T11:51:00'),则创建日期有效。 不幸的是,我遇到了 *它不适用于所有用户的问题。 让 Date 解析字符串是创建 Date 对象的最糟糕方法。手动解析字符串并将 Date 作为构造函数调用要好得多。有些浏览器会将没有时区的 ISO 字符串视为 UTC,而其他浏览器会将其视为本地。 @Ben Taliadoros:是的,在所有常见的浏览器中都是无效的,new Date('1970-30-02') 是无效的日期,因为一年没有 30 个月。您不能溢出月份,但是当您溢出天数时,它会在 ChromeFirefox 中解析为有效日期:new Date('1970-02-30') 与 new Date(' 1970-03-02')。【参考方案2】:

不幸的是,我发现了

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

返回“2014 年 4 月 2 日星期三”。我知道这听起来很疯狂,但它发生在某些用户身上。

防弹解决方案如下:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());

【讨论】:

一点也不疯狂,调整很可能是DST 加入。yyyy-MM-dd 格式的日期被解析为 UTC,toString 返回 local time 因此,根据用户的时区,它肯定会返回不同的结果。如果总是希望时间为 UTC,那么您应该使用 toUTCString。 一直在敲我的头。这似乎可行,但我不明白你为什么使用parts[0]-1 而不仅仅是parts[0]。 @AdamYoungers 由于 Javascript 从 0 开始计算月份:1 月 - 0 日、2 月 - 1 日等 这个答案表明示例中的行为不正确。根据规范:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…(参见:datestring)示例中的输出值是正确的 解压参数var [YYYY, MM, DD] = '2014-04-03'.split('-')的绝妙方法【参考方案3】:
var st = "26.04.2013";
var pattern = /(\d2)\.(\d2)\.(\d4)/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

输出将是:

dt => Date Fri Apr 26 2013

【讨论】:

很遗憾,此解决方案存在问题。详情在这里:***.com/questions/17959660/… 输出未知,因为您的代码既不将任何内容转换为字符串,也不输出任何内容。 这实际上将返回 Fri Apr 25【参考方案4】:
function stringToDate(_date,_format,_delimiter)

            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;


stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

【讨论】:

处理各种变体的日期,而不仅仅是美国格式 @MarkJones 不要相信.indexOf() 方法,因为它在没有 polyfils 的情况下不跨浏览器兼容。相反,使用更兼容的.match().test() vanilla JS 方法。 在函数开头加上var _delimiter = _format.match(/\W/g)[0];可以自动得到第3个参数的分隔符和prescind。 此日期格式错误。这是因为mm 是几分钟而不是几个月......在你的格式中使用 MM【参考方案5】:

建议:我推荐使用包含很多格式的日期包,因为时区和格式时间管理确实是个大问题,moment js 解决了很多格式。您可以轻松地将日期从简单的字符串解析为日期,但我认为支持所有格式和日期变体是一项艰巨的工作。

更新:由于 moment 已被弃用,一个不错的替代 moment 是 datefns https://date-fns.org/

moment.js (http://momentjs.com/) 是一个完整的好用日期包,支持ISO 8601 strings。

您可以添加一个字符串日期和格式。

moment("12-25-1995", "MM-DD-YYYY");

您可以检查日期是否有效。

moment("not a real date").isValid(); //Returns false

一些display examples

let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL')) 
// output: "3 months ago | February 1, 2019"

查看文档 http://momentjs.com/docs/#/parsing/string-format/

【讨论】:

一些 display examples let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL')) 输出:“3 个月前 | 2019 年 2 月 1 日”【参考方案6】:

将它作为参数传递给 Date():

var st = "date in some format"
var dt = new Date(st);

您可以使用例如dt.getMonth() 访问日期、月份、年份。

【讨论】:

我做console.log(new Date('30-08-2018')) 并得到无效的日期 这个答案忽略了这个问题的多重复杂性,例如,如果我在我的计算机上(在英国)上为日期 01/02/2020 执行此操作,它将返回 1st Feburary ,就好像同一件事一样在美国完成,它将在 1 月 2 日返回。您几乎不应该使用这种幼稚的实现。请改用moment。【参考方案7】:

如果您可以使用极好的 moment 库(例如在 Node.js 项目中),您可以使用例如轻松解析您的日期

var momentDate = moment("2014-09-15 09:00:00");

并且可以通过

访问JS日期对象
momentDate ().toDate();

【讨论】:

请注意,没有节点的时刻也可以正常工作 使用此代码时,我的 androidios 设备出现 NaN 错误,但它在桌面上运行。这是我之前使用的代码: var dateTimeOfTimeIn = new Date(year + "-" + month + "-" + day + "T" + data.timeIn);使用这种方法和矩库,我的问题得到了解决,我的代码现在在我的所有设备上都可以正常工作!【参考方案8】:

对于那些正在寻找小巧而智能的解决方案的人:

String.prototype.toDate = function(format)

  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
;

例子:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");

【讨论】:

弄乱 String.prototype 不是一个好主意,它会导致很难找到错误 确实搞砸了 String.prototype 不是一个好主意,但是这对我有很大帮助。我把它做成一个函数去保存。【参考方案9】:

只要new Date(st);

假设是proper format。

【讨论】:

不,这是一个糟糕的主意,除非您确定输入总是采用 Date 可以正确解析的格式。它将在世界各地爆发。 @JulianKnight - 我字面上说“假设它的格式正确”。不,它不会在世界各地发生故障,哈哈 那你并没有真正回答这个问题。请将您的答案与接受的答案进行比较。在许多情况下,您的答案都会中断。 new Date("3/2/20") 怎么样?这对你有什么好处?你认为它会为我产生相同的答案吗?除非我们在同一个国家,否则几乎可以肯定不是。正如我所说,这是一个可怕的想法。讽刺是不对的。 @JulianKnight -- 格式正确。您的示例与new Date('a tomato') 一样有效。 ISO 8601 是一种正确的格式。 3/2/20 不是。 对不起,这是一个非常无益的回复。当然,ISO 格式在许多情况下是最好的方法,但它并不总是可行的。如果这是关于来自网站的输入怎么办?你会让世界上的每个人都使用 ISO 日期格式吗? “正确”格式取决于上下文而不是技术人员对世界的看法。【参考方案10】:

new Date(2000, 10, 1) 会给你“Wed Nov 01 2000 00:00:00 GMT+0100 (CET)”

看到月份的 0 代表一月

【讨论】:

【参考方案11】:

如果您想从“dd/MM/yyyy”格式转换。这是一个例子:

var pattern = /^(\d1,2)\/(\d1,2)\/(\d4)$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

此解决方案适用于低于 9 的 IE 版本。

【讨论】:

【参考方案12】:

时间戳应该转换为数字

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date

【讨论】:

undefined 值呢?喜欢:var date = new Date(undefined)? @BennyNeugebauer 在尝试将值传递给 Date 构造函数之前检查是否未定义。也许你想抛出一个异常,或者你想回退到一个默认日期,谁知道呢?【参考方案13】:

Date.parse 几乎可以满足您的需求。它在am/pm 部分阻塞,但通过一些黑客攻击,您可以让它工作:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) 
    timestamp += 12 * 60 * 60 * 1000;

【讨论】:

如果您需要支持多个(尤其是较旧的)浏览器,这不是一个好主意。请参阅 MDN 条目。 ***.com/questions/2587345/…【参考方案14】:

性能

今天 (2020.05.08) 我对选择的解决方案进行测试 - 有两种情况:输入日期是 ISO8601 字符串 (Ad,Bd,Cd,Dd,Ed),输入日期是 timestamp (At, Ct, Dt) .解决方案 Bd,Cd,Ct 不返回 js Date 对象作为结果,但我添加它们是因为它们很有用,但我没有将它们与有效的解决方案进行比较。此结果可用于大量日期解析。

结论

对于 ISO 日期和时间戳,解决方案 new Date(广告)比 moment.js (Dd) 快 50-100 倍 解决方案 new Date (Ad) 比 parseDate (Ed) 快约 10 倍 如果我们需要在所有浏览器上从 ISO 日期获取时间戳,解决方案 Date.parse(Bd) 最快

详情

我在 Chrome 81.0、Safari 13.1、Firefox 75.0 上对 MacOs High Sierra 10.13.6 进行了测试。解决方案parseDate (Ed) 使用new Date(0) 并手动设置UTC 日期组件。

let ds = '2020-05-14T00:00Z'; // Valid ISO8601 UTC date
let ts = +'1589328000000';    // timestamp

let Ad = new Date(ds);
let Bd = Date.parse(ds);
let Cd = moment(ds);
let Dd = moment(ds).toDate();
let Ed = parseDate(ds);

let At = new Date(ts);
let Ct = moment(ts);
let Dt = moment(ts).toDate();

log = (n,d) => console.log(`$n: $+d $d`);

console.log('from date string:', ds)
log('Ad', Ad);
log('Bd', Bd);
log('Cd', Cd);
log('Dd', Dd);
log('Ed', Ed);
console.log('from timestamp:', ts)
log('At', At);
log('Ct', Ct);
log('Dt', Dt);



function parseDate(dateStr) 
  let [year,month,day] = dateStr.split(' ')[0].split('-');
  let d=new Date(0);
  d.setUTCFullYear(year);
  d.setUTCMonth(month-1);
  d.setUTCDate(day)
  return d;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment-with-locales.min.js"></script>

This snippet only presents used soultions  

chrome 的结果

【讨论】:

【参考方案15】:

转换为pt-BR格式:

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) 

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

     else 
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    

希望对大家有所帮助!!!

【讨论】:

【参考方案16】:

我为此创建了一个小提琴,您可以在任何日期字符串上使用 toDate() 函数并提供日期格式。这将返回一个 Date 对象。 https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")

【讨论】:

搞乱String.prototype很可能会以泪水收场。 这是指向解决方案的链接,而不是解决方案。要查看此解决方案的代码,无需访问其他站点,see this answer。【参考方案17】:

对于在 js 中将字符串转换为日期,我使用 http://momentjs.com/

moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours

【讨论】:

moment() 默认采用当前日期。如何使用矩格式化“2016-06-27 17:49:51.951602+05:30”格式的字符串。【参考方案18】:

这是我认为最好、最简单的解决方案:

只需将您的日期字符串(使用ISO format)与最后的“T00:00:00”连接并使用JavaScript Date() constructor,如下例所示。

const dateString = '2014-04-03'
var mydate = new Date(dateString + "T00:00:00");
console.log(mydate.toDateString());

以及关于上述解决方案的一些细节(但可选阅读):

在 ISO 格式中,如果您提供时间并且 Z 未出现在末尾 字符串,the date will be local time zone instead of UTC time zone。这意味着,当setting 以这种方式约会时,没有 指定时区,JavaScript 将使用本地浏览器的时间 区。而当getting一个日期,不指定时区 同样,结果也会转换为浏览器的时区。和, by default,JavaScript 中几乎所有的日期方法(除了一个) 也为您提供本地时区的日期/时间(如果 您指定 UTC)。所以,在本地/浏览器时区使用你可能 不会得到不需要的结果,因为您之间的差异 本地/浏览时区和 UTC 时区,这是主要的时区之一 日期字符串转换的投诉。但是如果你会使用这个 解决方案,了解您的上下文并了解您在做什么。 还要注意日期时间字符串中的omitting T or Z 可以在不同的浏览器中给出不同的结果。

需要注意的是,上面的例子会给你与下面这个例子完全相同的回报,这是这个问题中投票第二多的答案:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());

主要区别在于这里提供的第一个示例比第二个示例更简单,甚至更容易出错(至少在我看来,如下所述)。

因为如果您调用JavaScript Date() constructor 日期时只有一个 ISO 格式的日期字符串参数(第一个示例),它不接受超出其逻辑限制的值(因此,如果您将 13 作为月或 32 作为日,你会得到无效的日期)。

但是当你使用带有多个日期参数的同一个构造函数时(第二个例子),超过逻辑限制的参数将被调整为相邻的值and you won't get Invalid Date Error(所以,如果你给 13 作为月份,它将调整为 1 ,而不是给你一个无效的日期)。

或者另一种(和第三种)解决方案将两者混合使用,使用第一个示例来验证日期字符串,如果它有效,请使用第二个示例(这样可以避免浏览器可能与第一个示例和同时避免超过第二个例子的逻辑限制的参数的权限。

像这样(也接受部分日期):

function covertStringToDate(dateString) 
    //dateString should be in ISO format: "yyyy-mm-dd", "yyyy-mm" or "yyyy"
    if(new Date(dateString).toString() === "Invalid Date") 
        return false
     else 
        const onlyNumbers = dateString.replace(/\D/g, ""); 
        const year = onlyNumbers.slice(0,4) 
        const month = onlyNumbers.slice(4,6)
        const day = onlyNumbers.slice(6,8)
        if(!month)
            return(new Date(year))
         else if (!day) 
            return(new Date(year, month - 1))
         else 
            return(new Date(year, month - 1, day))
                
    

第四个选择(也是最后一个建议)是使用适当的第三个库(如moment 或date-fns)

参考资料:

https://www.w3schools.com/js/js_date_formats.asp https://css-tricks.com/everything-you-need-to-know-about-date-in-javascript/ https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Date#parameters

【讨论】:

【参考方案19】:

我创建了这个函数来将任何 Date 对象转换为 UTC Date 对象。

function dateToUTC(date) 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());



dateToUTC(new Date());

【讨论】:

【参考方案20】:

你可以试试这个:

function formatDate(userDOB) 
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `$day $monthNames[monthIndex] $year`;


console.log(formatDate('1982-08-10'));

【讨论】:

【参考方案21】:

此答案基于 Kassem 的answer,但它也处理两位数年份。我提交了对 Kassem 答案的修改,但如果未获得批准,我也会将其作为单独的答案提交。

function stringToDate(_date,_format,_delimiter) 
        var formatLowerCase=_format.toLowerCase();
        var formatItems=formatLowerCase.split(_delimiter);
        var dateItems=_date.split(_delimiter);
        var monthIndex=formatItems.indexOf("mm");
        var dayIndex=formatItems.indexOf("dd");
        var yearIndex=formatItems.indexOf("yyyy");
        var year = parseInt(dateItems[yearIndex]); 
        // adjust for 2 digit year
        if (year < 100)  year += 2000; 
        var month=parseInt(dateItems[monthIndex]);
        month-=1;
        var formatedDate = new Date(year,month,dateItems[dayIndex]);
        return formatedDate;


stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

【讨论】:

【参考方案22】:

另一种方法:

String.prototype.toDate = function(format) 
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) 
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) 
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        
    
    return new Date(year, month, day);
;
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z

【讨论】:

啊!整洁的!最后是一个处理使用的任何分隔符的代码。 但是弄乱 String.prototype 是个坏主意。可能会导致很难找到错误。【参考方案23】:
var date = new Date(year, month, day);

var date = new Date('01/01/1970');

'01-01-1970' 格式的日期字符串在 FireFox 中不起作用,因此最好在日期格式字符串中使用“/”而不是“-”。

【讨论】:

我的字符串是 "2015/08/03 13:06:16" 在 FF 中出现,它不起作用【参考方案24】:

如果需要在转换为Date格式之前检查字符串的内容:

// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) 
  var d = mdy.split(/[\/\-\.]/, 3);

  if (d.length != 3) return null;

  // Check if date is valid
  var mon = parseInt(d[0]), 
      day = parseInt(d[1]),
      year= parseInt(d[2]);
  if (d[2].length == 2) year += 2000;
  if (day <= 31 && mon <= 12 && year >= 2015)
    return new Date(year, mon - 1, day);

  return null; 

【讨论】:

【参考方案25】:

我创建了 parseDateTime 函数来将字符串转换为日期对象,它在所有浏览器(包括 IE 浏览器)中都可以使用,请检查是否有人需要,参考 https://github.com/Umesh-Markande/Parse-String-to-Date-in-all-browser

    function parseDateTime(datetime) 
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3)
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) 
                    hours += 12;
                    try  time = hours+':'+timearray[1]+':'+timearray[2] catch(e) time = hours+':'+timearray[1] 
                 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            else if(datetime.split(' ').length == 2)
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            else if(datetime != '')
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            
            return datetime;
        

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)

【讨论】:

【参考方案26】:

您可以使用正则表达式解析字符串以详细说明时间,然后创建日期或任何返回格式,例如:

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString)
    let reggie = /(\d4)-(\d2)-(\d2) (\d2):(\d2):(\d2).(\d1)/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;

alert(strToDate(dateString));

【讨论】:

【参考方案27】:

ISO 8601 风格的日期字符串,尽管标准非常出色,但仍未得到广泛支持。

这是一个很好的资源,可以帮助您确定应该使用哪种日期字符串格式:

http://dygraphs.com/date-formats.html

是的,这意味着您的日期字符串可能比

简单

"2014/10/13 23:57:52" 代替 "2014-10-13 23:57:52"

【讨论】:

【参考方案28】:
                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

【讨论】:

【参考方案29】:

使用此代码:(我的问题已通过此代码解决)

function dateDiff(date1, date2)
var diff =                            // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

【讨论】:

请解释你的答案 date1 和 date2 参数的格式必须为正确的日期。 函数返回日期名为 diff 。如果您想要返回的天数,只需这样做: var result=dateDiff(date1,date2); var day_number=result.day ;这很容易【参考方案30】:

我编写了一个可重用函数,当我从服务器获取日期字符串时使用它。 您可以传递所需的分隔符(/ - 等)来分隔日月和年,以便使用 split() 方法。 您可以在 working example 上查看和测试它。

<!DOCTYPE html>
<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div>
      <span>day:
      </span> 
      <span id='day'>
      </span>
    </div>
    <div>
      <span>month:
      </span> 
      <span id='month'>
      </span>
    </div>
    <div>
      <span>year:
      </span> 
      <span id='year'>
      </span>
    </div>
    <br/>
    <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
    <span>28/10/1980
    </span>
    <script>
      function convert(delimiter,dateString)
      
        var splitted = dateString.split('/');
        // create a new date from the splitted string 
        var myDate = new Date(splitted[2],splitted[1],splitted[0]);
        // now you can access the Date and use its methods 
        document.getElementById('day').innerHTML = myDate.getDate();
        document.getElementById('month').innerHTML = myDate.getMonth();
        document.getElementById('year').innerHTML = myDate.getFullYear();
      
    </script>
  </body>
</html>

【讨论】:

以上是关于在 JavaScript 中将字符串解析为日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs中将字符串解析为日期

如何在 xslt 2.0 中将字符串解析为日期

在 Windows C++ 中将字符串解析为日期的区域感知

如何在Python中将字符串解析为日期时间

在javascript中将字符串数组转换为数组

Ag-grid - 导出的 excel 不会在 IE 中将字符串解析为日期格式