2010-12-05 4 views
10

Я пытаюсь выяснить первую среду месяца, используя strtotime, но аргумент «первая среда» терпит неудачу, когда первая среда выпадает на 1-й.Получение первого дня недели в месяц с strtotime

Для более общей иллюстрации этой проблемы см следующий код и результат:

$mon = strtotime("December 2010 first monday"); 
$tue = strtotime("December 2010 first tuesday"); 
$wed = strtotime("December 2010 first wednesday"); 
$thu = strtotime("December 2010 first thursday"); 
$fri = strtotime("December 2010 first friday"); 
$sat = strtotime("December 2010 first saturday"); 
$sun = strtotime("December 2010 first sunday"); 

echo strftime("%m/%d/%y", $mon) . "<br>"; 
echo strftime("%m/%d/%y", $tue) . "<br>"; 
echo strftime("%m/%d/%y", $wed) . "<br>"; 
echo strftime("%m/%d/%y", $thu) . "<br>"; 
echo strftime("%m/%d/%y", $fri) . "<br>"; 
echo strftime("%m/%d/%y", $sat) . "<br>"; 
echo strftime("%m/%d/%y", $sun) . "<br>"; 

Результаты в:

12/06/10 
12/07/10 
12/08/10 
12/02/10 
12/03/10 
12/04/10 
12/05/10 

Уведомление что-то? Разве один день недели не должен совпадать с 1-м месяцем? Но это никогда не происходит, и вместо этого второй экземпляр дня, восьмого, всегда возвращается.

У кого-нибудь есть объяснение?

ответ

8

У меня нет никакого объяснения, я также ослеплен, но мне удалось выяснить, как вы получите правильную дату, опуская «первый», например, так:

$ php -r 'echo date("m/d/y", strtotime("December 2010 Wednesday"));' 
12/01/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Thursday"));' 
12/02/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Friday"));' 
12/03/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Saturday"));' 
12/04/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Sunday"));' 
12/05/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Monday"));' 
12/06/10 

$ php -r 'echo date("m/d/y", strtotime("December 2010 Tuesday"));' 
12/07/10 
+0

уверен, это работает. Давайте не будем спрашивать, почему ... – Yarin 2010-12-05 05:45:57

+0

Ну, вы можете посмотреть исходный код php, если вы действительно любопытно, что касается меня, давайте перейдем дальше: D – 2010-12-05 05:47:19

5

Это только ваше неправильное форматирование. Вам нужно включить of:

echo strftime("%m/%d/%y", strtotime("first Monday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Tuesday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Wednesday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Thursday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Friday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Saturday of December 2010")); 
echo strftime("%m/%d/%y", strtotime("first Sunday of December 2010")); 

Печать:

12/06/10 
12/07/10 
12/01/10 
12/02/10 
12/03/10 
12/04/10 
12/05/10 

Принятое решение работает, но вы столкнулись с проблемами, если вы хотите, чтобы найти второй день недели:

echo strftime("%m/%d/%y", strtotime("December 2010 second Wednesday")); 

распечаток:

12/15/10 

Есть некоторые примеры, приведенные в документации:

http://www.php.net/manual/en/datetime.formats.relative.php

Второй блок нот в вышеуказанной документации объясняет, как of влияет на процесс расчета даты:

наблюдать также, что «в «in» порядковый номер space dayname space 'of' 'и' 'last' space dayname space 'of' 'делает что-то особенное.

  1. Он устанавливает день-месяц до 1.
  2. «порядкового DAYNAME" из»не наступать на другой день. (Пример: «Первый вторник июля 2008 года» означает «2008-07-01»).
  3. «порядковый день» означает переход на другой день. (Пример: «первый вторник, июль 2008» означает «2008-07-08», см. Также пункт 4 в списке выше).
  4. "'last' dayname 'of'" принимает последнее имя дня текущего месяца. (пример: "последний раз от июля 2008 года" означает "2008-07-30")
  5. "'last' dayname" занимает последнее имя дня с текущего дня. (пример: «последний с июля 2008 года» означает «2008-06-25»; «июль 2008» сначала устанавливает текущую дату на «2008-07-01» и , тогда «последний wed» переходит к предыдущему Среда, которая является «2008-06-25»).
10

Строительство от ответов, представленных, необходимо иметь в виду различия в относительной форматирования даты между PHP 5.2 и PHP 5.3.

ТЕСТ:

$date1 = strtotime("first wednesday of 2010-12"); 
$date2 = strtotime("first wednesday 2010-12"); 
$date3 = strtotime("wednesday 2010-12"); 

5,2 Результаты:

1969-12-31 
2010-12-08 
2010-12-01 

5.3 Результаты:

2010-12-01 
2010-12-08 
2010-12-01 

Поэтому только й третий метод возвращает правильные результаты в версиях PHP 5.

1

Я нашел это примечание в руководстве по PHP.

«В PHP 5 до 5.2.7 запрос на заданное вхождение данного дня недели в месяц, когда этот день недели был первым днем ​​месяца, неправильно добавит одну неделю к возвращенной отметке времени. Это было исправлено в 5.2.7 и более поздние версии ».

0

PHP 5.5.11

$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');

Я не знаю, почему, но нулевой вид силу на StrToTime парсер, чтобы начать в начале месяца, считая первый день.

Смежные вопросы