1

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

下面的示例使用的是DateJS(新西兰本地化),我已经对较新的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 日,但不正确的会返回 1 月 6 日。(这是输入解析 - 输出格式为时已晚)。

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

更新

在这个应用程序中,我验证了许多可能的用户输入,包括:

01062012
01/06/2012
010612

这将使 parseExact 样式的实现有点冗长......

4

2 回答 2

2

我不知道 DateJS,但是如果您发现它假设MMddyyyy您想要的位置,ddMMyyyy那么您可以MMddyyyy在解析之前对字符串进行快速替换以将其切换到:

Date.parse( '01062012'.replace(/^(\d\d)(\d\d)(\d\d\d\d)$/,"$2$1$3") );

或者做一个类似的替换来插入连字符并使它dd-MM-yyyy

Date.parse( '01062012'.replace(/^(\d\d)(\d\d)(\d\d\d\d)$/,"$1-$2-$3") );

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

于 2012-05-23T00:17:51.783 回答
1

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

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

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

我还更新了jsfiddle以确保。

更新

我认为问题在于解析器硬编码了一堆简单的格式,并且在某些情况下,这些格式会覆盖日期、月份和年份顺序的本地化设置。如果您将以下内容放在使用 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"
]);

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

于 2012-05-23T00:44:56.343 回答