【问题标题】:Parsing a string containing a date in a specific format into a Date object in Javascript将包含特定格式日期的字符串解析为 Javascript 中的 Date 对象
【发布时间】:2010-12-13 23:29:15
【问题描述】:

我正在学习 Javascript 作为一门新语言,我想出一个习惯 JS 如何处理 reg exp 和字符串操作的好方法是将包含日期的字符串解析为 Date 对象。

我有一个"2005-05-28" 形式的字符串。将其解析为 Date 对象的最佳 Javascript 方式是什么?

【问题讨论】:

  • @all: ,该字符串不能可靠地与new DateDate.parse 一起使用。还没有。 (有一个早期的,现在已删除的答案说你可以,现在是第二个。)这将在所有当前发布的 IE 版本上失败,例如:jsbin.com/otite5 ISO 8601 子集的东西只是在第 5 版。规格(〜一年前)。以前,规范中有 no 标准字符串到日期的转换(只是声明它“应该”处理任何日期到字符串的输出)。新的东西是一个非常受欢迎的补充,但实现起来需要时间。

标签: javascript regex parsing string


【解决方案1】:

非正则表达式

我不知道“最佳”,但您不需要正则表达式:

var str = "2005-05-28";
var parts = str.split("-");
var dt = new Date(parseInt(parts[0], 10),
                  parseInt(parts[1], 10) - 1,
                  parseInt(parts[2], 10));

Live example

使用String#split 来分解- 字符上的字符串,然后使用Date 构造函数来接受年、月(从0 开始)和日(从1 开始)。

正则表达式

请注意,如果您真的想要使用正则表达式,您可以:

var str = "2005-05-28";
var parts = str.match(/^(\d{1,4})-(\d{1,2})-(\d{1,2})$/);
if (parts) {
    var dt = new Date(parseInt(parts[1], 10),
                      parseInt(parts[2], 10) - 1,
                      parseInt(parts[3], 10));
}

Live example

它使用带有捕获组的正则表达式,通过String#match 进行匹配,它返回一个在索引0 处具有完全匹配的数组,后跟捕获组。但是为了我的钱,正则表达式并没有真正给你买任何东西。

超越

如果您的日期字符串变得更复杂或可能会有所不同,我会考虑将问题提交给像 DateJS 这样的库。但是,如果您的格式是常规的,那么您就是黄金。

【讨论】:

    【解决方案2】:

    该格式对于标准 JS 日期是可以接受的。所以你只需要这样做:

    var dateObject = new Date("2005-05-28");
    

    编辑:以上是错误的,TJ 是对的;我被一个懒惰的答案打败了。它甚至在 Firefox 中解析不正确,从日期中减去一个。

    看到这个问题比我想象的要棘手,我仔细地进行了一些测试。 IE(和其他)将接受斜线而不是破折号(实现胜过规范)。所以,上面的代码可以用一个简单的 replace():

    var dateObject = new Date(("2005-05-28").replace("-", "/"));
    

    请注意,我还使用 MM/DD/YYYY 成功测试了这一点:

    var dateObject = new Date("05/28/2005");
    

    所以斜杠会在所有主流浏览器(包括 IE6)中解析。

    【讨论】:

    • 这种 ISO 日期格式仅由实施 ECMA-262 第 5 版的 JavaScript 版本正式支持,因此这在大多数 MSIE 网络浏览器中不起作用。
    • “该格式对于标准 JS 日期是可以接受的” 不,它不是(还)——请参阅我在问题上的注释(那个注释不是当你回答时就在那里,别担心)。我把笔记放在那里是因为你的第二个回答是这样说的,第一个在被指出错误时被删除了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2017-04-09
    • 2015-10-02
    相关资源
    最近更新 更多