php: strtotime («31.12.2004 +6 мес.»)); не возвращая последний день июня - PullRequest
5 голосов
/ 12 ноября 2011

Я ожидал, что этот функционал вернет 6/30/2005 вместо 7/1/2005.

print date("m/d/Y", strtotime("12/31/2004 +6 month"));

Аналогично, print date("m/d/Y", strtotime("1/31/2011 +1 month")) возвращает 03/03/2011, в то время как хотел бы, чтобы оно вернуло 2/28/2011.

Кто-нибудь знает, есть ли прямой способ показать последний день добавленного месяца?

Ответы [ 4 ]

6 голосов
/ 12 ноября 2011

Как насчет этого?

echo date("m/d/Y", strtotime("last day of 12/31/2004 + 6 month")); // 6/30/2005
echo date("m/d/Y", strtotime("last day of 1/31/2011 + 1 month")); // 2/28/2011

Демо

Редактировать: Для справки, вот ссылка на документацию для относительного времени .

2 голосов
/ 12 ноября 2011

, так как strtotime продолжается в следующем месяце, если в этом месяце нет достаточного количества дней, вы можете вернуться на 6 месяцев назад и проверить, не закончится ли оно датой начала

  $date2 = date("Y-m-d", strtotime("{$date} +6 months"));
  $date3 = date("Y-m-d", strtotime("{$date2} -6 months"));
  if($date3 != $date)
  {
     $date2 = date("Y-m-t", strtotime("{$date2} -1 months"));
  }

(или в вашем случае "м / т / У ")

0 голосов
/ 12 ноября 2011

strtotime делает все возможное с противоречивой информацией. Высказывание

1/31/2011 +1month

будет означать продвижение к

2/31/2011

но в феврале только 28 (иногда 29) дней. 2011 год не високосный, поэтому «31 февраля» нормализуется до «3 марта».

То же самое относится к '12/31/2004 + 6 месяцев'. Это приведет вас к 31 июня 2005 года. Но в июне только 30 дней, поэтому вместо этого дата нормализуется до 1 июля.

0 голосов
/ 12 ноября 2011

Один простой способ - на один месяц опередить день, который вы хотите, а затем установить значение day на ноль.Кроме того, mktime () может быть проще

$mymonth = 2;   // I want the last day of February
echo date('m/d/Y', mktime(0,0,0,$mymonth+1,0,2011));

Это должно вернуть 2/28 / 2011.

...