| Новости | 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 в классе работают как надо, а вот МЕТОД преобразования объекта класса в таймстамп выдает не то значение. Или я неправильную дату туда пытаюсь засунуть? Вроде бы я еще в своем уме, и на первые несколько взглядов криминала в коде не усмотрел.