【问题标题】:Get the most recently occurring Sunday获取最近发生的星期日
【发布时间】:2012-10-09 00:41:18
【问题描述】:

我需要在日历视图中显示当前星期,从星期日开始。

在 Javascript 中确定“上周日”的最安全方法是什么?

我是用下面的代码计算的:

Date.prototype.addDays = function(n) {
      return new Date(this.getTime() + (24*60*60*1000)*n);
}

var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var lastSunday = today.addDays(0-today.getDay());

此代码假设每天由二十四小时组成。这是正确的,除非是夏令时交叉日,在这种情况下,这一天可能是二十三或二十五小时。

本周,在澳大利亚悉尼,我们将时钟拨快了一个小时。结果,我的代码将lastSunday 计算为星期六的 23:00。

那么确定上周日最安全、最有效的方法是什么?

【问题讨论】:

标签: javascript date datetime


【解决方案1】:

要安全地精确添加一天,请使用:

d.setDate(d.getDate() + 1);

这是夏令时安全的。要将日期对象设置为上周日:

function setToLastSunday(d) {
  return d.setDate(d.getDate() - d.getDay());
}

或者返回一个新的上周日的 Date 对象:

function getLastSunday(d) {
  var t = new Date(d);
  t.setDate(t.getDate() - t.getDay());
  return t;
}

编辑

原始答案的版本添加时间不正确,确实增加了一天,但不是 OP 想要的。

【讨论】:

  • 如果最后一个星期日是在上个月呢? (例如,这是本月的第一天和星期四) 编辑:日期 API 似乎很乐意接受偏移量。不错
  • Zirak - 日期方法很容易将无效日期值转换为日期对象,例如new Date(2012,1,30) 变为 2012-03-01,new Date(2012,1,0) 变为 2012-01-31。这可能很方便,也可能是新玩家的陷阱。 :-)
  • @Zirak——有趣的是new Date('2012-02-30') 在FF 中返回Invalid Date,但IE 和Chrome 返回2012-03-01 的日期对象。更多不信任 Date 函数来解析字符串的理由(尽管如果字符串被传递给 Date.parse,所有现代浏览器都会正确返回 NaN)。
  • 为什么需要这条线:d.setDate(d.getDate() + 1); 用于夏令时?如果今天是星期六,它将给出下一个星期日而不是过去的星期日。
  • @Shawn — 这只是如何添加“夏令时安全”的一天的示例,例如进入夏令时的一天只有 23 小时,因此前一天 23:30 的日期加上 24 小时将是后天的 00:30,而不是第二天的 23:30。将日期加 1 会返回正确的“明天”,时间为 23:30。
【解决方案2】:

试试这个jsfiddle

它只使用内置的日期方法

var now = new Date();
var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var lastSunday = new Date(today.setDate(today.getDate()-today.getDay()));

【讨论】:

    【解决方案3】:

    使用date-fn 库:previousSunday(date)

    const now = new Date(); // the date to start counting from
    previousSunday(now);
    

    文档:https://date-fns.org/v2.25.0/docs/previousSunday

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多