Я пытаюсь выяснить первую среду месяца, используя strtotime
, но аргумент «первый средой» терпит неудачу, когда первая среда выпадает на 1-й.
Для более общей иллюстрации этой проблемы см. Следующий код и результат:
$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-м месяцем? Но это никогда не происходит, и вместо этого второй экземпляр дня, восьмого, всегда возвращается.
У кого-нибудь есть объяснение?
У меня нет никакого объяснения, так как я также ослеплен, но мне удалось выяснить, как вы получили правильную дату, опустив «первый», например:
$ 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
Исходя из предоставленных ответов, нужно знать различия в относительном форматировании даты между 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.
Это неверно. Вам необходимо включить:
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
Второй блок примечаний в приведенной выше документации объясняет, как влияет на процесс расчета даты:
Также обратите внимание на то, что «из» в «пространственном пространстве« пространство имен »пространства« »и« последний »пространство« имя дня »пространства« »делает что-то особенное.
- Он устанавливает день месяца в 1.
- «ordinal dayname» of «» не продвигается к другому дню. (Пример: «первый вторник июля 2008 года» означает «2008-07-01»).
- «порядковое имя дня» продвигается к другому дню. (Пример: «первый вторник, июль 2008» означает «2008-07-08», см. Также пункт 4 в приведенном выше списке).
- «« last »dayname« of »принимает последнее имя текущего месяца. (Пример: «последний wed от июля 2008» означает «2008-07-30»)
- «« last »dayname принимает последнее имя дня с текущего дня. (Пример: «last wed july 2008» означает «2008-06-25», «июль 2008» сначала устанавливает текущую дату на «2008-07-01», а затем «последний wed» переходит к предыдущей среде, которая является «2008 годом» -06-25" ).
Я нашел эту заметку в руководстве по PHP.
«На PHP 5 до 5.2.7 запрос на заданный случай данного буднего дня в месяц, когда этот день недели был первым днем месяца, неправильно добавит одну неделю к возвращенной отметке времени. Это было исправлено в 5.2.7 и более поздние версии ».
PHP 5.5.11
$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');
Я не знаю, почему, но нулевой тип силы strtotime parser начнется в начале месяца с первого дня.