PHP strtotime -1month -2month
Pergunta
Este estava trabalhando muito bem ontem sem alterações no código.
echo date("M", strtotime("-3 month", time()) );
echo date("M", strtotime("-2 month", time()) );
echo date("M", strtotime("-1 month", time()) );
echo date("M", time());
A saída foi produzindo ontem foi como seria de esperar-ou seja, abril, maio, junho, julho
Hoje ecoa Maio Mai Jul julho
Todas as idéias?
Agradecemos antecipadamente.
Solução
Pode estar relacionado com bug # 44073
Você poderia tentar com algo parecido com isto:
echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", time()) . "\n";
(Solução encontrada na seção de comentários do strtotime
; link direto )
E a saída:
Apr
May
Jun
Jul
tipo de "batota" com o formato de data e nome do mês e tudo o que ...
Outras dicas
Gorden identificou corretamente o problema, mas eu queria dar uma outra solução que foi útil e não como técnico. Basta usar "primeiro dia" ou "último dia" em sua strtotime. Ex, estes exemplos seguintes superar o problema em um dia 31 de um mês:
// Today is May 31st
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d');
// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month"));
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');
Tente isto em vez de strtotime
:
mktime(0, (date("n") - 3 + 12) % 12, 1)
A idéia é levar o número do mês atual (date("n")
), subtrair o número de meses a partir dele que você quer (aqui -3
), adicionar 12 a ele e, em seguida, obter modulo 12.
Este é conhecido e comportamento esperado. A razão para isto é que um mês é uma data relativa sem comprimento fixo. De http: // www. gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120
A unidade de deslocamento temporal poderá ser selecionado pelo string ‘ano’ ou ‘mês’ para mover-se por anos inteiros ou meses. Estes são unidades difusos, como anos e meses não são todos de igual duração. Unidades mais precisos são 'quinzena' que vale 14 dias, 'semana' valor de 7 dias, 'dia' vale 24 horas, 'horas' no valor de 60 minutos, 'hora' ou 'mínimo' no valor de 60 segundos, e 'segundo' ou pena 'seg' um segundo. Um ‘s’ sufixo nestas unidades é aceito e ignorado.
Consequentemente (grifo meu)
O fuzz em unidades pode causar problemas com itens relativos. Por exemplo, ‘2003-07-31 -1 mês’ pode ser avaliada como 2003-07-01, porque 2003/06/31 é uma data inválida. Para determinar o mês anterior de forma mais confiável, você pode pedir para o mês antes do dia 15 do mês em curso . Por exemplo:
$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June!
A acima pode ser expressa em PHP como
echo date('M', strtotime(date('Y-m-') . '15 -1 month'));
Veja também os commments abaixo http://bugs.php.net/bug.php ? id = 22486
A partir do PHP 5.3 (Ref: https://bugs.php.net/bug. ? php id = 44073 ) e maior que você pode fazer:
"first day of +1 month
" ou "first day of next month
" ou mesmo "last day of next month
"
Exemplo:
$date = '2015-12-31';
echo date("Y-m-d", strtotime($date ."first day of previous month"));
Produzirá:. 2015-11-01
Isso não dias calcular em +30 dias regime de tempo
a maneira simples poderia ser a escrevê-lo como este
Data de eco ( "M", strtotime ( "este ano +3 meses"));
ou
Data de eco ( "M", strtotime ( "este mês -3 meses"));
depende do que o seu usá-lo para ..