Подскажите, пожалуйста, как справиться с тем, что функции РНР не хотят работать с Windows-датами до 1970 года. Заранее благодарен.
Считай даты со смещением. Т.е. например в 2062 году дни идут так же как в 2006. Соответственно считаеш как для 2062, потом от года отнимаеш 56.
Спасибо, конечно... Но и перед этим вариантом есть проблемы. РНР не хочет даже просто вывести через функцию echo на экран дату до 1970 года. Пишет Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970 Есть какие-нибудь способы справиться с этим? То vasa_c: А какие функции можно написать?
Меня волновал. Я написал свои функции. unix-тайм работает с секундами, если нужны только даты, а время не нужно, можно придумать свой формат, например, количество дней прошедших от РХ. И работать с ним.
Ну и что что дату вывести не хочет? Будеш работать со смещением, выведет! Продолжая свой пример: Код (Text): //Считаем для 2062 года $date = mktime(0,0,0,1,1,2062); //Отнимаем день $date -= 60 * 60 * 24; //Выводим как 2006, т.е. отнимая 56 от года print('Дата: '.date('l, F d,',$date).(date('Y',$date) - 56));
Вообще-то для каждого конкретного случая лучшим будет какой-то конкретный способ. Желательно, чтобы unfrankness обрисовал свой случай и то, что он хочет сделать.
Обрисовываю, что нужно сделать... Минимум: по запросу вывести в броузер из базы данных дату рождения конкретного человека, рождённого до 1970 г. Макисмум: определить именинников в ближайшую неделю.
unfrankness храни дату как тебе удобно. обрабатывай так же. в таблице day int mon int year int ну и выборки какие тебе нужны. в чем трудность?
Результат работы вашей программы: Warning: mktime(): Windows does not support negative values for this function Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970 Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970 Дата: -56 Может у меня с настройками что не то?
Блин, может я все не так говорю... В таблице у меня дата хранится в формате date: YYYY-MM-DD. Как только я делаю запрос к этому полю, то если там менее 1970, то ничего не работает...
Хотя бы так... $result = mysql_query("SELECT date FROM base"); $myrow = mysql_fetch_array($result); echo date('d.m.Y',strtotime($myrow['date']); На последней строке всё и заканчивается, если данные в date менее 1970 г.
Ну погорячился, 2062 год получается перебор в другую сторону. Суть в том что есть диапазон дат, в которых работают стандартные функции, есть период 56 лет, с которым дни недели и прочая фигня повторяется. Вся задача сводится к нормализации года, вычисления всех сдвигов стандартными дата-функциями, и вывода даты стандартным способом, только год придется выводить отдельно, с обратным сдвигом. Но это, я считаю, такие мелочи по сравнению с перспективой написания своих функций обработки дат..
olo: попробую поразмыслить vasa_c: echo $myrow[ 'date' ] работает. Но когда надо сравнить две даты, предсатвленные в разных форматах (напр. YYYY-MM-DD и MM-DD-YY), то нужны функции, которые не хотят работать с до 1970...
Разбить по разделителям ("-") на год, месяц, число. Сравнить годы. Если равны — сравнить месяцы. Повторять до получения результата.