【问题标题】:Getting first / last date of the week获取一周的第一个/最后一个日期
【发布时间】:2012-01-22 09:51:24
【问题描述】:

是否可以使用 PHP 的 Relative Date Time format 获取一周的第一个/最后一个日期?

我已经尝试过:

date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();

$date->modify('first day of this week'); // to get the current week's first date
echo $date->format('Y-m-d'); // outputs 2011-12-19

$date->modify('first day of week 50'); // to get the first date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18

$date->modify('last day of this week'); // to get the current week's last date
echo $date->format('Y-m-d'); // outputs 2011-12-17

$date->modify('last day of week 50'); // to get the last date of any week by weeknumber
echo $date->format('Y-m-d'); // outputs 2011-12-18

你可以see 它不会输出正确的日期。

根据the docs,如果我是正确的,这应该是可能的。

我做错了什么吗?

编辑

我需要使用 PHP 的 DateTime 作为遥远未来的日期。

更新

现在变得更加陌生了。我又做了一些测试。

Windows PHP 5.3.3

2011-12-01

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (first day of week 50) at position 13 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 9
2011-12-01
2011-11-30

Warning: DateTime::modify() [datetime.modify]: Failed to parse time string (last day of week 50) at position 12 (w): The timezone could not be found in the database in C:\Users\Gerrie\Desktop\ph\Websites\Charts\www.charts.com\public\index.php on line 15
2011-11-30

Linux 5.3.8

2011-12-01
2011-12-01
2011-11-30
2011-11-30

【问题讨论】:

  • 如果星期天或星期一是一周的第一天,这难道不取决于语言环境吗?
  • @mario:我不知道你告诉我。无论哪种方式,前两个应该输出相同的东西。最后两个恕我直言也是如此。是否从周日/周一开始

标签: php datetime


【解决方案1】:

我非常喜欢使用 Carbon 库,这让这类事情变得非常容易。例如:

use Carbon\Carbon;

$monday = Carbon::now()->startOfWeek()
$sunday = Carbon::now()->endOfWeek()

或者,如果您希望星期天是一周的第一天:

use Carbon\Carbon;

Carbon::setWeekStartsAt(Carbon::SUNDAY);
Carbon::setWeekEndsAt(Carbon::SATURDAY);

$sunday = Carbon::now()->startOfWeek()
$saturday = Carbon::now()->endOfWeek()

【讨论】:

  • 这似乎是唯一有效的日期库。
  • 这就是解决方案
【解决方案2】:

根据文档,格式字符串“第一天”和“最后一天”只允许几个月,而不是几周。见http://www.php.net/manual/en/datetime.formats.relative.php

如果您将 first 和 last day of 与 week 语句结合起来,结果要么会破坏解析器,要么是您没有预料到的结果(通常是一个月的第一天或最后一天,而不是一周)。

您在 Win 和 Linux 之间看到的差异可能只是因为错误报告设置不同。

要获取当前一周的第一天和最后一天,请使用:

$date->modify('this week');
$date->modify('this week +6 days');

要获取第 50 周的第一天和最后一天,请使用:

$date->setISODate(2011, 50);
$date->setISODate(2011, 50, 7);

编辑:

如果你想对绝对周数使用修改方法,你必须使用http://www.php.net/manual/en/datetime.formats.compound.php中定义的格式:

$date->modify('2011W50');
$date->modify('2011W50 +6 days');

【讨论】:

  • 你可能是对的。虽然我没有看到它在哪里声明它只能使用几个月(可能只是我需要一些睡眠:))。 BTW 错误报告在两台机器上是相同的。所以你说的是只能获取当前(也可能是下一个,上一个等)周的第一个/最后一个日期,而不是按周数? (我知道我可以自己计算,只是觉得这样会更整洁)
  • 文档说:'first day' 'of'?设置当月的第一天。这个短语最好与它后面的月份名称一起使用。
  • 是的,您还可以使用 modify() 方法获取绝对周数。请参阅上面的编辑。
  • 现在好极了。只有最后一件事。如果我使用2011W50,它不会得到当前周日期(现在是 ISO 第 50 周)。当我使用2011W48 时,我得到了正确的日期。有什么想法吗?
  • setISODate 虽然对我有用。可能想要查看修改或完全删除它以帮助其他用户找到此问题。还是应该正常工作?
