【问题标题】:Converting to UTC is giving NaN error in Javascript转换为 UTC 在 Javascript 中给出 NaN 错误
【发布时间】:2019-11-19 09:47:23
【问题描述】:

下面的代码在我尝试将其转换为Date.UTC 格式时给出NaN 错误。

 let sDate = "2019, 10, 19";
 let min = Date.UTC(sDate);

而下面的代码给了我正确的结果

let min = Date.UTC(2019, 10, 19);

但根据我的需要,sDate 应该作为参数传递,因为它可能会有所不同。如何纠正这个问题?

【问题讨论】:

  • “它可能会有所不同”:Date 可以解析的字符串格式是有限的,并且在某些情况下取决于引擎。那么,您需要支持的输入格式到底是什么?你能完整吗?

标签: javascript date utc


【解决方案1】:

如果您引用docsDate.UTC 不会将日期字符串作为参数。它需要单独的部分。

Date.UTC(年[, 月[, 日[, 小时[, 分钟[, 秒[, 毫秒]]]]]])

因此,当您传递Date.UTC('2019, 10, 19') 时,您只是传递了年份的值,而不是其他值。年份的价值也不是数字。因此是 NaN。

如果您希望使用日期字符串创建 UTC 日期,则必须拆分值。


日期参数不是字符串

let sDate = "2019, 10, 19";
 let min = Date.UTC(...sDate.split(', '));
 console.log(new Date(min));

【讨论】:

  • @trincot 1 月对应 0,所以 10 是 11 月,评论前请查看方法的文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @MosèRaguzzini 10 应该是 Oct.,因为您正在从字符串创建日期。理想情况下,用户可读格式的日期应该被视为普通日期,而不是 JS 中的日期。因此,月份应该减去 1
  • 是的,但是如果 string "2019, 10, 19" 打算指向 11 月而不是 10 月,我会感到惊讶。那将真的是一个非常令人困惑的字符串格式。
  • OP 的问题是关于在字符串中传递参数 AS,符合 Date.UTC() 文档。 无需阅读文档即可使其可读。
  • Date.UTC 不将日期字符串作为参数”不正确。它接受一到七个参数,这些参数都可以是任何类型,包括字符串,在评估并传递给 ToNumber 时会产生合适的值。 Date.UTC('2019',false, true, [5]) 有效期为 2019-01-01T05:00:00Z。
【解决方案2】:

您可以使用 String.split(带解构)将 已知 日期字符串格式转换为年、月、日。传递给 Date.UTC 函数时,您必须从月份值中减去 1,因为它接受从 0 到 11(1 月到 12 月)的月份值。

如果您想进行更复杂的日期解析,我强烈建议您使用 Moment.js 之类的库。这是经过良好测试的并且具有非常灵活的 API。

const sDate = "2019, 10, 19";
const [year, month, day] = sDate.split(",");
console.log("Date components:", {year, month, day});
// Date constructor takes a month from 0: January to 11: December
const utcDate = Date.UTC(year, month - 1, day);
console.log("Date (ISO):", new Date(utcDate).toISOString());
console.log("Date (toLocaleString):", new Date(utcDate).toLocaleString("en", { timeZone: "UTC"}));

【讨论】:

  • .map(number) 是多余的,Date.UTC 无论如何都会在每个参数上调用 ToNumber。 ;-)
  • 好电话@RobG,我只是在输入上运行了 Number 以明确说明它,但你说得对,这没有必要!
【解决方案3】:

Date.UTC() 方法接受类似于 Date 构造函数的参数,但将它们视为 UTC

Date.UTC(year[, month[, day[, hour[, minute[, second[, millisecond]]]]]])

你不能直接使用字符串

getData=(d)=>{
            return [d.getFullYear(),d.getMonth(),d.getDate(), d.getHours(),d.getMinutes()];
        };
        
        
        let splited = getData(new Date('2019, 10, 19'))
        
        console.log(new Date(Date.UTC(...splited)));

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多