无时区javascript解析日期

无时区javascript解析日期,javascript,date,timestamp-with-timezone,Javascript,Date,Timestamp With Timezone,我想在JavaScript中解析没有时区的日期。我试过: new Date(Date.parse("2005-07-08T00:00:00+0000")); 返回2005年7月8日星期五02:00:00GMT+0200(中欧夏令时) 返回相同的结果 new Date(Date.parse("2005-07-08 00:00:00 GMT-0000")); 返回相同的结果 new Date(Date.parse("2005-07-08 00:00:00 GMT-0000")); 我想分析时间

我想在JavaScript中解析没有时区的日期。我试过:

new Date(Date.parse("2005-07-08T00:00:00+0000"));
返回2005年7月8日星期五02:00:00GMT+0200(中欧夏令时)

返回相同的结果

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
返回相同的结果

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
我想分析时间:

  • 没有时区

  • 不调用构造函数Date.UTC或新日期(年、月、日)

  • 只需简单地将字符串传递到日期构造函数(无需原型方法)

  • 我必须生成
    日期
    对象,而不是
    字符串


  • Date
    对象本身无论如何都将包含时区,返回的结果是以默认方式将其转换为字符串。也就是说,您不能创建没有时区的日期对象。但是您可以通过创建自己的对象来模拟
    Date
    对象的行为。
    但是,最好将其交给库,如。

    正确解析日期,只是将其转换为本地时区的字符串:

    let s=“2005-07-08T11:22:33+0000”;
    设d=新日期(Date.parse(s));
    //这是我的日志
    //“2005年7月8日星期五13:22:33 GMT+0200(中欧夏季时间)”
    //还有别的东西给你
    console.log(d.toString())
    //这个日志
    //2005年7月8日星期五11:22:33格林威治标准时间
    //为大家
    
    console.log(d.toutString())
    日期解析中存在一些固有的问题,遗憾的是默认情况下没有很好地解决这些问题

    -人类可读日期中有隐含的时区
    -在网络上有许多广泛使用的日期格式是不明确的

    要轻松、干净地解决这些问题,需要以下功能:

    >parse(whateverDateTimeString,expectedDatePattern,timezone)
    "unix time in milliseconds"
    
    我已经找过了,但是没有找到这样的

    所以我创造了:


    享受吧

    我遇到了同样的问题,然后想起了我正在从事的一个遗留项目的一些不确定之处,以及他们是如何处理这个问题的。我当时不明白,也不在乎,直到我自己遇到了这个问题

    var date = '2014-01-02T00:00:00.000Z'
    date = date.substring(0,10).split('-')
    date = date[1] + '-' + date[2] + '-' + date[0]
    
    new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600
    
    无论出于何种原因,将日期作为“01-02-2014”传递会将时区设置为零,并忽略用户的时区。这可能是Date类中的一个侥幸,但它在一段时间以前就存在,现在也存在。而且它似乎可以跨浏览器工作。你自己试试看


    这段代码是在一个全球项目中实现的,在这个项目中,时区非常重要,但是查看日期的人并不关心它被引入的确切时间。

    我也有同样的问题。我将日期作为字符串获取,例如:“2016-08-25T00:00:00”,但我需要具有正确时间的date对象。要将字符串转换为对象,我使用getTimezoneOffset:

    var date = new Date('2016-08-25T00:00:00')
    var userTimezoneOffset = date.getTimezoneOffset() * 60000;
    new Date(date.getTime() - userTimezoneOffset);
    
    getTimezoneOffset()
    将返回负值或正值。在世界上的每一个地方都必须减去它。

    简单的解决方案

    const handler1 = {
      construct(target, args) {
        let newDate = new target(...args);
        var tzDifference = newDate.getTimezoneOffset();
        return new target(newDate.getTime() + tzDifference * 60 * 1000);
      }
    };
    
    Date = new Proxy(Date, handler1);
    
    (新日期().toString())。替换(/\w+-\d+\(.*\)$/,“”)

    输出:2018年7月10日星期二19:07:11

    (新日期(“2005-07-08T11:22:33+0000”).toString()。替换(/\w+-\d+\(.*\)$/,“”)

    这将有输出:Fri Jul 08 2005 04:22:33


    注意:返回的时间将取决于您的本地时区这是我针对这个问题提出的解决方案,对我来说很有效


    使用的库:带有纯javascript日期类的momentjs

    第一步。 将字符串日期转换为时刻对象(PS:moment保留原始日期和时间,只要不调用
    toDate()
    方法):

    const dateMoment=力矩(“2005-07-08T11:22:33+0000”)

    第二步。 从先前创建的力矩对象中提取
    hours
    minutes
    值:

      const hours = dateMoment.hours();
      const mins = dateMoment.minutes();
    
    第三步。 将时间转换为日期(注:这将根据浏览器/机器的时区更改原始日期,但不要担心,请阅读步骤4):

    第四步。 手动设置在步骤2中提取的小时和分钟

      dateObj.setHours(hours);
      dateObj.setMinutes(mins);
    
    第五步。
    dateObj
    现在将显示没有任何时区差异的原始日期。即使夏令时更改也不会对日期对象产生任何影响,因为我们正在手动设置原始的小时和分钟


    希望这有帮助。

    只是一个一般性的说明。一种保持灵活性的方法

    我们可以使用getMinutes(),但它在前9分钟只返回一个数字

    let epoch=new Date()//或任何unix时间戳
    设za=新日期(纪元),
    zaR=za.getUTCFullYear(),
    zaMth=za.getUTCMonth(),
    zaDs=za.getUTCDate(),
    zaTm=za.toTimeString().substr(0,5);
    log(zaR+“-”+zaMth+“-”+zaDs,zaTm)
    您可以使用此代码

    var stringDate = "2005-07-08T00:00:00+0000";
    var dTimezone = new Date();
    var offset = dTimezone.getTimezoneOffset() / 60;
    var date = new Date(Date.parse(stringDate));
    date.setHours(date.getHours() + offset);
    

    javascript中的日期只是在内部保持简单。因此,日期时间数据存储在UTC unix历元中(毫秒或毫秒)

    如果你想拥有一个在地球上任何时区都不会改变的“固定”时间,你可以调整UTC时间以匹配你当前的本地时区并保存它。在检索时,无论您所在的本地时区是什么,它都会根据保存它的人显示调整后的UTC时间,并添加本地时区偏移量以获得“固定”时间

    保存日期的步骤(以毫秒为单位)

    检索/显示日期(毫秒)

    然后你可以:

    const saveTime = new Date(toUTC(Date.parse("2005-07-08T00:00:00+0000")));
    // SEND TO DB....
    
    // FROM DB...
    const showTime = new Date(fromUTC(saveTime));
    

    由于显示日期时确实存在格式问题(例如,以本地时间显示),因此我喜欢使用新的(ish)Intl.DateTimeFormat对象来执行格式设置,因为它更明确,并提供了更多的输出选项:

    const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
    
    const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
    const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));
    
    console.log(dateAsFormattedString) // "June 1, 2019"
    
    如图所示,通过将时区设置为“UTC”,它将不会执行本地转换。作为奖励,它还允许您创建更精致的输出。您可以从中阅读有关Intl.DateTimeFormat对象的更多信息

    编辑:

    无需创建新的
    Intl.DateTimeFormat
    对象,即可实现相同的功能。只需将区域设置和日期选项直接传递到
    toLocaleDateString()
    函数中即可

    const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
    const myDate = new Date('2019-06-01T00:00:00.000+00:00');
    today.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"
    
    找到了这个解决方案
    const saveTime = new Date(toUTC(Date.parse("2005-07-08T00:00:00+0000")));
    // SEND TO DB....
    
    // FROM DB...
    const showTime = new Date(fromUTC(saveTime));
    
    const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
    
    const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
    const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));
    
    console.log(dateAsFormattedString) // "June 1, 2019"
    
    const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
    const myDate = new Date('2019-06-01T00:00:00.000+00:00');
    today.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"
    
    const date = new Date("2021-05-24T22:00:18.512Z")
    const userTimezoneOffset = Math.abs(date.getTimezoneOffset() * 60000);
    new Date(date.getTime() - userTimezoneOffset);