Есть ли возможность предопределить функцию date()

scooterok

Новичок
Приветствую!
Для тестов нужно в сценарии предопределить функцию date().

Например сегодня 24 июля 2014 года:
print date("d-m-Y");//24-07-2014

Мне нужно, чтоб print date("d-m-Y"); выводил скажем 27-07-2014

Мне необходимо посмотреть какие данные в определенный день выведет мой сценарий!

Заранее благодарен)
 

scooterok

Новичок
Вы намекаете на mktime?

Мне нужно, чтоб date далее по сценарию выводил ранее заданую дату во всем скрипте!
Т.е. переопределить её!
Это возможно?

Мне для тестов нужно будет весть скрипт лопатить...
А так ее переопределить и отталкиваемся от даты заданной вначале скрипта.
 

scooterok

Новичок
Изначально я делал так:

$date = "";
$first = array("monday", "wednesday", "friday");//первая неделя текущего месяца
$second = array("tuesday", "thursday");//вторая неделя текущего месяца
for($a=0;$a<count($first);$a++){
$date[] = date('Ymd', strtotime('first '.$first[$a].date('F').date("d-m-Y", mktime(0, 0, 0, date('m'), date('d'), date('Y')))));
}
for($b=0;$b<count($second);$b++){
$date[] = date('Ymd', strtotime('second '.$second[$b].date('F').date("d-m-Y", mktime(0, 0, 0, date('m'), date('d'), date('Y')))));
}
sort($date);
Получаем:

Array
(
[0] => 20140728
[1] => 20140730
[2] => 20140801
[3] => 20140805
[4] => 20140807
)

/------------------------------------------------------------------------------/

$date = "";
$first = array("tuesday", "thursday");//первая неделя текущего месяца
$second = array("monday", "wednesday", "friday");//вторая неделя текущего месяца
for($a=0;$a<count($first);$a++){
$date[] = date('Ymd', strtotime('first '.$first[$a].date('F').date("d-m-Y", mktime(0, 0, 0, date('m'), date('d'), date('Y')))));
}
for($b=0;$b<count($second);$b++){
$date[] = date('Ymd', strtotime('second '.$second[$b].date('F').date("d-m-Y", mktime(0, 0, 0, date('m'), date('d'), date('Y')))));
}
sort($date);
Получаем:
Array
(
[0] => 20140729
[1] => 20140731
[2] => 20140804
[3] => 20140806
[4] => 20140808
)

Но здесь не учитывается, а должно, то, что сегодня 25-е, а соответственно должно быть так:
Array
(
[0] => 20140728
[1] => 20140730
[2] => 20140801
[3] => 20140805
[4] => 20140807
)

и

Array
(
[0] => 20140725
[1] => 20140729
[2] => 20140731
[3] => 20140804
[4] => 20140806
)

Допилите пжл код, а то я уже не соображаю)
Спс
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Luge, он хочет, чтобы вызов date не брал текущий таймстамп, если он не передает второй аргумент.
 

Luge

Нестандартное звание
c0dex, про timestamp я понял, я на коде сломался, особенно на «Но здесь не учитывается, а должно, то, что сегодня 25-е»

scooterok, время берётся из системных часов сервера. Смирись.
Можно, конечно, где-нибудь в начале скрипта определить в переменной свою дату и скармливать её всем date(), где нет своего таймстанпа. А когда всё сделаешь — просто назначить $timestamp = time();

Или напиши свою обёртку над date() где будет всё работать как хочется

Или (это мне особенно нравится) переведи системное время, если тебе кто-то это позволит
PHP:
shell_exec("date 0909hhmm1999");
Или я несу пургу и
Для тестов нужно в сценарии предопределить функцию date().
PHP:
class Date
{

    protected $date;

    public function __construct($date = null)
    {
        $this->date = $date ? $date : time();
    }

    public function today()
    {
        // …
    }

}

class DateTest extends PHPUnit_Framework_TestCase
{

    public function testToday()
    {
        $date = new Date(strtotime('2010-10-17 00:00:00'));
        $this->assertEquals($expectedValue, $date->today());
    }

}
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
scooterok, нормально переопределять можно только классы, делай обёртку, как показал Luge
 

