Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Определение конца и начала текущей недели (Gapter)
Author Message
Gapter
Участник форума



Joined: 29 Mar 2004
Posts: 49
Карма: 5
   поощрить/наказать


PostPosted: Mon Mar 29, 2004 8:11 pm ()
   Post subject: Определение конца и начала текущей недели
Reply with quote

Функция вычисляет начало и конец текущей недели (отталкивается от даты на сервере). Получаемый параметр $what - для определения возвращаемого результата - начала ("start") или конца ("end") текущей недели. Возвращает timestamp запрашиваемого результата.
Учитывает количество дней в каждом месяце, смену месяцов, смену лет, а также проверяет корректность всех дат, по которым выстраивает временной промежуток.
Code (php): скопировать код в буфер обмена
function define_week_start_and_end($what)
{
        $time_stamp = time (www.php.net/time)();
        $cur_day = getdate (www.php.net/getdate)($time_stamp);
        $month_day = $cur_day['mday'];       
        $month_num = $cur_day['mon'];       
        $year_num = $cur_day['year'];       
        $day_num = $cur_day['wday'];
        if ($day_num!=0)
        {
                $week_start = $month_day-$day_num+1;
        }
        else
        {
                $week_start = $month_day-6;
        }
        $week_end = $week_start+6;
        $week_start_month_num = $month_num;
        $week_end_month_num = $month_num;
        $week_start_year_num = $year_num;
        $week_end_year_num = $year_num;
       
        if ($week_start < 1)
        {
                if ($month_num == 1)
                {
                        $week_start_year_num--;
                        $week_start_month_num = 12;
                }
                else
                {
                        $week_start_month_num--;
                }
                $last_day_in_previous_month = 31;
                while (!checkdate (www.php.net/checkdate) ($week_start_month_num, $last_day_in_previous_month, $week_start_year_num))
                {
                        $last_day_in_previous_month--;
                }
                $week_start += $last_day_in_previous_month;
        }

        $last_day_in_month = 31;
        while (!checkdate (www.php.net/checkdate) ($week_start_month_num, $last_day_in_month, $week_start_year_num))
        {
                $last_day_in_month--;
        }

        if ($week_end > $last_day_in_month)
        {
                if ($month_num == 12)
                {
                        $week_end_year_num++;
                        $week_end_month_num = 1;
                }
                else
                {
                        $week_end_month_num++;
                }
                $week_end = $week_end-$last_day_in_month;
        }

        $week_start_time_stamp = gmmktime (www.php.net/gmmktime) (0, 0, 0, $week_start_month_num, $week_start, $week_start_year_num);
        $week_end_time_stamp = gmmktime (www.php.net/gmmktime) (23, 59, 59$week_end_month_num, $week_end, $week_end_year_num);

        if ($what == "start")
        {
                return $week_start_time_stamp;
        }
        else if ($what == "end")
        {
                return $week_end_time_stamp;
        }
        return NULL;
}
Пример работы:
Code (php): скопировать код в буфер обмена
$week_start_stamp = define_week_start_and_end("start");
$week_end_stamp = define_week_start_and_end("start");
Надеюсь, кому-нибудь пригодится! :)

P.S. Учень удобно и применимо в скриптах новостных лент, блогов, конференций и т.п., где необходимо выводить информацию понедельно!

Last edited by Gapter on Tue Mar 30, 2004 9:22 pm; edited 2 times in total
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Mar 30, 2004 12:14 am (спустя 4 часа 3 минуты)
   Post subject:
Reply with quote

Что-то больно сложно.

Есть такая функция — strftime(). Помимо всего прочего она может возвращать номер текущего дня недели. 0 — воскресенье, 1 — понедельник и т.д. Имея текущий timestamp и этот номер, получить дату начала и конца — тривиальное занятие. Занимает строчки 4 все в сумме.

Кстати, можно воспользоваться и функцией php.net/jddayofweek
Back to top
View user's profile Send private message Send e-mail
Gapter
Участник форума



Joined: 29 Mar 2004
Posts: 49
Карма: 5
   поощрить/наказать


PostPosted: Tue Mar 30, 2004 1:20 am (спустя 1 час 6 минут)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Что-то больно сложно.

Есть такая функция — strftime(). Помимо всего прочего она может возвращать номер текущего дня недели. 0 — воскресенье, 1 — понедельник и т.д. Имея текущий timestamp и этот номер, получить дату начала и конца — тривиальное занятие. Занимает строчки 4 все в сумме.

