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.

Foi útil?

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 ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top