用php查找周数日期

时间:2016-04-01 00:55:35

标签: php date

是否有解决方案可以找到特定周数的开始日期和结束日期。例如:

如果我输入$ week = 5,我想得到2016-03-28 - 2016-04-03。我只需要今年。

4 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是strtotimedate

  static void Main(string[] args) {
     Work("Hi!");
  }

  private static void Work(String p1) {
     Work(p1, null, null);
  }

  private static void Work(String p1, String p2) {
     Work(p1, p2, null);
  }

  private static void Work(String p1, String p2, String p3) {         
     if ( String.IsNullOrWhiteSpace(p2) ) p2 = String.Empty;
     if ( String.IsNullOrWhiteSpace(p3) ) p3 = String.Empty;

     Console.WriteLine(String.Concat(p1, p2, p3));         
  }
  

2016年1月1日星期五
  2016年1月3日星期日

作为一些验证功能。如果上周进入下一年,这个版本甚至可以保持一年中的最后一周,就像第一周一样。如果周不在一年内,则返回false:

<?php
$year = 2016;
$week = 1;

$a = strtotime('January 1 ' . $year);
$b = date('N', $a) - 1;
$c = $a;
$a += (7 - $b) * 86400;

if($week > 1) {
    $start = $a + (($week - 2) * 604800);
    $end = $start + ($b ? 518400 : 604800);
}
else {
    $start = $c;
    $end = $a - 86400;
}

echo date('l jS \of F Y', $start);
echo '<br />';
echo date('l jS \of F Y', $end);
  

2016年3月28日星期一
  2016年4月3日星期日

答案 1 :(得分:0)

您可以使用PHP相对日期时间函数(http://php.net/manual/en/datetime.formats.relative.php),如:

//date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();
$date->modify('2016W5'); //First day of week 5 of 2016
$date->modify('2016W5 +6 days'); //Last day of week 5 of 2016

或建立自己的功能:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y') 
{ 
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101')); 
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts); 
    return date($format, $mon_ts); 
} 

$sStartDate = week_start_date($week_number, $year); 
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate))); 

从这里提取:Finding First day of week via php

答案 2 :(得分:0)

您可以使用DateTime执行此操作:

$year = 2016;
$week = 13;

$date = new DateTime();
$date->setISODate($year, $week);

$start = $date->format('Y-m-d');
$end = $date->modify('+6 days')->format('Y-m-d');

echo 'Week start: '. $start , "\n"; // 2016-03-28
echo 'Week end: '. $end , "\n"; // 2016-04-03

答案 3 :(得分:0)

  

如果我输入$ week = 5,我想获得2016-03-28 - 2016-04-03。

所以,我想你想要在星期五和星期五的星期五进行游行。

为了获得这个,我创建了一个简单的函数,需要一个日期字符串(YYYY-MM-DD)和周数。该函数从给定字符串创建DateTime对象,然后在每月的第一天修改它,然后检索日期周的第一天并添加$week -1周。在这一点上,我们有所需周的第一天(星期一)。我们将此日期克隆到$end,然后我们将其添加到6天。

函数返回一个对象,其中$start$end个日期作为属性,获取了由compact()创建的数组:

function monthWeek( $date, $week )
{
    $start = new DateTime( $date );
    $start->modify( 'first day of this month' );
    $start->modify( '-'.($start->format( 'w' )-1).' days' );
    $start->modify( '+'.($week-1).' weeks' );
    $end = clone $start;
    $end->modify( '+6 days' );
    return (object) compact( 'start', 'end' );
}

在3月的休闲日召唤上述功能:

$week = monthWeek( '2016-03-25', 5 );

echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );

我们得到了这个:

Monday, 2016-03-28 => Sunday, 2016-04-03

您也可以使用该功能检索基于年份的周,使用1月的一天作为第一个参数:

$week = monthWeek( '2016-01-25', 14 );

echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );

将输出:

Monday, 2016-03-28 => Sunday, 2016-04-03

phpFiddle demo