【问题标题】:How do I stop javascript from altering my dates?如何阻止 javascript 更改我的日期?
【发布时间】:2017-02-22 04:55:35
【问题描述】:

我正在制作一个工作日计算器,它需要一个日期和一个偏移量并返回一个日期。因此,如果您在 2017 年 2 月 27 日星期一通过它并想知道它在 2017 年 2 月 23 日星期四返回之前 2 个工作日的日期。它还考虑了假期,所以如果在前面的示例中,2017 年 2 月 23 日是假期将于 2017 年 2 月 22 日返回。

我在 SQL Server 中的日期字段中有一个假日列表,格式为 yyyy-mm-dd。问题在于,当它们转换为 javascript Date 对象时,它会附加一个时区偏移量,如果是东部标准时间,则会从日期减去 5 小时,将其回滚到前一天。

new Date('2017-02-20');

变成

Sun Feb 19 2017 19:00:00 GMT-0500 (Eastern Standard Time)

Sun Feb 19 2017 20:00:00 GMT-0400 (Eastern Daylight Time)

它似乎在标准时间和日光时间之间随机来回切换。

无论用户住在哪里,如何防止 javascript 弄乱我的日期?我只关心日期,而不是时间。

【问题讨论】:

  • 使用momentjs.com,再也不用担心糟糕的日期对象了。
  • JavaScript 没有“搞砸”这里的任何东西;它正在转换 you 传递它的日期。您需要在存储时间之前本地化时间。
  • @lux 时间在这种情况下毫无意义。在这种情况下,我希望它将天视为时间的基本单位。所以 2 月 20 日就是 2 月 20 日,无论你住在宇宙的哪个角落。
  • @Waxi 我以前用过momentjs,但我不清楚它如何帮助我摆脱日期的时间部分。
  • 如果您希望他们都使用相同的时间,那么您只需自己传递时间,让他们都在午夜。 new Date('2017-02-21 00:00:00')

标签: javascript date


【解决方案1】:

不建议使用 Date 构造函数(或 Date.parse)解析字符串,因为它很大程度上取决于实现。在最近的浏览器中,ISO 8601 格式的日期被解析为 UTC,因此它们被主机时区偏移量偏移。较旧的浏览器根本不会解析 ISO 8601 格式的日期,有些会将它们解析为本地的。

解析日期需要两行函数,验证需要多行:

/* Parse an ISO 8601 format date string as local
** @param {string} s - date informat yyyy-mm-dd
** @returns {Date}
*/
function parseLocal(s) {
  var b = s.split(/\D/);
  var d = new Date(b[0], --b[1], b[2]);
  return d && d.getMonth() == b[1]? d : new Date(NaN);
}

console.log(parseLocal('2017-02-25').toString()); // 25 Feb 2017
console.log(parseLocal('2017-02-30').toString()); // Invalid date

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多