scooterok

Новичок
Поправил немного выше код добавив комментарии, чтоб было понятнее...
Есть скажем два исполнителя, которому нужно по графику выполнять работу.
Первый исполнитель в первую неделю месяца работает по пн,ср,пт
В тоже время второй исполнитель работает в первую неделю по вт,чт
Потом они меняются, исполнитель первый по вт,чт, а исполнитель второй по пн,ср, пт соответственно.

В данном коде, что я написал все прекрасно до окончания месяца!!!
Как только подходит к концу месяц, то график работы сбивается и выглядит так:
29-07-2014, 31-07-2014, 01-08-2014, 04-08-2014, 06-08-2014 при его графике:
$first = array("monday", "wednesday", "friday");
$second = array("tuesday", "thursday");

а должно быть так: 28-07-2014, 30-07-2014, 01-08-2014, 05-08-2014, 07-08-2014

=============================================================================

или второй пример:
$first = array("tuesday", "thursday");
$second = array("monday", "wednesday", "friday");

результат: 29-07-2014, 31-07-2014, 01-08-2014, 04-08-2014, 06-08-2014
а должен быть 25-07-2014, 29-07-2014, 31-07-2014, 04-08-2014, 06-08-2014

Это кстати работает только тогда когда в циклах дописать date('d')-1, тогда если сегодня совпадает с array то открывается окно для работы.
Иначе график будет показывать только будущую дату перемещаясь каждый день.
 

scooterok

Новичок
т.е. если не указывать -1 в mktime(0, 0, 0, date('m'), date('d'), date('Y')), то график выводится верно, но проблема в том, что он показывает без сегодняшнего дня так как день начался.
Если писать mktime(0, 0, 0, date('m'), date('d')-1, date('Y')), то всё работает верно пока не наступит конец месяца и в графике с переходом на новый месяц начинаются траблы...
Потом 1 числа месяца оно нормализуется, но в старом месяце график нового уже не верный получается.
Надеюсь понятно пояснил)
 

scooterok

Новичок
В идеале не указывать бы -1, но при этом учитывать, что сегодня может тоже входить скажем так в array!
 

Luge

Нестандартное звание
нифига не понятно, каша какая-то…

по сути один работатет по пн, ср, пт в чётные недели года, а другой в нечётные. (Это я пытаюсь хоть как-то формализовать задачу). Надо вывести для выбранного дня кто работает. Ну, или тупо график составить. Так что ли?
 

scooterok

Новичок
График составить на ближайшие пять дней с пн по пт, сб и вс - выходные.
И если в этом графике сегодняшнее число, открыть возможность человеку работать.

тот кто работает одну неделю пн, ср, пт, а вторую вт, чт график должен быть таким:
28.07 30.07 01.08 05.08 07.08

тот кто работает одну неделю вт, чт, а вторую пн, ср, пт график должен быть таким:
25.07 29.07 31.07 04.08 06.08
 
Последнее редактирование:

Luge

Нестандартное звание
PHP:
$days = array(
        array('Monday', 'Wednesday', 'Friday'),
        array('Tuesday', 'Thursday')
);
варианты работы товарищей

PHP:
$week_number = date('W', strtotime($date));
определить номер недели
PHP:
$is_odd = $week_number%2;
чётный / нечётный
один работает по $days[$is_odd], а другой по $days[!$is_odd]

осталось только решить кто из двоих будет почётным, а кто рыбку ловить
 

scooterok

Новичок
да, это вариант, надо попробовать)
мой тоже был не плох пока не подошел конец месяца)))
спс
 

scooterok

Новичок
Правда нужно от текущей даты делать, чтоб исполнитель знал в каких числах он работает!
Например сегодня пятница, значит график должен начинаться с пятницы: пт, вт, чт, пн, ср
 

hell0w0rd

Продвинутый новичок
Только вот писать свой Date не надо, есть готовый DateTime. Или очень популярный из-за количества статики Carbon
 

scooterok

Новичок
Мне его нужно было бы для проб на сервере.
Чтоб не тянуть на локальный комп и не баловаться часами.

Я нашел решение, чуть переписав скрипт.
Всем спасибо.
 
Сверху