strtotime weekday - странный результат

filipchuk

Новичок
Добрый день
Мне надо к определенной дате добавить добавить нужное количество рабочих дней и получить конечную дату
Делаю вызов функции
PHP:
$date = date('Y-m-d', strtotime('2011-03-27 + 5 weekdays'));
echo $date; //expected 2011-04-01
Полученный результат (2011-04-03, Воскресенье) не совпадает с результатом, подсчитанным вручную (2011-04-01, Пятница). Причем такое поведение не постоянно, зависит от того, от какого дня недели начинать отсчет
В чем тут дело? Помогите разобраться.
 

craz

Нестандартное звание
Добрый день
Мне надо к определенной дате добавить добавить нужное количество рабочих дней и получить конечную дату
Делаю вызов функции
PHP:
$date = date('Y-m-d', strtotime('2011-03-27 + 5 weekdays'));
echo $date; //expected 2011-04-01
Полученный результат (2011-04-03, Воскресенье) не совпадает с результатом, подсчитанным вручную (2011-04-01, Пятница). Причем такое поведение не постоянно, зависит от того, от какого дня недели начинать отсчет
В чем тут дело? Помогите разобраться.
может локаль? это у нас выходные суббота воскресение, а у них по-другому (не буду гуглить как)
 

filipchuk

Новичок
пробывал разные локали ("ru_RU.utf8", "en-US") - результат идентичный
 

Linker

Новичок
filipchuk

а что с выводом предупреждений, какие настройки error reporting level? Предупреждения вообще выводятся?

По умолчанию должно быть что-то вроде того:

Warning: strtotime() [function.strtotime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.

Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.

т.е. либо не выставлено timezone settings (и подставляется по умолчанию) либо выставлено не верно... а предупреждения должны быть.
 

filipchuk

Новичок
уровень вывода - E_ALL
timezone выставлена, таких сообщение соответственно нет...
я думаю, время тут не причем, мы ведь оперируем датами, без указания часов и минут
 

Linker

Новичок
тогда так наверное:
$date = date('Y-m-d', strtotime('2011-03-27 + 5 days'));
echo $date;

в смысле weekdays и days не одно и то же
 

filipchuk

Новичок
мне надо рабочие дни добавлять только
days не учитывает выходные, weekdays в теории должен учитывать, но или я его неверно использую, или он еще "сыроват"...
 

zerkms

TDD infected
Команда форума
А если в число "рабочих" дней попадёт государственный праздник? :)
 

filipchuk

Новичок
я уточнял, пока стоит задача учитывать только суботу и воскресенье :)
но и это пока не выходит, можно конечно свой велосипед написать, но возможно все-таки получится использовать стандартную функцию PHP
 

filipchuk

Новичок
сделал тесты, которые показали, что функция неверно работает, когда начальный день пятница, субота или воскресенье. для остальных дней работает правильно
нашел описание похожего (или даже этого же) бага http://bugs.php.net/bug.php?id=47735
внизу дописано, что "This appears to be fixed in PHP 5.2.11", у меня версия 5.3.2, похоже, что не исправили
 

weregod

unserializer
W2K8 SP2 32bit

PHP:
php --version
PHP 5.2.11 (cli) (built: Sep 16 2009 19:39:46)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
--
date.timezone = "Azia/Novosibirsk"
--
echo date('Y-m-d', strtotime('2011-03-27 + 5 weekdays'));
выдаёт ожидаемое "2011-04-03"

да, гонит
походу где-то первый день недели рулить надо
 

tz-lom

Продвинутый новичок
гм,сейчас тоже наткнулся на такое:
PHP:
echo date('d.m.Y', strtotime('+1 weekday'));       // OK       22.03.2011 

$date = new DateTime();                                                                                               
$date->setTimezone(new DateTimeZone('Europe/Moscow'));                                                                                                                                                                         
$date->modify('+1 weekday');
echo $date->format('d.m.Y');              // FAIL 21.03.2011
причём это только на серваке (PHP 5.2.14 ),на локалке всё работает
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
единственное упоминание "-7 weekdays" - http://www.php.net/manual/en/datetime.formats.relative.php

кхм ... http://ua.php.net/ChangeLog-5.php
Version 5.3.0
support for adding/subtracting weekdays with strtotime() and DateTime::modify().
и куча багфиксов операций с днями недели в разных версиях

это просто какая-то сырая недокументированная фича, которую ТС экспериментально открыл, но рассчитывать на нее совсем не стоит
 

nirex

Новичок
PHP:
<?php
$date = '2011-01-05';
$time = strtotime($date);
$days = 5;
do {
    $time = mktime(date('H', $time),
                   date('i', $time),
                   date('s', $time),
                   date('m', $time),
                   date('d', $time)+1,
                   date('Y', $time));
    if (!in_array(date('N', $time), array(6, 7))) $days --;                   	
}
while($days > 0);

echo date("Y-m-d", $time);
пользуйтесь простыми решениями, зачем искать какие-то сложные ? :)
 

zerkms

TDD infected
Команда форума
nirex
То же самое можно сделать с использованием тривиальной арифметики, совсем без циклов.
 

nirex

Новичок
так напиши тривиальный способ, чего по воде вилами то водить ?
Кстати не забудь учесть в своем способе переход на летнее время ;).
 

zerkms

TDD infected
Команда форума
Омг, школьная математика.

Берём стартовый день недели. Считаем число дней от стартового дня недели до выходных. Запоминаем.
Остаток делим на 7. Целое число от деления - умножаем на 5. Остаток от деления прибавляем.

Вуаля.
 
Сверху