没有时区javascript的解析日期

Parse date without timezone javascript

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

1
new Date(Date.parse("2005-07-08T00:00:00+0000"));

返回2005年7月8日星期五02:00:00 GMT+0200(中欧夏令时)

1
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

返回相同的结果

1
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

返回相同的结果

我想分析时间:

  • 没有时区。

  • 不调用constructor date.utc或新日期(年、月、日)。

  • 只需简单地将字符串传递给日期构造函数(不使用原型方法)。

  • 我必须提出Date的目标,而不是String的目标。


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

    1
    2
    3
    4
    > new Date(Date.parse("2005-07-08T11:22:33+0000"))
    Fri Jul 08 2005 13:22:33 GMT+0200 (CEST)
    > new Date(Date.parse("2005-07-08T11:22:33+0000")).toUTCString()
    "Fri, 08 Jul 2005 11:22:33 GMT"

    Javascript日期对象是时间戳-它们只包含从纪元开始的毫秒数。日期对象中没有时区信息。这个时间戳表示的日历日期(天、分钟、秒)是一个解释问题(to...String方法之一)。

    上面的示例表明,正在正确解析日期——也就是说,它实际上包含了相当于格林威治标准时间"2005-07-08t11:22:33"的毫秒数。


    我也有同样的问题。我得到一个字符串形式的日期,例如:"2016-08-25t00:00:00",但我需要有时间正确的日期对象。要将字符串转换为对象,我使用GetTimeZoneOffset:

    1
    2
    3
    var date = new Date('2016-08-25T00:00:00')
    var userTimezoneOffset = date.getTimezoneOffset() * 60000;
    new Date(date.getTime() - userTimezoneOffset);

    getTimezoneOffset()将返回乙醚负值或正值。在世界上的每一个地方都必须减去这个值。


    我遇到了同样的问题,然后记起了我正在做的一个遗留项目的一些奇怪之处,以及它们是如何处理这个问题的。当时我不明白,直到我自己遇到这个问题才真正关心。

    1
    2
    3
    4
    5
    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对象本身无论如何都将包含时区,返回的结果是以默认方式将其转换为字符串的效果。即,如果没有时区,则无法创建日期对象。但是你可以通过创建自己的对象来模仿Date对象的行为。不过,最好将它移交给像moment.js这样的库。


    简单解决方案

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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);

    只是一个普通的注释。一种保持灵活性的方法。

    https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_对象/date

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    let epoch = new Date() // Or any unix timestamp

    let za = new Date(epoch),
        zaR = za.getUTCFullYear(),
        zaMth = za.getUTCMonth(),
        zaDs = za.getUTCDate(),
        zaTm = za.toTimeString().substr(0,5);

    console.log(zaR +"-" + zaMth +"-" + zaDs, zaTm)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Date.prototype.getDate()
        Returns the day of the month (1-31) for the specified date according to local time.
    Date.prototype.getDay()
        Returns the day of the week (0-6) for the specified date according to local time.
    Date.prototype.getFullYear()
        Returns the year (4 digits for 4-digit years) of the specified date according to local time.
    Date.prototype.getHours()
        Returns the hour (0-23) in the specified date according to local time.
    Date.prototype.getMilliseconds()
        Returns the milliseconds (0-999) in the specified date according to local time.
    Date.prototype.getMinutes()
        Returns the minutes (0-59) in the specified date according to local time.
    Date.prototype.getMonth()
        Returns the month (0-11) in the specified date according to local time.
    Date.prototype.getSeconds()
        Returns the seconds (0-59) in the specified date according to local time.
    Date.prototype.getTime()
        Returns the numeric value of the specified date as the number of milliseconds since January 1, 1970, 00:00:00 UTC (negative for prior times).
    Date.prototype.getTimezoneOffset()
        Returns the time-zone offset in minutes for the current locale.
    Date.prototype.getUTCDate()
        Returns the day (date) of the month (1-31) in the specified date according to universal time.
    Date.prototype.getUTCDay()
        Returns the day of the week (0-6) in the specified date according to universal time.
    Date.prototype.getUTCFullYear()
        Returns the year (4 digits for 4-digit years) in the specified date according to universal time.
    Date.prototype.getUTCHours()
        Returns the hours (0-23) in the specified date according to universal time.
    Date.prototype.getUTCMilliseconds()
        Returns the milliseconds (0-999) in the specified date according to universal time.
    Date.prototype.getUTCMinutes()
        Returns the minutes (0-59) in the specified date according to universal time.
    Date.prototype.getUTCMonth()
        Returns the month (0-11) in the specified date according to universal time.
    Date.prototype.getUTCSeconds()
        Returns the seconds (0-59) in the specified date according to universal time.
    Date.prototype.getYear()
        Returns the year (usually 2-3 digits) in the specified date according to local time. Use getFullYear() instead.


    这就是我为这个对我有用的问题提出的解决方案。

    使用的库:带有普通javascript日期类的momentjs。

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

    江户十一〔七〕号

    第2步。从先前创建的力矩对象中提取hoursminutes值:

    1
    2
      const hours = dateMoment.hours();
      const mins = dateMoment.minutes();

    第3步。将时间转换为日期(PS:这将根据浏览器/计算机的时区更改原始日期,但不要担心并阅读步骤4):

    1
      const dateObj = dateMoment.toDate();

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

    1
    2
      dateObj.setHours(hours);
      dateObj.setMinutes(mins);

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

    希望这有帮助。


    江户十一〔四〕号

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

    埃多克斯1〔5〕

    输出时间:2005年7月8日星期五04:22:33

    注意:返回的时间将取决于您的本地时区。


    日期解析存在一些固有的问题,不幸的是,在默认情况下,这些问题没有得到很好的解决。

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

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

    1
    2
    >parse(whateverDateTimeString,expectedDatePattern,timezone)
    "unix time in milliseconds"

    我找过这个,但没有找到类似的东西!

    所以我创造了:https://github.com/zsoltszabo/timestamp-grabber

    享受!