【问题标题】:First and last day of the week not working (starting from sunday)一周的第一天和最后一天不工作(从星期日开始)
【发布时间】:2018-02-09 23:35:19
【问题描述】:

我有这段代码,我可以在其中获取当前一周的第一天和最后一天(从星期日开始 - 在星期六结束)。本周工作正常直到今天换了月份。

这是我的代码:

// current date 1 Sep 2017
curr = new Date(2017, 8, 1);

console.log(curr.toString());
// Fri Sep 01 2017 00:00:00


// First day of week
var first = curr.getDate() - curr.getDay();

// Last day week
var last = first + 6;

var startDate = new Date(curr.setDate(first));
console.log(startDate.toString());
// Sun Aug 27 2017 00:00:00

var endDate = new Date(curr.setDate(last));
console.log(endDate.toString());
// Wed Aug 02 2017 00:00:00

所以问题是,endDate 应该是 Sat Sep 02 而不是 Wed Aug 02

在月份从 8 月更改为 9 月之前,这一直运行良好。

有什么办法可以解决这个问题?

【问题讨论】:

  • 似乎是正确的。你用的是什么浏览器?
  • @ochi endDate 显示为 Wed Aug 02,而应该是 Sat Sep 02
  • 在实行夏令时的地方,并非所有日子都是 24 小时。使用60 * 60 * 24 * 7 添加一天是不明智的,请参阅Add +1 to current date。此外,您可能应该将时间设置为 00:00:00。
  • 你看到@Will 的答案了吗? - 我看到Thu Aug 31 2017 17:44:31 GMT-0700 (Pacific Daylight Time) Sun Aug 27 2017 17:44:31 GMT-0700 (Pacific Daylight Time) Sat Sep 02 2017 17:44:31 GMT-0700 (Pacific Daylight Time)
  • @ochi 我有Wed Aug 02 2017 04:10:54 GMT+0300 作为endDate。所以只是因为时区不同?

标签: javascript function date time


【解决方案1】:

我明白了。未正确设置结束日期。试试这个。

let curr = new Date();
console.log(curr.toString());

let startDate = new Date(curr.setDate(curr.getDate() - curr.getDay()));
console.log(startDate.toString());

let endDate = new Date(curr.setDate(curr.getDate() + 6));
console.log(endDate.toString());

【讨论】:

  • 8 月 27 日星期日和 8 月 2 日星期三返回。
  • 必须是浏览器。我看到Thu Aug 31 2017 17:44:54 GMT-0700 (PDT)Sun Aug 27 2017 17:44:54 GMT-0700 (PDT)Sat Sep 02 2017 17:44:54 GMT-0700 (PDT)
  • 不是浏览器(我在 Safari、Chrome 和 Firefox 中测试过)。请参阅下面的答案,了解它失败的原因。它对您“有效”,因为初始日期是八月。将初始日期设置为 9 月 1 日(或当前日期和一周开始是不同月份的任何日期),它会失败。
【解决方案2】:

我认为这是重复的,但我现在找不到。您的问题是您调整日期的方式。 Date 方法会修改它们被调用的 Date,因此您正在修改 curr,但将其视为未更改。

// current date
curr = new Date(new Date().getTime() + 60 * 60 * 24 * 7);

这不是增加 1 天的好方法,但不是您的问题。最好先将时间归零,然后在日期上加一。

console.log(curr);
// Fri Sep 01 2017 01:52:15 


// First day of week
var first = curr.getDate() - curr.getDay();

first 设置为 -4(日期为 1,星期五为 5)。

// Last day week
var last = first + 6;

last 设置为 2 (-4 + 6)。

var startDate = new Date(curr.setDate(first));

这会将 curr 修改为 8 月 27 日。然后将其复制以创建分配给 startDate 的新日期(即 currstartDate 具有相同的时间值并表示相同的日期和时间)。

console.log(startDate);
// Sun Aug 27 2017 01:57:25 

是的。现在您将 curr 的日期设置为 2,即 8 月 2 日。

var endDate = new Date(curr.setDate(last));
console.log(endDate);
// Wed Aug 02 2017 01:59:37

是的。作为替代方案,复制原始日期并修改副本以获取 startDate,然后获取另一个副本并将其修改为结束日期。

function getWeekStartEnd(date) {
  // Copy date so don't modify original
  date = date? new Date(+date) : new Date();
  // Set time to 0 and copy date at same time
  var startDate = new Date(date.setHours(0,0,0,0));
  // Set startDate to previous Sunday
  startDate.setDate(startDate.getDate() - startDate.getDay());
  // Set endDate to next Saturday
  var endDate = new Date(+date);
  endDate.setDate(endDate.getDate() + 6 - endDate.getDay());
  return [startDate, endDate];
}

// Current week
getWeekStartEnd().forEach(function(d){
  console.log(d.toString());
});

// For Friday 1 September, 2017
getWeekStartEnd(new Date(2017,8,1)).forEach(function(d){
  console.log(d.toString());
});

// For Sunday 3 September, 2017
getWeekStartEnd(new Date(2017,8,3)).forEach(function(d){
  console.log(d.toString());
});

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2013-11-22
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多