Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Бага с датой + PHP 5.2.8
 
 автор: fizik   (12.01.2009 в 12:11)   письмо автору
 
 

Стояла PHP 4.3.9
При выполнении вот этой строчки

[php]
$asd = date("Y - m - d",strtotime("20081233"));

выдавалось "2009-01-02"

Поставил PHP 5.2.8
На ту же строчку выдается "1970-01-01"

В чем проблема? В PHP или ...??

  Ответить  
 
 автор: Trianon   (12.01.2009 в 12:19)   письмо автору
 
   для: fizik   (12.01.2009 в 12:11)
 

Подправили поведение strtotime()
В чем проблема-то?

  Ответить  
 
 автор: fizik   (12.01.2009 в 12:25)   письмо автору
 
   для: Trianon   (12.01.2009 в 12:19)
 

Вот и я хочу узнать почему в РНР 4 воводится дата "2009-01-02", а при РНР 5,2,8 "1970-01-01".
Хотя должна быть "2009-01-02"!

  Ответить  
 
 автор: fizik   (12.01.2009 в 12:27)   письмо автору
 
   для: fizik   (12.01.2009 в 12:25)
 

и Что значит подправили поведение , в какую сторону....как она теперь работает????

  Ответить  
 
 автор: Trianon   (12.01.2009 в 12:31)   письмо автору
 
   для: fizik   (12.01.2009 в 12:27)
 

преобразует существующие даты.
Несуществующие - отвергает.

  Ответить  
 
 автор: Trianon   (12.01.2009 в 12:30)   письмо автору
 
   для: fizik   (12.01.2009 в 12:25)
 

Да не должна она быть.
Просто в силу того, что строка 20081233 не соответствует действительной дате.

В php 4 Вы пользовались побочным эффектом ошибочного поведения.
Ошибку исправили - эффект исчез.

  Ответить  
 
 автор: fizik   (12.01.2009 в 12:36)   письмо автору
 
   для: Trianon   (12.01.2009 в 12:30)
 

То есть это наоборот бага была в рнр 4 версии?
Ясно , теперь я так понимаю надо переписывать код!!!!

  Ответить  
 
 автор: Trianon   (12.01.2009 в 12:37)   письмо автору
 
   для: fizik   (12.01.2009 в 12:36)
 

Да.
Тот самый код, который вычисляет строку 20081233 .

  Ответить  
 
 автор: fizik   (12.01.2009 в 12:42)   письмо автору
 
   для: Trianon   (12.01.2009 в 12:37)
 

Спасибо, буду думать.....

  Ответить  
 
 автор: fizik   (12.01.2009 в 12:52)   письмо автору
 
   для: fizik   (12.01.2009 в 12:42)
 

Да у меня тпереь задачка:
поясню откуда бралась дата с таким форматом:

у меня есть каждый день минимальная дата из БД например "20081212" (2008 г. 12 декабря)
потом я к нему прибавлял число от 0 до 30 по порядку в цикле.
Получались вот такие даты "20081213" (2008 г. 13 декабря) , "20081214"(2008 г. 14 декабря) и т.д.
Когда доходило до "20081232", этой функцией он должен был показывать (2009 г. 01 января).

Теперь вот надо подумать....знаю мин дату, как вывести все даты от минимальной до + 30 дней!!!!

  Ответить  
 
 автор: Trianon   (12.01.2009 в 12:53)   письмо автору
 
   для: fizik   (12.01.2009 в 12:42)
 

подсказка strtotime("+$n day", $bias);

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:06)   письмо автору
 
   для: Trianon   (12.01.2009 в 12:53)
 

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

  Ответить  
 
 автор: AcidTrash   (12.01.2009 в 13:11)   письмо автору
 
   для: fizik   (12.01.2009 в 13:06)
 

Наверно что типа такого
<?
$mindate 
mktime(0,0,0,12,12,2008);
for(
$i=0$i<30$i++){
$res date("Y - m - d",strtotime("+$i day",$mindate));
print 
$res."<br>";
}
?>

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:21)   письмо автору
 
   для: AcidTrash   (12.01.2009 в 13:11)
 

да типа того

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:22)   письмо автору
 
   для: fizik   (12.01.2009 в 13:21)
 

я просто рисую график поситителей в магазине....он каждый день двигается (смещается).
показывает по оси Х не больше 30 дней. соответственно от 12 декабря 08 до 12 января 09

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:24)   письмо автору
 
   для: fizik   (12.01.2009 в 13:22)
 

просто мне надо исправить формат даты минимальный, не 20081212, а надо я так понимаю 2008-12-12 и приьавлять по дню...

  Ответить  
 
 автор: AcidTrash   (12.01.2009 в 13:28)   письмо автору
 
   для: fizik   (12.01.2009 в 13:24)
 

просто мне надо исправить формат даты минимальный, не 20081212, а надо я так понимаю 2008-12-12
<?php
$preg 
preg_replace("#(\d{4})(\d{2})(\d{2})#""$1-$2-$3",20081212);
print 
$preg;
?>

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:30)   письмо автору
 
   для: AcidTrash   (12.01.2009 в 13:28)
 

Да спасибо......уже накатал....
Огромное тебе спасибо за указание верного пути.......а то сейчас бы думал да думал

  Ответить  
 
 автор: Trianon   (12.01.2009 в 13:32)   письмо автору
 
   для: AcidTrash   (12.01.2009 в 13:28)
 

