如何在javascript中从字符串创建日期对象[重复]

Posted

技术标签:

【中文标题】如何在javascript中从字符串创建日期对象[重复]【英文标题】:How to create a date object from string in javascript [duplicate] 【发布时间】:2012-01-03 16:45:49 【问题描述】:

有这个字符串30/11/2011。我想把它转换成日期对象。

我需要使用:

Date d = new Date(2011,11,30);   /* months 1..12? */

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

?

【问题讨论】:

两者都不是。请参阅@IgorDymov 答案。您的查询是关于“字符串”,而不是三个数字的顺序。 这个问题有点令人困惑——第一句和标题是关于字符串解析的,而问题的其余部分是关于从一组整数构造一个Date。我投票关闭作为重复,因为我假设标题是正确的并且您正在寻找字符串解析。 【参考方案1】:
var d = new Date(2011,10,30);

因为月份在 js 中从 0 开始编入索引。

【讨论】:

我觉得应该是 var d = new Date(2011,10,30); 很惊讶有人在大约 1.5 年和 24,000 多次观看后注意到了这一点。 或者我们可以使用new Date(2011,11,0) 也可以直接选择日期,作为单个字符串const date = new Date("2018-05-09")【参考方案2】:

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

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

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

【讨论】:

使用 parse 方法时要注意时区问题。 如果解析的日期碰巧无效(例如 2 月 30 日),请注意 javascript 会静默返回与解析的日期完全不同的日期。 还要注意 Date.parse() 返回 一个数字,特别是自 1970 年以来的 ms。而 Dogbert 的答案将返回一个 JS Date 对象,并提供来自 @ 的强大方法选择987654324@。 Demo in jsFiddle 这会返回一个数字,而不是日期。 根据官方文档:注意:由于浏览器的差异和不一致,强烈建议不要使用 Date 构造函数(和 Date.parse,它们是等效的)解析日期字符串。避免通过解析字符串来创建 Date 对象。相反,构建您自己的函数,从您拥有的字符串中理解年、月和日,然后通过将不同的数字传递给构造函数来创建日期【参考方案3】:

语法如下:

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

所以

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

是正确的;日、时、分、秒、毫秒是可选的。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

【讨论】:

其实根据链接,day也是可选的。默认为每月的第一天。【参考方案4】:

如上所述,有多种创建日期的方法。我不会重复同样的事情。如果这是您正在寻找的,这是在 Java Script 中将 String 转换为 Date 的小方法,

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;

【讨论】:

这真的很有用,应该是最佳答案,因为它实际上根据您的日期字符串格式以一种适应性强的方式回答了问题(并且没有任何时区问题的风险)。 对我来说这也是最好的答案。 当我偶然发现我的要求并得知月份从 0 开始索引时,我思考了几种方法来改变我的月份值。我向下滚动了一些,发现了这个 :-) 谢谢! 这实际上正确地回答了这个问题。 “来自 String 的日期对象”。感谢您的回答。【参考方案5】:

很简单:

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

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

【讨论】:

据我所知,官方 ISO8601 格式是 yyyy-MM-dd (en.wikipedia.org/wiki/ISO_8601) 是的,它通过 new Date("2019-12-21 07:25:00") 起作用 @ValterEkholm 在 chrome 和 ff 中运行良好,但在 safari 中却不行 @gardelin - 谢谢 我认为使用反斜杠可能会产生更可预测的结果......请参阅***.com/questions/70481329/…【参考方案6】:

先这样提取字符串

var dateString = str.match(/^(\d2)\/(\d2)\/(\d4)$/);

那么,

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

【讨论】:

不,让引擎为您处理并使用建议的Date.parse【参考方案7】:

始终,对于实际中有关 JavaScript 规范的任何问题,我强烈推荐 Mozilla Developer Network 和 their JavaScript reference。

正如the topic of the Date object 中关于您使用的参数变体所述:

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

关于月份参数:

month 表示月份的整数值,从 0 开始表示 1 月到 11 表示 12 月。

那么,很明显,您应该使用 10 月份的月份来表示 11 月。

P.S.:我推荐MDN的原因是它的正确性、对事物的良好解释、示例和浏览器兼容性图表。

【讨论】:

【参考方案8】:

我不敢相信 javascript 与解析日期不一致。而且我听说没有时区时的默认值将从UTC更改为本地-希望网络已准备好;)

在解析日期时,我更喜欢让 Javascript 来完成繁重的工作。但是,以相当透明的方式处理本地时区问题会很好。考虑到这两件事,这里有一个功能可以解决当前的现状——当 Javascript 发生变化时,它仍然可以工作,但可以被删除(有一点时间让人们赶上旧的浏览器/nodejs当然)。

function strToDate(dateStr)

    var dateTry = new Date(dateStr);

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

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

    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 更可接受)。

【讨论】:

以上是关于如何在javascript中从字符串创建日期对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Javascript中从数组中提取值

如何在 QML 中从 QString 格式化日期

在 Javascript ECMAScript 6 中从类名创建对象

JavaScript 日期

如何在 swift 中从两天中获取日期名称

如何在 Java 中从 String 创建 XML 对象?