WTF? даты и февраль

kode

never knows best
WTF? даты и февраль

echo date('Y-m');
echo date('Y-m', strtotime('+1 month'));

выводит
2008-01
2008-03
 

Bitterman

Новичок
Что именно тебя удивляет? Сегодня 30 января, скрипт прибавляет месяц, получается 30 февраля, которое вполне логично преобразовывается в 1 марта.
The fuzz in units can cause problems with relative items. For example, ‘2003-07-31 -1 month’ might evaluate to 2003-07-01, because 2003-06-31 is an invalid date.
http://www.gnu.org/software/tar/manual/html_node/tar_119.html#SEC119
 

kode

never knows best
это я понимаю, но почему февраль не предусмотрен?
 

Pigmeich

Новичок
kode
Когда тебя не интересуют дни, всегда перематывай на начало месяца.
 

dark-demon

d(^-^)b
> получается 30 февраля, которое вполне логично преобразовывается в 1 марта.

ни капли не логично. логично - это когда при переполнении значение останавливается на границе.
 

Ralph

Дикий столяр
Я думаю,это вряд ли можно назвать переполнением.А то получится,к 11:30 пятницы прибавить сутки и получится 23:59 пятницы :)
 

С.

Продвинутый новичок
Когда расчет ведется в месяцах, то вычисление надо производить не от абы какого числа (например текущего, как у ТС), а всегда от одного и того же. И никаких "переполнений" не будет.

То есть формально ТС должено был написать:

$current= mktime (0,0,0, date('m'), 15, date('Y'));
echo date('Y-m', $current);
echo date('Y-m', strtotime('+1 month',$current));
 

FractalizeR

Новичок
Автор оригинала: dark-demon
> получается 30 февраля, которое вполне логично преобразовывается в 1 марта.

ни капли не логично. логично - это когда при переполнении значение останавливается на границе.
Иными словами, если мы имеем значение типа byte, равное 255, прибавляем единицу и получаем все равно 255 - это логично?
 

dark-demon

d(^-^)b
С., текущее число следующего месяца никогда не наступит :)
Ralph, при прибавлении суток инкрементируются именно сутки, а не прибавляется 24 часа. при прибавлении месяцев - инкрементируется месяц, а не прибавляется 30 дней. вопрос лишь в том, в какую сторону округлять в случае невалидной даты.
FractalizeR, по твоему логичнее если при _увеличении_ 255 на единицу мы получим ноль?
 

Pigmeich

Новичок
FractalizeR, по твоему логичнее если при _увеличении_ 255 на единицу мы получим ноль?
Не хотелось бы вам огорчать, но мой Pentium именно так и делает с байтовыми переменными.
 

FractalizeR

Новичок
Автор оригинала: dark-demon
FractalizeR, по твоему логичнее если при _увеличении_ 255 на единицу мы получим ноль?
Если вы не в курсе, так поступают практически все компиляторы. Например, С, С++, Delphi. В худшем случае вы получаете runtime exception если включена проверка на переполнение, но ни один нормальный компилятор не сделает вам так, чтобы 255 + 1 = 255 безо всяких проблем.
Вы этого не знали? Как плохо знать только один язык программирования.... Кстати, попробую вас удивить примером из мануала по PHP:

PHP:
<?php
$large_number =  2147483647;
var_dump($large_number);
// output: int(2147483647)

$large_number++;
var_dump($large_number);
// output: float(2147483648)
?>
Видите? Возникло переполнение. PHP не может вместить 2147483648 в тип Integer. Чтобы выполнить операцию инкремента корректно, он конвертирует данные в тип Float.

Возьмем Дельфи код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  Test: Byte;
begin
  Test := 255;
  Inc(Test);
  ShowMessage(IntToStr(Test));
end;
Пример только что проверен в Delphi 7. Разумеется он выводит 0.

Возьмем C#:

Код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;

public class MyClass
{
	public static void RunSnippet()
	{
		byte i = 255;
		i++;
		MessageBox.Show(i.ToString());
	}
}
Разумеется, и тут результат 0. Пример проверялся в Snippet Compiler 2008 (Visual Studio на этом компе у меня не стоит).
 

dark-demon

d(^-^)b
специально для знатоков процессоров: архитектура x86 не поддерживает целочисленную арифметику с насыщением. поэтому она реализована в расширениях mmx - sse4

-~{}~ 31.01.08 17:03:

FractalizeR, спорим я знаю больше языков, чем ты слышал? :)
 

kode

never knows best
255 + 1 = -1 :D шутка

Чесно говоря проблему запостил уже после нахождения солюшена.
 

Ralph

Дикий столяр
dark-demon :
'при прибавлении месяцев - инкрементируется месяц, а не прибавляется 30 дней. '

Я в этом не уверен.Раз strtotime манипулирует с unix timestamp ,то вполне логично,что оба операнда преобразуются в 32-bit integer ,а результат сложения преобразуется обратно в "человеческий" формат.Так что в данном случае складываются не месяцы и даже не дни,а секунды со всеми втекающими и вытекающими переносами и коррекциями :)
 

Pigmeich

Новичок
dark-demon
специально для знатоков процессоров: архитектура x86 не поддерживает целочисленную арифметику с насыщением. поэтому она реализована в расширениях mmx - sse4
специально для знатоков SSE: у меня SSE4 может быть только на программной эмуляции.

-~{}~ 31.01.08 21:45:

echo date('d-m-Y', strtotime("+1 month", mktime(0, 0, 0, 1, 1, 2008))), "<br />\n";
echo date('d-m-Y', strtotime("+1 month", mktime(0, 0, 0, 2, 1, 2008))), "<br />\n";

Прибавляется месяц.
 
Сверху