parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

весь код и был приведен выше

Безымянный 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]
Вот и все... репорт генерируется безупречно, только даты все сдвинуты (из-за чего топик и создал)

Посоветуйте, как мне получать нормальные даты? Единственный выход, что я тока увидел - это в запрос нередавать не таймстампы, а писать ... between unix_timestamp($start_date) and unix_timestamp($stop_date), я сами строки дат формировать под UNIX-style
$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 в классе работают как надо, а вот МЕТОД преобразования объекта класса в таймстамп выдает не то значение. Или я неправильную дату туда пытаюсь засунуть? Вроде бы я еще в своем уме, и на первые несколько взглядов криминала в коде не усмотрел.

Жду ваших комментариев по данному поводу.