【问题标题】:PHP - get first day of a given week number when week starts on day other than MondayPHP - 当一周从星期一以外的一天开始时,获取给定周数的第一天
【发布时间】:2014-01-07 23:50:46
【问题描述】:

在我的 PHP 应用程序中,我有三个变量:

代码:

$year = 2014
$weeknumber = 1
$weekstarts = 6 //Week starts on Saturday. 1=Monday... 6=Saturday and 7=Sunday

通过这三个参数,我想知道一周的第一天是哪一天。在这种情况下,2014 年的第 1 周(从星期六开始)是 12 月 28 日。 2014-01-04。

对于从星期一开始的几周,我可以很容易地解决这个问题:

代码:

$first_day_of_week = strtotime( $year . "W" . "0".$weeknumber)

但它在星期一以外的日子开始的几周内不起作用。

【问题讨论】:

  • 很难说出你在问什么。您是否想找出给定日期的上一个星期六是什么?
  • 我们是在谈论实际的周数,还是只是“从我的开始日期算起的今年的第一周是第 1 周”?
  • @davethegr8 你能提供你的想法的实现吗?
  • @Wrikken 实际周数
  • 所以,第 1 周的星期六是 2014-01-04.. 这让我们想到一个问题:如果我们改变它的开始日期:我们应该向前 , backward, 还是一些自定义规则?

标签: php calendar strtotime dayofweek week-number


【解决方案1】:

使用DateTime::setISODate,其中第三个参数是星期几:

$dt = new DateTime;
echo $dt->setISODate(2014, 1, 0)->format('Y-m-d'), "\n"; # 0 = Sunday
echo $dt->setISODate(2014, 1, 1)->format('Y-m-d'), "\n"; # 1 = Monday
echo $dt->setISODate(2014, 1, 6)->format('Y-m-d'), "\n"; # 6 = Saturday

demo demo #2


您的示例不起作用,因为您使用的格式为yyyyWweek,默认为星期一。 Read about ISO-8601 formats,你会看到有yyyy-Wweek-day的格式,你可以这样使用:

$format = sprintf("%d-W%02d-%d", $year, $weeknumber, $weekstarts == 7 ? 0 : $weekstarts);
$first_day_of_week = strtotime($format);
echo "$format returned $first_day_of_week\n";

demo

【讨论】:

  • 感谢您提及该功能。但是,我在 Google 日历中看到,从星期六开始的 2014 年第一周的第一天是 2013 年 12 月 28 日星期六,而不是 1 月 4 日星期六。
  • @user2070775:2014 年的第一个 ISO 周从 2013 年 12 月 30 日开始。你说的是 2013 年的最后一周,从星期六开始,它从 2013 年 12 月 28 日开始。如果您希望从当前/选定的一周中获得上一周,您需要做的就是将周数减去 1。就像我说的,您应该首先阅读 ISO-8601 代表什么,然后查看您的应用程序需要什么。
  • 适用于 Android 4.3 的 Google 日历应用显示 2014 年的第一周,即周六开始的一周,是 2013 年 12 月 28 日。也许他们没有遵循 ISO 标准
猜你喜欢
  • 2018-07-25
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2012-11-22
  • 2016-11-29
  • 2018-02-09
相关资源
最近更新 更多