如何在javascript中从字符串创建日期对象

214
这段文字的意思是:“有一个字符串 '30/11/2011',我想将它转换为日期对象。我需要使用什么方法?”
Date d = new Date(2011,11,30);   /* months 1..12? */

或者
Date d = new Date(2011,10,30);   /* months 0..11? */

?


1
不是这样的。请参考@IgorDymov的回答。你的问题是关于“字符串”的,而不是三个数字应该排列的顺序。 - Jesse Chisholm
这个问题有点令人困惑——第一句话和标题是关于字符串解析的,而问题的其余部分是关于从一组整数构造Date的。我投票将其关闭为重复,因为我假设标题是正确的,你正在寻找字符串解析。 - Kyle Strand
8个回答

297
var d = new Date(2011,10,30);

由于 JavaScript 中的月份是从 0 开始索引的。


33
我认为应该是 var d = new Date(2011,10,30); - Yoosaf Abdulla
74
有人惊讶地发现了这一事实,大约是在1.5年和24,000多次浏览后。 - Dogbert
1
或者我们可以使用 new Date(2011,11,0) - Mahi
16
它也可以直接选择日期,作为一个单独的字符串 const date = new Date("2018-05-09") - Matt
2
小心!如果您的时区为负数,则 const date = new Date("2018-05-09") 不会给您正确的日期。请改用 const date = new Date("2018-05-09T00:00:00")const date = new Date("2018/05/09")const date = new Date(2018, 4, 9) - Edmund Wang

103

你肯定想使用第二个表达式,因为在JS中,月份是从0开始枚举的。

另外,你也可以使用Date.parse方法,但它使用不同的日期格式:

var timestamp = Date.parse("11/30/2011");
var dateObject = new Date(timestamp);

3
使用解析方法时要注意时区问题。 - Alex
3
注意,如果解析的日期不合法(例如2月30日),JavaScript可能会默默地返回完全不同的日期。请小心处理。 - jforberg
6
请注意,Date.parse()返回的是一个数字,具体来说是自1970年以来的毫秒数。而Dogbert的答案将返回一个JS Date对象,其中包含从__proto__可用的丰富方法。 在jsFiddle中查看演示 - KyleMit
4
这会返回一个数字,而非日期。 - Alisson Reinaldo Silva
2
根据官方文档:注意:强烈不建议使用Date构造函数(和Date.parse,它们是等效的)解析日期字符串,因为浏览器之间存在差异和不一致性。避免通过解析字符串创建Date对象。相反,构建自己的函数,从您拥有的字符串中理解年份、月份和日期,然后通过将不同的数字传递给构造函数来创建Date。 - Alex Christodoulou

68

2
实际上,根据链接,日期也是可选的。它默认为该月的第一天。 - Loolooii

63

上面讨论了多种创建日期的方法,我不会重复相同的内容。以下是在JavaScript中将字符串转换为日期的简单方法,如果这是您想要的,请参考:

function compareDate(str1){
// str1 format should be dd/mm/yyyy. Separator can be anything e.g. / or -. It wont effect
var dt1   = parseInt(str1.substring(0,2));
var mon1  = parseInt(str1.substring(3,5));
var yr1   = parseInt(str1.substring(6,10));
var date1 = new Date(yr1, mon1-1, dt1);
return date1;
}

4
这真的非常有用,应该是顶级答案,因为它可以根据您的日期字符串格式以适应性的方式回答问题(而且没有任何时区问题的风险)。 - Kosta Kontos
对我来说,这也是最好的答案。 - Stephan Kristyn
当我遇到这个需求并了解到月份从0开始索引时,我思考了几种修改月份值的方法。我继续向下滚动,发现了这个 :-) 谢谢! - codaamok
这实际上很好地回答了问题。"从字符串创建日期对象"。感谢您的回答。 - Sukanta Paul

40

非常简单:

var dt=new Date("2011/11/30");

日期应该使用ISO格式 yyyy/MM/dd。


12
据我所知,官方的ISO8601格式为yyyy-MM-dd(https://zh.wikipedia.org/wiki/ISO_8601)。 - Aram Paronikyan
是的,通过执行 new Date("2019-12-21 07:25:00") 成功了。 - Valter Ekholm
2
@ValterEkholm 在 Chrome 和 Firefox 中运行良好,但在 Safari 中不起作用。 - Gardelin
@gardelin - 谢谢 - Valter Ekholm
我认为使用反斜杠可能会产生更可预测的结果...请参见https://dev59.com/lcPra4cB1Zd3GeqPZye8 - Ole

14

首先像这样提取字符串

var dateString = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);

那么,

var d = new Date( dateString[3], dateString[2]-1, dateString[1] );

1
不要自己处理,让引擎为您处理,并使用建议的 Date.parse - hank

10

针对任何与JavaScript规范相关的问题,我强烈推荐访问Mozilla开发者网络它们的JavaScript参考文档

正如在Date对象的主题中所述,关于使用哪种参数变体:

new Date(year, month, day [, hour, minute, second, millisecond ])

关于月份参数:

month 整数值表示月份,从0代表一月到11代表十二月。

很明显,对于11月份应该使用月份数字10。

P.S.:我推荐使用 MDN 是因为其正确性,良好的解释、示例和浏览器兼容性图表。


3
我简直无法相信JavaScript在解析日期方面的一致性不够。而且我听说当没有时区时,默认值会从UTC更改为本地时间,希望网络做好准备;)
当涉及到解析日期时,我更喜欢让JavaScript自己处理繁重的工作。然而,如果能够相对透明地处理本地时区问题,那就更好了。考虑到这两点,以下是一个函数,它可以使用当前状态来实现这一点,当JavaScript发生变化时,它仍将起作用,但可以随后删除(当然需要一些时间让人们适应旧版浏览器/Node.js)。
function strToDate(dateStr)
{
    var dateTry = new Date(dateStr);

    if (!dateTry.getTime())
    {
        throw new Exception("Bad Date! dateStr: " + dateStr);
    }

    var tz = dateStr.trim().match(/(Z)|([+-](\d{2})\:?(\d{2}))$/);

    if (!tz)
    {
        var newTzOffset = dateTry.getTimezoneOffset() / 60;
        var newSignStr = (newTzOffset >= 0) ? '-' : '+';
        var newTz = newSignStr + ('0' + Math.abs(newTzOffset)).slice(-2) + ':00';

        dateStr = dateStr.trim() + newTz;
        dateTry = new Date(dateStr);

        if (!dateTry.getTime())
        {
            throw new Exception("Bad Date! dateStr: " + dateStr);
        }
    }

    return dateTry;
}

我们需要一个日期对象,因此创建一个。如果有时区,我们就完成了。否则,使用+hh:mm格式(比+hhmm更被接受)创建一个本地时区字符串。

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