我正在尝试使用星期日作为开始日期以及参考日期(例如$date
)来获取星期范围,但我似乎无法弄明白。
例如,如果我有2009-05-01的$ date,我会得到2009-04-26和2009-05-02。 2009-05-10将产生2009-05-10和2009-05-16。我当前的代码看起来像这样(我不记得我从哪里取出它,因为我忘记在我的评论中记下网址):
function x_week_range(&$start_date, &$end_date, $date)
{
$start_date = '';
$end_date = '';
$week = date('W', strtotime($date));
$week = $week;
$start_date = $date;
$i = 0;
while(date('W', strtotime("-$i day")) >= $week) {
$start_date = date('Y-m-d', strtotime("-$i day"));
$i++;
}
list($yr, $mo, $da) = explode('-', $start_date);
$end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr));
}
我意识到所做的一切都是在当前日期增加了7天。你会怎么做?
答案 0 :(得分:83)
我会利用PHP的strtotime非常棒的优势:
function x_week_range(&$start_date, &$end_date, $date) {
$ts = strtotime($date);
$start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
$start_date = date('Y-m-d', $start);
$end_date = date('Y-m-d', strtotime('next saturday', $start));
}
根据您提供的数据进行测试并且有效。不过,我并不特别喜欢你所参考的整个参考资料。如果这是我的功能,我会这样:
function x_week_range($date) {
$ts = strtotime($date);
$start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
return array(date('Y-m-d', $start),
date('Y-m-d', strtotime('next saturday', $start)));
}
并称之为:
list($start_date, $end_date) = x_week_range('2009-05-10');
我不喜欢这样的事情做数学。日期很棘手,我更愿意让PHP弄明白。
答案 1 :(得分:20)
对于仍然使用mktime(),strtotime()和其他PHP函数的所有人......尝试PHP5 DateTime类。起初我很犹豫,但它真的很容易使用。不要忘记使用clone()来复制对象。
编辑:最近编辑了此代码以处理当天是星期日的情况。在这种情况下,我们必须得到过去的星期六,然后再添加一天来获得星期天。
$dt_min = new DateTime("last saturday"); // Edit
$dt_min->modify('+1 day'); // Edit
$dt_max = clone($dt_min);
$dt_max->modify('+6 days');
然后根据需要进行格式化。
echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')';
确保在代码中尽早设置时区。
date_default_timezone_set('America/New_York');
答案 2 :(得分:9)
显然'w'格式化date()格式或DateTime对象的格式方法会将星期几作为数字返回(默认情况下,0 =星期日,1 =星期一等)
您可以将此值减去当天的天数,以便找到一周的开头。
$start_date = new DateTime("2009-05-13");
$day_of_week = $start_date->format("w");
$start_date->modify("-$day_of_week day");
$ start_date现在将等于该周的星期日,从那里你可以添加7天来结束一周或者你有什么。
答案 3 :(得分:4)
基于@jjwdesign的答案,我开发了一个函数,可以使用DateTime类计算特定日期的一周的开始和结束。 将在PHP 5.3.0 ++上运行
区别在于您可以将您想要的日期设置为0(星期一)和6(星期日)之间的“开始”。
这是功能:
if(function_exists('grk_Week_Range') === FALSE){
function grk_Week_Range($DateString, $FirstDay=6){
# Valeur par défaut si vide
if(empty($DateString) === TRUE){
$DateString = date('Y-m-d');
}
# On va aller chercher le premier jour de la semaine qu'on veut
$Days = array(
0 => 'monday',
1 => 'tuesday',
2 => 'wednesday',
3 => 'thursday',
4 => 'friday',
5 => 'saturday',
6 => 'sunday'
);
# On va définir pour de bon le premier jour de la semaine
$DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString);
$DT_Max = clone($DT_Min);
# On renvoie les données
return array(
$DT_Min->format('Y-m-d'),
$DT_Max->modify('+6 days')->format('Y-m-d')
);
}
}
结果:
print_r(grk_Week_Range('2013-08-11 16:45:32', 0));
print_r(grk_Week_Range('2013-08-11 16:45:32', 1));
print_r(grk_Week_Range('2013-08-11 16:45:32', 2));
print_r(grk_Week_Range('2013-08-11 16:45:32', 3));
print_r(grk_Week_Range('2013-08-11 16:45:32', 4));
print_r(grk_Week_Range('2013-08-11 16:45:32', 5));
print_r(grk_Week_Range('2013-08-11 16:45:32', 6));
Array
(
[0] => 2013-07-29
[1] => 2013-08-04
)
Array
(
[0] => 2013-07-30
[1] => 2013-08-05
)
Array
(
[0] => 2013-07-31
[1] => 2013-08-06
)
Array
(
[0] => 2013-07-25
[1] => 2013-07-31
)
Array
(
[0] => 2013-07-26
[1] => 2013-08-01
)
Array
(
[0] => 2013-07-27
[1] => 2013-08-02
)
Array
(
[0] => 2013-07-28
[1] => 2013-08-03
)
答案 4 :(得分:3)
答案 5 :(得分:2)
这是我的版本,它使用了与Clay相似的概念:
/**
* Start of the week
*
* 0 = Sun, 1 = Mon, etc.
*/
define( 'WEEK_START', 0 );
/**
* Determine the start and end dates for
* the week in which the specified date
* falls
*
* @param $date Date in week
* @param $start Week start (out)
* @param $end Week end (out)
*/
function week_bounds( $date, &$start, &$end ) {
$date = strtotime( $date );
// Find the start of the week, working backwards
$start = $date;
while( date( 'w', $start ) > WEEK_START ) {
$start -= 86400; // One day
}
// End of the week is simply 6 days from the start
$end = date( 'Y-m-d', $start + ( 6 * 86400 ) );
$start = date( 'Y-m-d', $start );
}
轻微测试。代码可能不是防弹的,或处理远期或未来的日期。使用风险由您自己承担。不要将代码浸入水中。不要将代码展示给那些神经质的人,或者是对美元符号的仇恨。未经动物试验。可供素食者使用。作者保证代码永远不会与您交谈。如果代码确实试图让您参与对话,作者会建议您忽略它给出的任何建议。
答案 6 :(得分:1)
在试图找到Paolo Bergantino接受的答案的更简化版本时,我发现了一种非常好的方法来完成这项工作:
function x_week_range2($date) {
$ts = strtotime($date);
$start = strtotime('sunday this week -1 week', $ts);
$end = strtotime('sunday this week', $ts);
return array(date('Y-m-d', $start), date('Y-m-d', $end));
}
本周的“星期日”字符串总是意味着“本周的结束的星期日”。如果在星期日的时间戳上使用,则为下一个星期日。这使您可以避免在Paola的解决方案中使用三元运算符。
答案 7 :(得分:1)
使用它来获取任何给定日期的“周”数字。
//October 29, 2009 is my birthday
echo $week date('W', strtotime('2009-10-29'));
//OUTPUT: 44
//October 29 is the 44th week in the year 2009
现在将getWeekDates函数的参数传递为“year(2009)”和“$ week”。
function getWeekDates($year, $week, $start=true){
$from = date("Y-m-d", strtotime("{$year}-W{$week}-1")); //Returns the date of monday in week
$to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); //Returns the date of sunday in week
if($start) {
return $from;
} else {
return $to;
}
//return "Week {$week} in {$year} is from {$from} to {$to}.";
}
更多信息请参阅此链接 http://blog.ekini.net/2009/07/09/php-get-start-and-end-dates-of-a-week-from-datew/
答案 8 :(得分:1)
您现在可以使用DateTime获取周的开始/结束日期
function getDateRangeForAllWeeks($start, $end){
$fweek = getDateRangeForWeek($start);
$lweek = getDateRangeForWeek($end);
$week_dates = [];
while($fweek['sunday']!=$lweek['sunday']){
$week_dates [] = $fweek;
$date = new DateTime($fweek['sunday']);
$date->modify('next day');
$fweek = getDateRangeForWeek($date->format("Y-m-d"));
}
$week_dates [] = $lweek;
return $week_dates;
}
function getDateRangeForWeek($date){
$dateTime = new DateTime($date);
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');
return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")];
}
<强>用法强>
print_r( getDateRangeForWeek("2016-05-07") );
print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") );
答案 9 :(得分:0)
说实话,我无法理解您发布的代码;)
我想这样的事情可以解决问题:
function get_week($date) {
$start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60;
$end = $start + 6 * 24 * 60 * 60;
return array('start' => strftime('%Y-%m-%d', $start),
'end' => strftime('%Y-%m-%d', $end));
}
答案 10 :(得分:0)
如果不进行如此多的字符串操作,您可以对时间戳进行一些简单的数学运算。
function getDateRange(&$start, &$end, $date) {
$seconds_in_day = 86400;
$day_of_week = date("w", $date);
$start = $date - ($day_of_week * $seconds_in_day);
$end = $date + ((6 - $day_of_week) * $seconds_in_day);
}
答案 11 :(得分:0)
根据DavidBélanger的版本(不幸的是,我的代表不允许我发表评论作为对他的帖子的反应......)。
当输入日期是星期一并且星期的第一天被设置为星期一时,原始版本返回前一周,而不是当前。 这是一个小修复(其余的原始函数):
if(function_exists('grk_Week_Range') === FALSE){
function grk_Week_Range($DateString, $FirstDay=6){
if(empty($DateString) === TRUE){
$DateString = date('Y-m-d');
}
# fix
$dayOfWeek = date('N', strtotime($DateString));
if ($dayOfWeek == ($FirstDay +1)) { $whichWeek = 'this '; }
else { $whichWeek = 'last '; }
$Days = array(
0 => 'monday',
1 => 'tuesday',
2 => 'wednesday',
3 => 'thursday',
4 => 'friday',
5 => 'saturday',
6 => 'sunday'
);
# fix
$DT_Min = new DateTime( $whichWeek.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString);
$DT_Max = clone($DT_Min);
return array(
$DT_Min->format('Y-m-d'),
$DT_Max->modify('+6 days')->format('Y-m-d')
);
}
}
答案 12 :(得分:0)
一个简单的代码,用于返回从DateTime开始到DateTime结束之间的日期。使用gmdate()方法,您可以格式化日期/时间。
for lineSubview in pickerView.subviews {
if lineSubview.frame.height < 1 {
lineSubview.backgroundColor = UIColor.white.withAlphaComponent(0.15)
}
}
答案 13 :(得分:0)
我注意到这里的大多数答案都使用strtotime/DateTime
。虽然正确,但我个人宁愿不用英文单词也可以计算日期。
这是一个使用mtkime
的简单解决方案:
$now = time();
$day_of_week = (int)date('w', $now);
$week_start = mktime(0, 0, 0, date('n', $now), date('j', $now)-$day_of_week, date('Y', $now));
$week_end = mktime(23, 59, 59, date('n', $week_start), date('j', $week_start)+6, date('Y', $week_start));
答案 14 :(得分:0)
function weekRange($year, $week){
$dateFrom = new \DateTime();
$dateFrom->setISODate($year, $week);
$dateTo = new \DateTime();
$dateTo->setISODate($year, $week, 7);
return array(
'week' => $dateFrom->format('Y-W'),
'start'=> $dateFrom->format('Y-m-d'),
'end' => $dateTo->format('Y-m-d')
);
}
示例:
$weekInformation = weekRange(2020, 38);
echo $weekInformation['start'];
// Display: 2020-09-14
echo $weekInformation['end'];
// Display: 2020-09-20
答案 15 :(得分:-1)
<?php
$date = new DateTime();
$date->setISODate(2008, 2);
$startDay = $date->format('Y-m-d');
$date->setISODate(2008, 2, 7);
$endDay = $date->format('Y-m-d');
?>