将字符串转换为日期对象javascript返回错误的日期

时间:2020-03-18 19:11:27

标签: javascript

我正在尝试将字符串转换为javascript中的日期对象,但是字符串中的day减去day是1。我不知道怎么了这是方法

function formatDate(date_str)
{
   console.log(date_str); //input : 2020-03-11

    let new_date = new Date(date_str);

    console.log(new_date); //output : Tue Mar 10 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

    return new_date;
}

2 个答案:

答案 0 :(得分:0)

最可能的解释是,在没有其他信息的情况下解析输入字符串“ 2020-03-11”将其等同于UTC午夜2020年3月11日。当您位于其他时区时,它将计算您的时区偏移量,并为您提供比当地时间早一天的四小时的时间。

答案 1 :(得分:0)

为什么这样的行为:

日期字符串(2020-03-11)没有指定任何时区,当您尝试使用此字符串创建Date对象时,JavaScript会假定时区为UTC,因此日期在内部像这样处理:2020-03-11T00:00:00Z
console.log(new_date)将在.toString()对象上内部调用new_date方法,这样做将触发日期转换为您当地的时区。根据我认为您的问题(实际上是您的计算机上的时间)在GMT-4中,这就是为什么从日志输出中减去4个小时的原因。有关由于时区here

而引起的日期转换的更多详细信息

可能的解决方法:
首先,我们应该了解这不是错误或错误,这只是JavaScript Date对象的工作方式。
对于您的问题中所述的情况,我想您想要避免在日期字符串上进行此时区转换。您可以做的是在使用日期区域实例化日期对象之前将时区信息添加到日期字符串中,因此,javascript不会假定您传递给Date()构造函数的日期字符串采用UTC,并且在您调用时Date.toString()或任何其他类似的方法,不会有任何意外。一个实现可以是这样的:

// Sorry for the super long function name :)
function add_local_time_zone_to_date_string (date_string) {
    // Getting your local time zone
    let local_time_zone = (new Date().getTimezoneOffset() * -1) / 60;
    // local_time_zone is a number, convert it to a string
    local_time_zone = (local_time_zone.toString())
    // Padding with 0s if needed to ensure it is of length 2
    local_time_zone = local_time_zone.padStart(2, '0');
    return `${date_string}T00:00:00+${local_time_zone}`
}

function formatDate(date_str) {
    console.log(date_str); //input : 2020-03-11

    const date_with_time_zone = add_local_time_zone_to_date_string(date_str);
    let new_date = new Date(date_with_time_zone);

    console.log(new_date); //output : There should be no surprises here

    return new_date;
}