【解决方案3】:

如果一周的第一天是星期一

$date->modify('Monday this week');

如果第一天是星期日,则其他情况

$date->modify('Sunday this week');

因为在不同的国家/地区,一周的第一天可能是星期一或星期日

【讨论】:

  • 这是错误的。因为在将星期日作为一周第一天的国家/地区,“本周星期日”将是下周的第一天
【解决方案4】:

这是我用来从任何日期获取一周的第一天和最后一天的方法。 在这种情况下,星期一是一周的第一天...

$date = date('Y-m-d'); // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');

【讨论】:

    【解决方案5】:
    function getweek_first_last_date($date)
    {
        $cur_date = strtotime($date); // Change to whatever date you need
        // Get the day of the week: Sunday = 0 to Saturday = 6
        $dotw = date('w', $cur_date);
        if($dotw>1)
        {
            $pre_monday  =  $cur_date-(($dotw-1)*24*60*60);
            $next_sunday = $cur_date+((7-$dotw)*24*60*60);
        }
        else if($dotw==1)
        {
            $pre_monday  = $cur_date;
            $next_sunday =  $cur_date+((7-$dotw)*24*60*60);
        }
        else if($dotw==0)
        {
            $pre_monday  =$cur_date -(6*24*60*60);;
            $next_sunday = $cur_date;
        }
    
        $date_array =   array();
        $date_array['start_date_of_week'] = $pre_monday;
        $date_array['end_date_of_week'] = $next_sunday;
    
        return $date_array;
    }
    
    $date = '2013-12-22';
    getweek_first_last_date($date);
    
    
    Output :
    $array_of_week = Array
    (
        [start_date_of_week] => 1387152000
        [end_date_of_week] => 1387670400
    )
    
    $start_date =date('d/m/Y', $array_of_week['start_date_of_week'])
    

    【讨论】:

      【解决方案6】:
      <code>
      function getlastweek_first_last_date()
      {
         $cur_date = strtotime(date('Y-m-d')); // Change to whatever date you need
          // Get the day of the week: Sunday = 0 to Saturday = 6
          $previousweekcurdate  = $cur_date - (7*24*3600);
          $cur_date = $previousweekcurdate;
          $dotw = date('w', $cur_date);
          if($dotw>1)
          {
              $pre_sunday  =  $cur_date-(($dotw-1)*24*60*60) - (24*60*60);
              $next_satday = $cur_date+((7-$dotw)*24*60*60)- (24*60*60);
          }
          else if($dotw==1)
          {
              $pre_sunday  = $cur_date- (24*60*60);
              $next_satday =  $cur_date+((7-$dotw)*24*60*60)- (24*60*60);
          }
          else if($dotw==0)
          {
              $pre_sunday  =$cur_date -(6*24*60*60)- (24*60*60);
              $next_satday = $cur_date- (24*60*60);
          }
      
          $pre_sunday = date('Y-m-d',$pre_sunday)." 00:00:00";
          $next_satday = date('Y-m-d',$next_satday)." 23:59:59";
          $date_array =   array();
          $date_array['sdoflw'] = $pre_sunday;
          $date_array['edoflw'] = $next_satday;
      
          return $date_array;
      }
      
      $date_array = getlastweek_first_last_date();
      echo $start_date_of_week = $date_array['sdoflw'];
      echo $end_date_of_week = $date_array['edoflw'];
      
      </code> 
      

      【讨论】:

        【解决方案7】:

        只需按如下方式获取日期

        一周的第一天是星期一

        date('Y-m-d',strtotime('Monday this week'));
        

        如果第一天是星期日

        date('Y-m-d',strtotime('Sunday this week'));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-23
          • 2014-12-14
          • 2010-12-12
          相关资源
          最近更新 更多