За последние 24 часа нас посетили 30566 программистов и 1801 робот. Сейчас ищет 981 программист ...

Проблема с работой с датами до 1970 г.

Тема в разделе "Прочие вопросы по PHP", создана пользователем unfrankness, 17 май 2006.

  1. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Подскажите, пожалуйста, как справиться с тем, что функции РНР не хотят работать с Windows-датами до 1970 года. Заранее благодарен.
     
  2. olo

    olo Активный пользователь

    С нами с:
    28 апр 2006
    Сообщения:
    272
    Симпатии:
    0
    Считай даты со смещением. Т.е. например в 2062 году дни идут так же как в 2006. Соответственно считаеш как для 2062, потом от года отнимаеш 56.
     
  3. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Написать свои функции
     
  4. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Спасибо, конечно... Но и перед этим вариантом есть проблемы.
    РНР не хочет даже просто вывести через функцию echo на экран дату до 1970 года. Пишет Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970

    Есть какие-нибудь способы справиться с этим?

    То vasa_c:
    А какие функции можно написать?
     
  5. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Неужели этот вопрос никого ранее не волновал. Помогите, плиз, что делать?
     
  6. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Меня волновал. Я написал свои функции.
    unix-тайм работает с секундами, если нужны только даты, а время не нужно, можно придумать свой формат, например, количество дней прошедших от РХ. И работать с ним.
     
  7. olo

    olo Активный пользователь

    С нами с:
    28 апр 2006
    Сообщения:
    272
    Симпатии:
    0
    Ну и что что дату вывести не хочет? Будеш работать со смещением, выведет!
    Продолжая свой пример:
    Код (Text):
    1. //Считаем для 2062 года
    2. $date = mktime(0,0,0,1,1,2062);
    3. //Отнимаем день
    4. $date -= 60 * 60 * 24;
    5. //Выводим как 2006, т.е. отнимая 56 от года
    6. print('Дата: '.date('l, F d,',$date).(date('Y',$date) - 56));
     
  8. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Вообще-то для каждого конкретного случая лучшим будет какой-то конкретный способ. Желательно, чтобы unfrankness обрисовал свой случай и то, что он хочет сделать.
     
  9. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Обрисовываю, что нужно сделать...
    Минимум: по запросу вывести в броузер из базы данных дату рождения конкретного человека, рождённого до 1970 г.
    Макисмум: определить именинников в ближайшую неделю.
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    unfrankness

    храни дату как тебе удобно. обрабатывай так же.

    в таблице
    day int
    mon int
    year int

    ну и выборки какие тебе нужны. в чем трудность?
     
  11. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Результат работы вашей программы:

    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

    Может у меня с настройками что не то?
     
  12. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Блин, может я все не так говорю... В таблице у меня дата хранится в формате date: YYYY-MM-DD. Как только я делаю запрос к этому полю, то если там менее 1970, то ничего не работает...
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    unfrankness

    какой формат поля?
    покажи запрос?
     
  14. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Хотя бы так...
    $result = mysql_query("SELECT date FROM base");
    $myrow = mysql_fetch_array($result);
    echo date('d.m.Y',strtotime($myrow['date']);

    На последней строке всё и заканчивается, если данные в date менее 1970 г.
     
  15. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    unfrankness
    strtotime() зачем?
     
  16. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Да можно и по-другому. Не в этом суть...
     
  17. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    В этом и суть. strtotime() преобразует дату к UNIX-тиместамп, который не м.б. меньше 1970.
     
  18. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Но mktime тоже не работает. А как надо-то? Как вывести дату просто на экран?
     
  19. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Так эта дата уже есть в $myrow[ 'date' ].
     
  20. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Именно, только при попытке засунуть её в echo ""; возникает проблема!
     
  21. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    unfrankness, какая проблема?
    Код (Text):
    1. echo $myrow[ 'date' ]
    не работает?
     
  22. olo

    olo Активный пользователь

    С нами с:
    28 апр 2006
    Сообщения:
    272
    Симпатии:
    0
    Ну погорячился, 2062 год получается перебор в другую сторону. Суть в том что есть диапазон дат, в которых работают стандартные функции, есть период 56 лет, с которым дни недели и прочая фигня повторяется. Вся задача сводится к нормализации года, вычисления всех сдвигов стандартными дата-функциями, и вывода даты стандартным способом, только год придется выводить отдельно, с обратным сдвигом. Но это, я считаю, такие мелочи по сравнению с перспективой написания своих функций обработки дат..
     
  23. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    olo, не всегда 56. Например 1900 и 2100 не високосные, поэтому там уже сбивается.
     
  24. unfrankness

    unfrankness Активный пользователь

    С нами с:
    17 май 2006
    Сообщения:
    18
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    olo:
    попробую поразмыслить

    vasa_c:
    echo $myrow[ 'date' ] работает. Но когда надо сравнить две даты, предсатвленные в разных форматах (напр. YYYY-MM-DD и MM-DD-YY), то нужны функции, которые не хотят работать с до 1970...
     
  25. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Разбить по разделителям ("-") на год, месяц, число.
    Сравнить годы.
    Если равны — сравнить месяцы.
    Повторять до получения результата.