我有一个日期字符串,该字符串的格式取决于浏览器的语言/区域。例如, <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')
这将返回“无效日期”。关于如何操作的任何建议,甚至我可以使用的其他插件?谢谢。
答案 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日。