Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Опять работа с датой


Автор: finogeev 1.12.2009, 14:55
Тормознулся на одной задачи ... Описываю
Человек попадает на страницу выводящую текущую неделю (пн - вс) ...

Вопрос вот в чем как узнать какое число стоит в начале текущей недели ...
Т.е. если неделя 48-я, то какое число будет в понедельник .... грубо говоря вот так ...

с помощью strtotime просто измучился ... мудрить ...

Может есть выход попроще ?

Автор: bars80080 1.12.2009, 15:11
Код

$time = time();// - 2*86400;
echo '<br />сегодня: '.date('j F Y', $time);

$w = date('w', $time);
$p = $w - 1;
if($p < 0) $p += 7;

$ptime = $time - $p*86400;

echo '<br />последний понедельник: '.date('j F Y', $ptime);

Автор: finogeev 1.12.2009, 15:22
Огромное спасибо!!!!

Автор: Pitlord 1.12.2009, 16:13
bars80080, не во всех сутках 86400 секунд.

P.S.
Код

<?php
echo date('d.m.Y', strtotime('last Monday'));
?>

Автор: bars80080 1.12.2009, 18:10
Цитата(Pitlord @  1.12.2009,  15:13 Найти цитируемый пост)
не во всех сутках 86400 секунд

да? а в каких и сколько?

Автор: skyboy 1.12.2009, 18:13
Цитата(bars80080 @  1.12.2009,  17:10 Найти цитируемый пост)
да? а в каких и сколько? 

мне коллега подсказал, что в днях, когда происходит перевод часов на зимнее/летнее время, сутки на час меняют свою продолжительность. календарные сутки они такие, да.

Автор: bars80080 1.12.2009, 18:19
хм, мне казалось timestamp - универсальный. то есть если был момент 1234567890, то даже если произойдёт перевод стрелок назад, то 1234567890 уже не выпадет. а вот date() считает исходя из сдвига поясного и летней поправки

или я ошибаюсь?

Автор: Pitlord 1.12.2009, 18:28
bars80080, 
Код

<?php

date_default_timezone_set('Europe/Moscow');

$t = 1256421600;

if( date('Y-m-d H:i:s', $t) == date('Y-m-d H:i:s', $t + 3600) )
{
    echo '?!';
}

?>


Добавлено через 3 минуты и 26 секунд
Соответственно, твой скрипт должен показать неправильный результат при $time = mktime(23, 0, 0, 10, 25, 2009), например

Автор: bars80080 1.12.2009, 19:00
мда,
тогда правильным должно быть:

Код

$time = mktime(23, 0, 0, 10, 25, 2009);
echo '<br />сегодня: '.date('j F Y', $time);
$w = date('w', $time);
$p = $w - 1;
if($p < 0) $p += 7;

$ptime = $time - $p*86400;
$ptime -= date('I', $ptime)*3600;
echo '<br />последний понедельник: '.date('j F Y', $ptime);


Автор: Pitlord 1.12.2009, 19:14
bars80080, проверь свой вариант с $time = mktime(0, 0, 0, 3, 31, 2009):

Код

<?php

date_default_timezone_set('Europe/Moscow');

$time = mktime(0, 0, 0, 3, 31, 2009);

# Твой вариант

echo '<br />сегодня: '.date('j F Y H:i:s', $time);
$w = date('w', $time);
$p = $w - 1;
if($p < 0) $p += 7;
$ptime = $time - $p*86400;
$ptime -= date('I', $ptime)*3600;
echo '<br />последний понедельник: '.date('j F Y H:i:s', $ptime), '<br />';


# Через strtotime()
echo date('j F Y H:i:s',  date('w', $time) == 1 ? $time : strtotime('last Monday', $time)), '<br />';

?>

Автор: bars80080 1.12.2009, 20:07
ну, намудрить чего-нибудь можно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)