gpt4 book ai didi

javascript - Date.toString 和 Date.toLocaleDateString 在 Chrome 和 Firefox 之间不一致?

转载 作者:行者123 更新时间:2023-11-30 20:05:21 25 4
gpt4 key购买 nike

所以我想显示一个日期而不特别注意一天中的时间。日期也没有任何问题。我使用的是 MacBook Pro。

如果我在 Date 构造函数中输入数字,则会出现以下内容。

例如,我想显示 1993 年 4 月 28 日。

var objDate = new Date(1993, 3, 28),
dateString = objDate.toLocaleDateString(undefined, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
timeZoneName: 'long'
});

console.log(dateString)
//Chrome Outputs: "Wednesday, April 28, 1993, 12 AM Mountain Daylight Time"
//Firefox Outpus: "Tuesday, April 27, 1993, 6 PM Mountain Daylight Time"

let nowDate = new Date(1993, 3, 28);
console.log(nowDate.toString())
//Chrome Outputs: "Wed Apr 28 1993 00:00:00 GMT-0600 (Mountain Daylight Time)"
//Firefox Outputs: "Wed Apr 28 1993 00:00:00 GMT+0000 (UTC)"

console.log(nowDate.toLocaleString())
//Chrome Outputs: "4/28/1993, 12:00:00 AM"
//Firefox Outputs: "4/27/1993, 6:00:00 PM"

所以现在日期同时显示 27 日和 28 日,尽管我希望它只显示 28 日。

但是!如果我将数字更改为字符串格式,如以下代码。它仍然不一致。

var objDate = new Date("1993-04-28"),
dateString = objDate.toLocaleDateString(undefined, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
timeZoneName: 'long'
});

console.log(dateString)
//Chrome Outputs: "Wednesday, April 27, 1993, 12 AM Mountain Daylight Time"
//Firefox Outpus: "Tuesday, April 27, 1993, 6 PM Mountain Daylight Time"

let nowDate = new Date("1993-04-28");
console.log(nowDate.toString())
//Chrome Outputs: "Wed Apr 27 1993 00:00:00 GMT-0600 (Mountain Daylight Time)"
//Firefox Outputs: "Wed Apr 28 1993 00:00:00 GMT+0000 (UTC)"

console.log(nowDate.toLocaleString())
//Chrome Outputs: "4/27/1993, 12:00:00 AM"
//Firefox Outputs: "4/27/1993, 6:00:00 PM"

现在是最后一段代码。

如果我在字符串格式中输入一天中的时间,比如中午,结果会很好地显示今天是哪一天。

编辑:我刚刚在 Safari 中检查了这个方法,它输出无效日期。

var objDate = new Date("1993-04-28 12:00"),
dateString = objDate.toLocaleDateString(undefined, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
timeZoneName: 'long'
});

console.log(dateString)
//Chrome Outputs: "Wednesday, April 28, 1993, 12 PM Mountain Daylight Time"
//Firefox Outpus: "Wednesday, April 28, 1993, 6 AM Mountain Daylight Time"

let nowDate = new Date("1993-04-28");
console.log(nowDate.toString())
//Chrome Outputs: "Wed Apr 28 1993 12:00:00 GMT-0600 (Mountain Daylight Time)"
//Firefox Outputs: "Wed Apr 28 1993 12:00:00 GMT+0000 (UTC)"

console.log(nowDate.toLocaleString())
//Chrome Outputs: "4/28/1993, 12:00:00 PM"
//Firefox Outputs: "4/28/1993, 6:00:00 AM"

所以现在这里是特别的问题。

为什么输入不同日期的方法有时会设置不同的日期? 在列出的每种情况下,浏览器有哪些不同之处?我认为我使用的每种方法都是基于本地的,而不是基于 UTC。

编辑:我可能只需要使用其中一个库来处理所有的不一致。尽管有一个相当小的图书馆吗?我找到了dayjs,它看起来足够小。

codepen sources

最佳答案

日期字符串的解析依赖于实现 - 这意味着它在浏览器之间不一致。某些字符串格式通常被视为 UTC,而不是本地格式。来自JavaScript Date docs...

Note: parsing of date strings with the Date constructor (and Date.parse,they are equivalent) is strongly discouraged due to browserdifferences and inconsistencies. Support for RFC 2822 format stringsis by convention only. Support for ISO 8601 formats differs in thatdate-only strings (e.g. "1970-01-01") are treated as UTC, not local.

类似地,toString 可能不会跨浏览器生成格式相似的日期字符串。来自Date.prototype.toString docs (请注意,截至本答案发布之日,ECMAScript 2018 尚未在所有浏览器中完全实现)...

Until ECMAScript 2018 (edition 9), the format of the string returnedby Date.prototype.toString was implementation dependent. Therefore itshould not be relied upon to be in the specified format.

toLocaleString localesoptionsnot supported across all browsers .

正如您所注意到的,有许多库,例如 Moment.js可以帮助解决这个问题。

如果您只是尝试获取一致的日期字符串输入并重新格式化它们以供显示,使用 vanilla js 可能并不那么困难(但困难在很大程度上取决于输入值的一致性)。例如:

const formatDate = (date) => {
const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
const [y, m, d] = date.split('-');
return months[m - 1] + ' ' + d + ', ' + y;
}

const date = formatDate('1993-04-28');
console.log(date);
// April 28, 1993

关于javascript - Date.toString 和 Date.toLocaleDateString 在 Chrome 和 Firefox 之间不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com