November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Wednesday, March 12th, 2008 11:35 am
Написал себе в МоёмКруге день рождения:


И получилось вот что:


Год и месяц менять пробовал. Меняются. Но любое число любого месяца любого года до 1901 включительно на выходе стабильно превращается в 12-е. А при редактировании оно именно такое, которое я вводил.

Вот честно, я не представляю, как такое можно было запрограммировать.
Wednesday, March 12th, 2008 01:00 pm (UTC)
- долго ли умеючи?
- умеючи - долго...
/анекдот/

я вот подумал, что явно как-то с unix timestamp вязано, и по-быстрому попробовал из питона дернуть mktime. Ругается argument out of range.

Видимо, где-то там в базе, как-то это всё иначе дергается, а ошибка просто не обрабатывается. Почему 12 получается - даже предположить боюсь.

Но прикол в том, что 31-е февраля ввести не позволяет. Это, видимо, отрабатывается или раньше, или ошибка другая, которую ловят.
Edited 2008-03-12 01:05 pm (UTC)
Wednesday, March 12th, 2008 01:12 pm (UTC)
unixtime там вряд ли используется, он только с 1970 года.
Wednesday, March 12th, 2008 01:14 pm (UTC)
но тем не мение

>>> time.localtime(time.mktime((1902, 1, 31, 0, 0, 0, 0, 0, 0)))
(1902, 1, 31, 0, 0, 0, 4, 31, 0)
>>> time.localtime(time.mktime((1901, 1, 31, 0, 0, 0, 0, 0, 0)))
Traceback (most recent call last):
File "", line 1, in ?
OverflowError: mktime argument out of range
Wednesday, March 12th, 2008 01:16 pm (UTC)
а какое числовое значение в питоне получается?
и если его обратно потом перевести в день/месяц/год, то что получится?
Wednesday, March 12th, 2008 01:20 pm (UTC)
а вот эти две строки и переводят туда-обратно.

Значения получаются отрицательные, но у питона float для хранения timestamp'а. В дробной части хранят доли секунд.

>>> time.mktime((1902, 1, 31, 0, 0, 0, 0, 0, 0))
-2143333800.0
>>> time.mktime((1901, 1, 31, 0, 0, 0, 0, 0, 0))
Traceback (most recent call last):
File "", line 1, in ?
OverflowError: mktime argument out of range
>>> time.mktime((1970, 1, 1, 0, 0, 0, 0, 0, 0))
-10800.0
>>> time.mktime((1970, 1, 31, 0, 0, 0, 0, 0, 0))
2581200.0
Wednesday, March 12th, 2008 01:41 pm (UTC)
The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer). (http://ie.php.net/date)

И действительно,
<?php
error_reporting(E_ALL);
$i = strtotime("1901-12-14");
echo "time=$i\n";
echo date("j F Y", $i);
?>

дает time=-2147472000
14 December 1901


А для 13-го декабря - time=
1 January 1970
. Причём ошибок никаких не генерируется, ага.

Это может объяснить 1901 год. Но почему 12-е число и почему правильно воспроизводится месяц и год??
Wednesday, March 12th, 2008 01:44 pm (UTC)
я не знаю, уже самому интересно :)

но пока лениво-инетерсно, дальше вглубь рыться возможности нет...