2015-10-04 3 views
-1

Я создаю календарь, который также отображает однонедельный «вид».Навигация по календарю в PHP (по неделям)

Имея некоторые проблемы с «на прошлой неделе» и «на следующей неделе» нав ...

Вот что я получил:

/* 
    Date to calc the start and end of week. 
    $thisYear, $thisMonth, $thisDay are passed in 
*/ 

$combineDate = $thisYear . "-" . $thisMonth . "-" . $thisDay . " 00:00:00"; 
//$timeString = strtotime($combineDate); (tried with this format, but same result) 

//calculate last week's date 
$lastWeek_year = date('Y',strtotime("$combineDate -1 week")); 
$lastWeek_month = date('n',strtotime("$combineDate -1 week")); 
$lastWeek_day = date('j',strtotime("$combineDate -1 week")); 

//calculate next week's date 
$nextWeek_year = date('Y',strtotime("$combineDate +1 week")); 
$nextWeek_month = date('n',strtotime("$combineDate +1 week")); 
$nextWeek_day = date('j',strtotime("$combineDate +1 week")); 

[links look like this:] 
//last week 
<a href="$currentPage?day=$lastWeek_day&month=$lastWeek_month&year=$lastWeek_year"> 

//next week 
<a href="$currentPage?day=$nextWeek_day&month=$nextWeek_month&year=$nextWeek_year"> 

прекрасно работает за текущий месяц и в следующем месяце, как конец октября (2015) и начало ноября осенью в субботу и воскресенье (соответственно)!

Но он распадается в декабре, потому что первый является вторник (DOH!)

И это ломает при переходе от 2015 до 2016 ..

Я пробовал несколько различных подходов с использованием StrToTime .. .

Кто-нибудь получил чистое решение?

Большое спасибо!

+0

Для уточнения: вышеуказанная функция имеет в ней строку даты (ГГГГ, ММ, ДД). Из этого я создаю недельный календарь. Поэтому мне нужно рассчитать дату (ГГГГ, ММ, ДД) в первый день недели (воскресенье) и дату последнего дня недели (субботу). – dankinship

ответ

-1

Я использовал следующее:

$date = date_create('2000-01-01'); 
date_add($date, date_interval_create_from_date_string('10 days')); 
echo date_format($date, 'Y-m-d'); 
+0

Это не похоже, что все будет хорошо. Мой код выше работает в PHP 5.6 (хотя PHP, кажется, рассматривает понедельник как первый день недели). –

+0

Спасибо, но приведенные выше 3 строки могут использоваться для вывода любой строки даты, которая мне нужна. В основном это ваш ответ (поскольку я использую объект DateTime) ... – dankinship

+0

Вы просто добавляете 10 дней, чтобы 2000-01-01 (суббота) + 10 дней = 2000-01-11. Фактически вы пройдете один понедельник и приземлитесь во вторник. Это похоже на проблему, которую вы описали. –

0

Не знаете, что вы хотите? Дата понедельника как на прошлой неделе, так и на следующей неделе? Воскресенье? У вас есть объект DateTime? Это работает?

$date = new DateTime(NULL); 

$datey = new DateTime(); $date = $date->setDate($thisYear, $thisMonth, $thisDay)->setTime(0, 0); 
$beginLastWeek = $datey->setTimestamp(strtotime("this week", $date->sub(new DateInterval("P1W"))->getTimestamp())) 
    ->sub(new DateInterval('P1D')); 
$datex = new DateTime(); $date = $date->setDate($thisYear, $thisMonth, $thisDay)->setTime(0, 0); 
$beginNextWeek = $datex->setTimestamp(strtotime("this week", $date->add(new DateInterval("P1W"))->getTimestamp())) 
    ->sub(new DateInterval('P1D')); 

list($lastWeek_year, $lastWeek_month, $lastWeek_day) = 
    explode(":", $beginLastWeek->format("Y:m:d")); 
list($nextWeek_year, $nextWeek_month, $nextWeek_day) = 
    explode(":", $beginNextWeek->format("Y:m:d")); 

print "$lastWeek_year-$lastWeek_month-$lastWeek_day\n"; 
print "$nextWeek_year-$nextWeek_month-$nextWeek_day\n"; 

Приведенный выше код должен в теории работы на PHP 5.3 и угощения воскресенье, как в начале недели и данного 2001-01-01 вы получите:

На прошлой неделе дата начала: 2000-12 -24 Следующая дата начала недели: 2001-01-07

+0

PHP-версия 5.3.15 – dankinship

0

Это может быть полезно в этом случае. Он обертывает основной класс PHP DateTime и предоставляет методы, подобные nextDay, previousDay, nextMonth. Таким образом, его очень легко перемещаться по дням, дням, месяцам, годам.

https://packagist.org/packages/ishworkh/navigable-date

Для например.

$daysInAWeek = 7; 

$DateNow = \NavigableDate\NavigableDateFacade::create('2017-02-23'); 

echo 'Current Date --> ' . $DateNow->format('Y-m-d') . PHP_EOL; 

$DateAfterAWeek = $DateNow->daysAfter($daysInAWeek); 
echo 'Date After a week --> ' . $DateAfterAWeek->format('Y-m-d') . PHP_EOL; 

$DateBeforeAWeek = $DateNow->daysAfter(-$daysInAWeek); 
echo 'Date before a week --> ' . $DateBeforeAWeek->format('Y-m-d') . PHP_EOL; 

дает

Current Date --> 2017-02-23 Date After a week --> 2017-03-02 Date before a week --> 2017-02-16

А также,

метод принимает в resetTime логическое значение, которое определяет, будет ли время должно быть установлено в 00:00:00

$PrevDay = $DateAfterAWeek->previousDay(false); 
echo 'Date before a day of next week date --> ' . $PrevDay->format('Y-m-d') . PHP_EOL; 

дает

Date before a day from next week date --> 2017-03-01

Каждый метод возвращает экземпляр NavigableDate. Таким образом, вы можете связать методы с возвратом даты любым из методов. Одна вещь, которую следует отметить, - это методы навигации, сброшенные * параметры, которые по его имени сбрасывают время до 00:00:00 или дней до 1, первого месяца.Для получения дополнительной информации об этом, plz visit, https://packagist.org/packages/ishworkh/navigable-date

+0

Вместо того, чтобы просто вставлять ссылку, если вы могли бы разработать свой ответ с помощью некоторого кода/фрагмента кода, используя упомянутый вами пакет, было бы гораздо более полезным. – kabirbaidhya

Смежные вопросы