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或新日期(年、月、日)。
只需简单地将字符串传递给日期构造函数(不使用原型方法)。
我必须提出
正确解析了日期,只是字符串将其转换为本地时区:
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日期对象是时间戳-它们只包含从纪元开始的毫秒数。日期对象中没有时区信息。这个时间戳表示的日历日期(天、分钟、秒)是一个解释问题(
上面的示例表明,正在正确解析日期——也就是说,它实际上包含了相当于格林威治标准时间"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); |
。
我遇到了同样的问题,然后记起了我正在做的一个遗留项目的一些奇怪之处,以及它们是如何处理这个问题的。当时我不明白,直到我自己遇到这个问题才真正关心。
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'传递,都会将时区设置为零,并忽略用户的时区。这可能是日期类中的一个意外,但它早在一段时间前就存在了,今天也存在。而且它似乎可以跨浏览器工作。你自己试试。
这段代码是在一个全局项目中实现的,在这个项目中,时区非常重要,但是查看日期的人并不关心它被引入的确切时间。
简单解决方案
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:只要不调用
江户十一〔七〕号
第2步。从先前创建的力矩对象中提取
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步。
希望这有帮助。
江户十一〔四〕号
输出时间: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
享受!