正确识别语言环境日期字符串

时间:2019-05-27 10:50:12

标签: javascript date momentjs

我有一个日期字符串,该字符串的格式取决于浏览器的语言/区域。例如, <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.10</version> </dependency> 中的"03/05/2019"是2019年3月5日(mm / dd / yyyy),而en-US中的en-NZ是2019年5月3日(dd / mm / yyyy)。

我需要知道如何使用JavaScript和相应的语言环境将字符串转换为日期。我无法对格式进行硬编码,因为语言环境确实取决于浏览器。我尝试使用Moment.js,但似乎无法正常工作。它为invalid date之类的日期返回"16/05/2019"。看起来好像没有遵循我设置为en-NZ的语言环境。

这是我尝试过的momentjs代码:

moment().locale('en-NZ').format('L')

这将返回当前日期的en-NZ格式,即2019年5月27日,但是当我尝试添加日期字符串时:

moment('16/05/2019').locale('en-NZ').format('L')

这将返回“无效日期”。关于如何操作的任何建议,甚至我可以使用的其他插件?谢谢。

4 个答案:

答案 0 :(得分:0)

http://momentjs.com/docs/#/parsing/string-format/,您需要传递以下格式:

  

如果您知道输入字符串的格式,则可以使用它来解析   片刻。

moment("12-25-1995", "MM-DD-YYYY");
  

解析器会忽略非字母数字字符,因此两个   以下操作将返回相同的结果。

moment("12-25-1995", "MM-DD-YYYY");
moment("12/25/1995", "MM-DD-YYYY");
  

解析令牌类似于在   时刻#格式。

答案 1 :(得分:0)

即使不理想,也有几种识别日期字符串的方法。

就您而言,我将尝试使用较新的浏览器中提供的语言API。

if(navigator.language=="en-US"){
    //USA Date Format
}else{
   //NZ Date Format
}

您可以使用国家/地区的完整列表进行扩展:https://en.wikipedia.org/wiki/Date_format_by_country

有关可以使用的语言和格式的完整列表,请参见Get Locale Short Date Format using javascript

我还建议在Moment.JS上使用Luxon,因为它更适合未来且支持语言环境。

答案 2 :(得分:0)

不幸的是,当前无法通过JavaScript访问的API提供当前用户的语言环境。 This answer涉及其中的一部分,但即使在2019年,Chrome也不支持navigator.language之外列出的任何属性,这是不可靠的(我返回{{1} },但我在英国,所以应该是en-US [系统上的所有内容都以英国格式格式化我的日期])。

我发现获取本地日期格式的唯一方法是使用en-GB格式化日期,然后从结果中得出日期:

Intl.DateTimeFormat
const format = new Intl.DateTimeFormat()
  .format(new Date(2019, 11, 25)) // Christmas 2019
  .replace("2019", "YYYY")
  .replace("12", "MM")
  .replace("25", "DD");
console.log(format);

在我的系统上,返回<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>是因为我在英国(与NZ一样)使用合理格式。 (我是美国人,所以我可以向美国人介绍他们奇怪的日期格式。)大概在美国,它将返回DD/MM/YYYY

然后可以将这种格式与MM/DD/YYYY一起使用:

moment
const format = new Intl.DateTimeFormat()
    .format(new Date(2019, 11, 25)) // Christmas 2019
    .replace("2019", "YYYY")
    .replace("12", "MM")
    .replace("25", "DD");

document.getElementById("btn").addEventListener("click", function() {
    const str = document.getElementById("date").value.trim();
    const dt = moment.utc(str, format);
    console.log(`The date in ISO format: ${dt.toISOString()}`);
});

您可能希望为用户提供一个框来选择其语言环境,在这种情况下,您希望使用Enter a date in your local format and click Parse It: <input type="text" id="date" autofocus> <input type="button" id="btn" value="Parse It"> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>而不是上面的moment-with-locales.min.js

答案 3 :(得分:0)

谢谢您的建议,但我想我找到了解决方案并回答了我自己的问题。我没有正确使用momentjs。日期,长日期格式和语言环境都是矩函数的参数。因此,它可以正确识别日期,现在,我可以将其格式化为所需的任何格式。 (假设您有代码来获取浏览器的语言环境,例如@Dean Meehan建议的内容)

new Date(moment('16/05/2019','L','en-nz').format('MM/DD/YYYY'))

因此,en-NZ的2019年5月16日为2019年5月16日。