Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Безымянный 10.11.2004 08:58
Преобразование в таймстамп производится методом класса date# создаем объект класса date с текущей датой $date[^date::now[]] # печатаем таймстамп (для отладки, собственно, уже здесь видно несовпадение) ^date.unix-timestamp[] / # создаем еще один экземпляр класса date, но на этот раз дата = начало текущего месяца $dt[^date::create($date.year;$date.month;1;0;0;0)] # пишем в $stop таймстамп начала месяца ($dt) $stop[^dt.unix-timestamp[]] # сдвигаемся по дате на один месяц назад (от текущей) ^date.roll[month](-1) # переписываем в $dt новую дату (-1 месяц от текущей) $dt[^date::create($date.year;$date.month;1;0;0;0)] # пишем в $start таймстамп начала прошлого (!) месяца ($dt) $start[^dt.unix-timestamp[]] # выводим (для отладки) получившиеся таймстампы (результат - те же -8 часов от нужных значений) $start / $stopДалее значения просто подставляются в SQL-запрос для выборки записей за весь ПРОШЛЫЙ месяц
$lines[^table::sql{select beginSession,... from ... where beginSession between $start and $stop}]Вы сами понимаете, что с подобными таймстампами выборка проходит совсем не так как надо, что поттверждается записями в отчете, формируемом следующим кодом
# создаем корень XML-отчета $xml_report[^xdoc::create[${rep_template.rootElem}]] # запоминаем корень для последующего добавления элементов $root_elem[$xml_report.documentElement] # погнали формирование репорта ^lines.menu{ # здесь я создаю елемент класса date, используя конструктор unix-timestamp $d[^date::unix-timestamp(${lines.beginSession})] # создаем XML-ноду строки отчета $line[^xml_report.createElement[${rep_template.lineElem}]] # пишем атрибут с датой в строку отчета (дату, созданную по таймстампу, переписываем в строку методом класса date sql-string[]) ^line.setAttribute[${rep_template.lineElemDate};^d.sql-string[]] ... # добавляем сформированную строку отчета к корню документа $elem[^root_elem.appendChild[$line]] # вычищаем из памяти уже не нужные (тело итерации цикла кончилось) переменные, а то в отчете по нескольку десятков тысяч строк, а память не казенная, под другое сгодится :-) $elem[] $line[] ^memory:compact[] } ^xml_report.save[/report.xml]Вот и все... репорт генерируется безупречно, только даты все сдвинуты (из-за чего топик и создал)
$start_date[${date.year}-${date.month}-01 00:00:00] ^date.roll[month](-1) $stop_date[${date.year}-${date.month}-01 00:00:00] $lines[^table::sql{select beginSession,... from ... where beginSession between unix_timestamp($start_date) and unix_timestamp($stop_date)}]Как говорится, осадок-то остался... Где глюк? В методе unix-timestamp класса date? Из кода видно, что конструктор unix-timestamp и метод sql-string в классе работают как надо, а вот МЕТОД преобразования объекта класса в таймстамп выдает не то значение. Или я неправильную дату туда пытаюсь засунуть? Вроде бы я еще в своем уме, и на первые несколько взглядов криминала в коде не усмотрел.