2011-02-02 4 views
4

следующий код.PHP strtotime дает неверную дату на определенные месяцы

strtotime("first saturday", strtotime("+2 month")); 

Правильно ли работает, но с апреля месяца +2 month, октябрь + 8 month и декабре + 10 month дает вторую субботу в этом месяце не первый.

Любые идеи, что вызывает его и как его остановить.

Marvelous

+0

что вы получаете, если u do strtotime («первая суббота», strtotime («1 апреля 2011»)); –

ответ

5
$saturday = strtotime("first saturday", strtotime("+2 month", strtotime(date("01-m-Y")))); 
+0

Замечательный. Просто и эффективно, что я хотел. –

+0

@butterbrot Если 'strtotime (« + 2 месяца », strtotime (дата (« 01-m-Y »)))' суббота, ** вы все равно получите следующее **. –

+0

true, strtotime («первая суббота», strtotime («+ 2 месяца», strtotime (дата («01-m-Y»))) - 1); это будет? – butterbrot

1

Это потому, что "первая суббота" высчитывает от даты, указанной. Если заданная дата уже является субботой, следующая рассчитывается.

Если вам необходимо в первую субботу от конкретного месяца, сделайте следующее:

$stamp = time(); 
$tm = localtime($stamp, TRUE); 

// +1 to account for the offset, +2 for "+2 month" 
$begin = mktime(0, 0, 0, $tm['tm_mon'] + 1 + 2, 1, 1900 + $tm['tm_year']); 

if (6 == $begin['tm_wday']) { 
// we already got the saturday 
    $first_saturday = $stamp; 
} else { 
    $first_saturday = strtotime('first saturday', $begin); 
} 
+0

Так или иначе, остановившись –

0

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

function firstSaturday($month, $year) { 
    if (!is_numeric($month) && !is_numeric($year)) { 
     return -1; 
    } 

    return strtotime('first saturday', mktime(0, 0, 0, $month, 1, $year)); 
} 
Смежные вопросы