JSDate - 正确解析ddMMyyyy格式的日期

时间:2012-05-23 00:04:20

标签: javascript parsing date

我在使用Javascript解析用户输入时遇到问题,我无法让解析器正确接受ddMMyyyy中的日期。当存在分隔符时,它会正确解析。

以下示例使用DateJS(NZ本地化),并且我已经初步尝试使用较新的MomentJs(这不是输入验证的理想选择)。如果他们要充分处理输入案例,我会对其他框架持开放态度。

我的测试用例:

// Parses correct value
var dateWithHyphens = Date.parse('01-06-2012');

// Parses incorrectly, using MMddyyy, instead of ddMMyyyy
var dateWithoutHyphens = Date.parse('01062012');

// Parses incorrectly, using MMddyyy, instead of ddMMyyyy
var dateWithFormat = Date.parse('01062012', { format: 'ddMMyyyy'});

我为此创建了一个JSFiddle:http://jsfiddle.net/ajwxs/1

测试用例应该在6月1日返回,但不正确的测试用例将在06年6月返回。(这是输入解析 - 输出格式化为时已太晚)。

有关JSDate是否可以更好地使用正确格式解析这些日期的任何建议?

更新

在这个应用程序中,我正在验证一些可能的用户输入,包括:

01062012
01/06/2012
010612

这会使parseExact风格的实现的实现有点冗长...

2 个答案:

答案 0 :(得分:2)

我不知道DateJS,但是如果你发现它假定MMddyyyy你想要ddMMyyyy,那么你可以快速替换你的字符串以将其切换为{{ 1}}在解析之前:

MMddyyyy

或者执行类似的替换以插入连字符并将其设为Date.parse( '01062012'.replace(/^(\d\d)(\d\d)(\d\d\d\d)$/,"$2$1$3") );

dd-MM-yyyy

无论哪种方式,已经有连字符的字符串都将保持不变,因此可以根据您的第一个(成功的)测试用例进行解析。

答案 1 :(得分:1)

您想使用Date.parseExact方法。由于某种原因,它可以工作,而普通的解析没有。此外,您不需要传递包装在对象中的格式选项。

根据规范Date.parse不应该采用格式选项,这可能就是原因。

// Parses correctly
var dateWithFormat = Date.parseExact('01062012', 'ddMMyyyy');

我还更新了jsfiddle以确定。

更新

我认为问题在于解析器hard-codes是一堆简单的格式,在某些情况下会覆盖日期,月份和年份顺序的本地化设置。如果您在使用Date之前放置以下内容,则会解决您的问题。

Date.Grammar._formats = Date.Grammar.formats([
    "\"yyyy-MM-ddTHH:mm:ssZ\"",
    "yyyy-MM-ddTHH:mm:ssZ",
    "yyyy-MM-ddTHH:mm:ssz",
    "yyyy-MM-ddTHH:mm:ss",
    "yyyy-MM-ddTHH:mmZ",
    "yyyy-MM-ddTHH:mmz",
    "yyyy-MM-ddTHH:mm",
    "ddd, MMM dd, yyyy H:mm:ss tt",
    "ddd MMM d yyyy HH:mm:ss zzz",
    "ddMMyyyy",
    "MMddyyyy",
    "ddMyyyy",
    "Mddyyyy",
    "dMyyyy",
    "Mdyyyy",
    "yyyy",
    "dMyy",
    "Mdyy",
    "d"
]);

这不是很漂亮,但它肯定比列出所有可能的选项更短,如果只是一点点。如果你能找到一个不太古怪的日期库,那么这可能是一个更好的选择。

相关问题