Кстати, можно воспользоваться и функцией php.net/jddayofweek
Класс! А я парился! :)
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Tue Mar 30, 2004 4:58 pm (спустя 15 часов 38 минут)
   Post subject:
Reply with quote

Gapter:
Согласны, если я перенесу это решение несуществующий проблемы в форум "всё в кучу"? Или пусть остаётся в назидание потомкам?
Back to top
View user's profile Send private message Send e-mail
Gapter
Участник форума



Joined: 29 Mar 2004
Posts: 49
Карма: 5
   поощрить/наказать


PostPosted: Tue Mar 30, 2004 9:10 pm (спустя 4 часа 11 минут)
   Post subject:
Reply with quote

Дмитрий Эсс wrote:
Gapter:
Согласны, если я перенесу это решение несуществующий проблемы в форум "всё в кучу"? Или пусть остаётся в назидание потомкам?
Ну всё таки же готовое решение! :) Плюс, я ещё более подробно описал работу функции и её возможное практическое применение!

Кстати, я нашёл далеко в этом форуме подобную тему с похожей функцией, но выдающей другие результаты другого типа: forum.dklab.ru/php/advises/DatiNachalaIKontsaNedeliVMesyatse.html. Можно, конечно, и туда переместить, но там совсем иной подход и функциональность.

Но я, всё же, полагаюсь на Ваше усмотрение! :)
Back to top
View user's profile Send private message
Дмитрий Эсс
Участник форума



Joined: 06 Jul 2003
Posts: 2533
Карма: 3
   поощрить/наказать

Location: Таллинн, Эстония

PostPosted: Tue Mar 30, 2004 11:36 pm (спустя 2 часа 26 минут)
   Post subject:
Reply with quote

Gapter:
Тогда пусть остаётся.
Back to top
View user's profile Send private message Send e-mail
Hren2
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Dec 04, 2009 1:23 pm (спустя 5 лет 8 месяцев 4 дня 13 часов 46 минут; написано за 59 секунд)
   Post subject:
Reply with quote

Спасибо большое Gapter за твою функцию. Как раз то что нужно. сэкономил кучу времени, буду пользоваться
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Dec 04, 2009 1:50 pm (спустя 26 минут; написано за 37 секунд)
   Post subject:
Reply with quote

Hren2,
вы тему от начала до конца-то прочитайте...

!

У нас на форуме принято общение на "Вы".
forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html
Back to top
View user's profile Send private message Send e-mail
ShaDeRzz
Заглянувший



Joined: 03 Oct 2010
Posts: 1
Карма: 0
   поощрить/наказать

Location: Мариуполь

PostPosted: Sun Oct 03, 2010 3:48 am (спустя 9 месяцев 29 дней 13 часов 58 минут; написано за 1 минуту 57 секунд)
   Post subject:
Reply with quote

Я это делаю немного изящнее:
Code (php): скопировать код в буфер обмена
$current_week_start = date (www.php.net/date)("d.m.Y", strtotime (www.php.net/strtotime)("last Monday"));
$current_week_end = date (www.php.net/date)("d.m.Y", strtotime (www.php.net/strtotime)("Sunday"));
При моих настройках сервака проблем ещё не возникало, хотя быть может в функции топикстартера учтены какие-нибудь потенциальные заморочки с учетом локалей...

И ещё: в функции топикстартера, а точнее в примере её использования, закралась ошибка:

Было:
Code (php): скопировать код в буфер обмена
$week_start_stamp = define_week_start_and_end("start");
$week_end_stamp = define_week_start_and_end("start");
Надо:
Code (php): скопировать код в буфер обмена
$week_start_stamp = define_week_start_and_end("start");
$week_end_stamp = define_week_start_and_end("end");
Back to top
View user's profile Send private message
Ruscon
Заглянувший



Joined: 20 Feb 2009
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Fri Jan 28, 2011 6:46 pm (спустя 3 месяца 25 дней 14 часов 57 минут; написано за 31 секунду)
   Post subject:
Reply with quote

here is the simpliest way to get the start and end date of the week;
date('Y-m-d H:i:s', strtotime(date('Y').'W'.date('W').'1'));
date('Y-m-d H:i:s', strtotime(date('Y').'W'.date('W').'7'));
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML