• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Total Days In View Column

  • Автор темы wowa
  • Дата начала
W

wowa

Здравствуйте...
Есть такая проблема.
Есть два поля, вот пример что в них хранится:
dtRefunded = 05/22/2009 12:00:00 AM GDT
Date = 05/14/2009

Все поля тип - Date/Time
Есть колонка во вью, с такой формулой:
Код:
@Integer((dtRefunded-Date)/86400)

Дак вот, для данного примера, результат = 7, хотя должно быть 8...
Видел пример, сейчас я его найти не могу, где оно правильно считается...
Насколько я понимаю, все это зависит от локальных настроек, из-за часовых поясов, так как меняются часы в поле. Или я не прав?
Кстати, если нажать правой кнопкой на документ и посмотреть поле, то показывается:
dtRefunded = 05/22/2009 12:00:00 AM GDT
а если глянуть с помощью ScanEZ, то 01:00:00 AM GDT.

Короче все из-за часов..
Скажите, есть ли способ правильно отображать количество дней? переделывая только формулу в колонке?
 
W

wowa

может подтолкнете на идею......

dtRefunded - редактируемое поле, нигде кодом не заполняется... почему в некоторых случаях со временем, а в некоторых нет?

dtRefunded = 05/22/2009 12:00:00 AM GDT
dtRefunded = 10/11/2009
 
N

nnikishi

вероятнее всего значение поля с часовым поясом модифицируется через back-end лотусскриптом
второй вариант заполняется через UI пользователем

чтобы отсекать в первом варианте с лотусскриптом время и часовой пояс, мспользуйте NotesDateTime класс и в нем метод SetAnyTime - он обрежет время и часовой пояс
 
A

amigolinx

Может, как вариант чисто, обрезать в формуле dtRefunded и приводить к виду "только дата":
Код:
dtRefundedText := @Word( @Text( dtRefunded ); " "; 1);
dtRefunded := @TextToTime( dtRefundedText );

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
amigolinx, ужас. ;)
Можно просто @Date использовать.
 
A

amigolinx

ну да, такой вот звращенец ;) с заскриптованой квадратной бошкой ;)
 
N

nnikishi

рекомендую все таки обязательно обрезать время и часовой пояс как я написал выше и хранить в поле только дату. Иначе могут быть очень неприятные результаты если база используется в разных часовых поясах - дата может быть смещена на день

@date корректно отработает (с точки зрения сервера), только если база на одном сервере и нет локальных реплик, иначе даты тоже могут плясать из-за часовых поясов
 
W

wowa

вероятнее всего значение поля с часовым поясом модифицируется через back-end лотусскриптом
второй вариант заполняется через UI пользователем

чтобы отсекать в первом варианте с лотусскриптом время и часовой пояс, мспользуйте NotesDateTime класс и в нем метод SetAnyTime - он обрежет время и часовой пояс
nnikishi , да, скорее всего вы правы что касается этих двух пунктов. Буду пробовать....


Может, как вариант чисто, обрезать в формуле dtRefunded и приводить к виду "только дата":
dtRefundedText := @Word( @Text( dtRefunded ); " "; 1);
dtRefunded := @TextToTime( dtRefundedText );

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

Нельзя, так как:

@date корректно отработает (с точки зрения сервера), только если база на одном сервере и нет локальных реплик, иначе даты тоже могут плясать из-за часовых поясов

Если я открою док, допустим в России, я увижу дату 15.11.2010... А где-н в Америки 14.11.2010....
 
W

wowa

Еще вопрос, работает один и тот же агент на сервере, почему в некоторых случаях

27.11.2010 00:00:00 GMT

а в некоторых

27.11.2010 00:00:00 GDT

Как это может такое происходить?
 
N

nnikishi

я так понимаю что в первом случае это после перехода на зимнее время или наоборот...
вот есть таблица:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
178
прежде всего - нужно разобраться самому, что хотелось бы получить...?
оценить результат с т.з. процесса:
-где заносятся даты
-где происходит анализ
-что является критерием правильности разницы
 
W

wowa

-где заносятся даты
-где происходит анализ
-что является критерием правильности разницы

Наверно потиху я прихожу к истине.
Дело в том, что все документы хранятся в одной базе...там с датами вроде как все ок, но надо еще проверить

И есть вторая база, Репортер...
Там есть кнопка синхронизации
Код:
@Command([ToolsRunMacro];"aSynchronizer")
Запускается агент, который переносит нужные поля, в том числе эти даты...

Код:
Call docReport.ReplaceItemValue(varItems(intUpd), docSource.GetItemValue(varItems(intUpd)))
Может есть какой-то более правильный способ для дат?

Я не сильно соображаю как работает запуск этого агента... Но возможно оно дописывает часы в дату с часовым поясом где находится чел, который запустил этот агент?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
178
не могу с уверенностью сказать, но даты хранят тот часовой пояс где с ними происходят манипуляции
т.к. поле менялось - я полагаю, часовой пояс будет текущий (где выполнен агент) и дата пересчитается в него
но если мы считаем рабочие часы - пересчет часов на локальную зону не нужен
 
N

nnikishi

Да, в вашем случае агент запускается в локальном контексте пользователя, который нажал на кнопку и его часовой пояс становится критичным

воткните что то вроде такого костылька:


Dim ndt as NotesDateTime

if IsDate(docSource.GetItemvalue(varItems(intUpd))) Then 'проверяем является ли значение поля датой

Set ndt = New NotesDateTime(docSource.GetItemvalue(varItems(intUpd)))
Call ndt.SetAnyTime 'обрезаем время

Call docReport.ReplaceItemValue(varItems(intUpd), ndt)

Else
Call docReport.ReplaceItemValue(varItems(intUpd), docSource.GetItemvalue(varItems(intUpd)))
End if
 
W

wowa

nnikishi , сделал как вы говорили... на первый взгляд , некоторые тоталы изменились в правильный вид. Тестирование продолжаю....
Но время вроде как бы не исчезло, а просто привели в общему часовому поясу (типа того)

dtRefunded = 05/22/2009 12:00:00 AM ZE2
dtRefunded = 10/11/2009 12:00:00 AM ZE2

Я не знаю, сильно ли это важно, но я думаю что в более позднем часовом поясе увидят другую дату.




Добавлено:
но я думаю что в более позднем часовом поясе увидят другую дату.
да, так и получилось... изменил на компе часовой пояс и дата изменилась,

была

dtRefunded = 05/22/2009 12:00:00 AM ZE2

стала

dtRefunded = 05/21/2009 11:00:00 PM ZE2
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!