Бог мой... зачем?!

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:38)   письмо автору
 
   для: Trianon   (12.01.2009 в 13:32)
 

Зачем что?

  Ответить  
 
 автор: Trianon   (12.01.2009 в 13:41)   письмо автору
 
   для: fizik   (12.01.2009 в 13:38)
 

preg_replace зачем

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:43)   письмо автору
23.1 Кб
 
   для: Trianon   (12.01.2009 в 13:32)
 

Вот результат работы

  Ответить  
 
 автор: Trianon   (12.01.2009 в 13:48)   письмо автору
 
   для: fizik   (12.01.2009 в 13:43)
 

и что? его без preg_replace не достичь было?

  Ответить  
 
 автор: fizik   (12.01.2009 в 13:50)   письмо автору
 
   для: Trianon   (12.01.2009 в 13:48)
 

Не все нормально...preg_ мне не понодобился, но идея тоже хорошая...

  Ответить  
 
 автор: AcidTrash   (12.01.2009 в 14:04)   письмо автору
 
   для: Trianon   (12.01.2009 в 13:32)
 

А чем preg не нравится, или я что-то не понял?
Можно и без него обойтись
$e=(string)20081212;
$mindate = mktime(0,0,0,$e[4].$e[5],$e[6].$e[7],$e[0].$e[1].$e[2].$e[3]);

  Ответить  
 
 автор: Trianon   (12.01.2009 в 14:27)   письмо автору
 
   для: AcidTrash   (12.01.2009 в 14:04)
 

да потому что strtotime и так отработает.
$mindate = strtotime("20081212");

  Ответить  
 
 автор: AcidTrash   (12.01.2009 в 14:33)   письмо автору
 
   для: Trianon   (12.01.2009 в 14:27)
 

Н-да, действительно, про неё же говорим , про неё же и забыл, полез в какие то дебри :)

  Ответить  
 
 автор: Loki   (12.01.2009 в 16:16)   письмо автору
 
   для: Trianon   (12.01.2009 в 14:27)
 

Так вроде начали с того, что strtotime не отрабатывает некорректные даты, а mktime как раз наоборот - очень даже к ним лоялен.

  Ответить  
 
 автор: Trianon   (12.01.2009 в 16:18)   письмо автору
 
   для: Loki   (12.01.2009 в 16:16)
 

Предлагаешь подождать, когда mktime поправят? :))

  Ответить  
 
 автор: Loki   (12.01.2009 в 17:21)   письмо автору
 
   для: Trianon   (12.01.2009 в 16:18)
 

А должны?:) Вроде как работа с некорректными датами у него завялена как фича и даже приведена в примерах использования.

  Ответить  
 
 автор: Trianon   (12.01.2009 в 17:22)   письмо автору
 
   для: Loki   (12.01.2009 в 17:21)
 

Ты ж понимаешь... magic quotes в свое время тоже были заявлены как фича...

  Ответить  
 
 автор: Loki   (12.01.2009 в 17:30)   письмо автору
 
   для: Trianon   (12.01.2009 в 17:22)
 

до седьмой версии еще есть время попользоваться mktime:)

  Ответить  
 
 автор: Trianon   (12.01.2009 в 17:53)   письмо автору
 
   для: Loki   (12.01.2009 в 17:30)
 

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

  Ответить  
 
 автор: AcidTrash   (12.01.2009 в 21:41)   письмо автору
 
   для: Trianon   (12.01.2009 в 17:53)
 

можно же сразу писать код, который ни на какие побочные эффекты не опирается...
Можно, но опять же не предугадаешь...
Зависит то, от интерпретатора PHP, что там изменят разработчики, не известно.
Компилируемый язык, больше рулит в этом плане.
Причем сам интерпретатор написан по большому счету на C++.

  Ответить  
 
 автор: __Андрей__   (13.01.2009 в 03:22)   письмо автору
 
   для: Trianon   (12.01.2009 в 17:53)
 

Вот наткнулся на тему и вспомнил. Нормально ли strtotime проглотит дату из столбца типа DATETIME из базы? В мануале про такой формат ни слова :)

  Ответить  
 
 автор: Trianon   (13.01.2009 в 10:09)   письмо автору
 
   для: __Андрей__   (13.01.2009 в 03:22)
 

>Вот наткнулся на тему и вспомнил. Нормально ли strtotime проглотит дату из столбца типа DATETIME из базы?

Нормально

>В мануале про такой формат ни слова :)

Неужели?

  Ответить  
 
 автор: __Андрей__   (14.01.2009 в 00:19)   письмо автору
 
   для: Trianon   (13.01.2009 в 10:09)
 

>Неужели?
Именно. Конкретно в таком формате в мануале описано не было.

Спасибо.

  Ответить  
 
 автор: Trianon   (14.01.2009 в 00:28)   письмо автору
 
   для: __Андрей__   (14.01.2009 в 00:19)
 

последовательность ссылок:
http://ru2.php.net/strtotime
http://www.gnu.org/software/shishi/manual/html_node/Date-input-formats.html
http://www.gnu.org/software/shishi/manual/html_node/Calendar-date-items.html#Calendar-date-items
а там первой же строкой iso 8601.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования