代码之家  ›  专栏  ›  技术社区  ›  cdarwin

用瞬间验证英国日期。js

  •  0
  • cdarwin  · 技术社区  · 5 年前

    我需要确认英国的日期,我用的是moment。js。 英国日期格式为“dd/mm/yyyy”。 以下代码报告验证日期“25/03/2021”为假,为什么? 我该怎么解决?

    moment.locale("en");
    const since = "25/03/2021";
    let date = moment(since, "L");
    let isValid = date.isValid();
    console.log(isValid);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

    使现代化 :我尝试了msmolcic的解决方案,但问题是我正在验证从浏览器中获取的日期,当设置英国英语时,区域设置为“en”而不是“en-GB”。以下代码失败。

    我该怎么修?

    moment.locale("en");
    const since = "25/03/2021";
    let date = moment(since, "L");
    console.log(date);
    let isValid = date.isValid();
    console.log(isValid);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script>
    1 回复  |  直到 5 年前
        1
  •  1
  •   msmolcic    5 年前

    你的例子有两个问题:

    1. 包括你在内 moment.min.js ,但要使用区域设置,必须包括 moment-with-locales.min.js .
    2. 您必须将locale设置为 en-GB 而不仅仅是 en .

    moment.locale("en-GB");
    const since = "25/03/2021";
    let date = moment(since, "L");
    console.log(date);
    let isValid = date.isValid();
    console.log(isValid);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script>
        2
  •  1
  •   Lazar Petrovic    5 年前

    除了@msmolcic,我还要补充一点,您也可以使用ISO标准,该标准将得到验证。 如果你正在用后端创建一个更严肃的应用程序,只需将日期对象存储为ISO格式,并在前端执行即可 moment(dateHere).format("dd/mm/yyyy");

        3
  •  1
  •   Tim S.    5 年前

    魔法发生在构造函数内部。如果您将一个模式传递给它,那么矩将正确地解析它。

     const since = "25/03/2021";
    let date = moment(since, "DD/MM/YYYY");
    console.log(date);
    let isValid = date.isValid();
    console.log(isValid);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
        4
  •  0
  •   Remy Kabel    5 年前

    在阅读了评论和问题的具体性质后,我认为您希望实现以下目标:

    1. 从浏览器中获取用户的xx风格区域设置
    2. 使用moment检查日期的有效性。js

    正如你在其他答案中读到的,地点 en 决心 en-US 暂时。js。因此,我们需要用户首选的xx风格区域设置。而不仅仅是 navigator.language ,我们可以使用 navigator.languages (注意额外的 s ).要获取xx风格的区域设置:

    const locales = navigator.languages || [navigator.language] // since navigator.languages may be undefined
    console.log(locales)
    
    const preferredLocale = locales.filter(lang => lang.match(/\S+-\S+/))[0]
    console.log(`The user's preferred locale is ${preferredLocale}`)

    当然,浏览器的首选语言环境列表中可能没有设置任何xx风格的语言环境。在这种情况下,唯一的方法就是检查 Accept-Language HTTP头,或通过IP地理位置。然而,这可能有点牵强。但请随时检查 here 了解更多信息。

    因此,您可以使用@msmolcic的答案将以下内容结合到您的解决方案中:

    const locales = navigator.languages || [navigator.language] // since navigator.languages may be undefined
    const preferredLocale = locales.filter(lang => lang.match(/\S+-\S+/))[0]
    
    moment.locale(preferredLocale)
    const since = "25/03/2021"
    let date = moment(since, "L")
    
    let isValid = date.isValid()
    console.log(`The date is ${isValid ? 'valid' : 'not valid'}`)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script>
    推荐文章