@zone

wowa

Well-known member
01.02.2007
848
0
#1
Всем Добрый день.

Существует такая проблема с часовыми зонами. С одним и тем же документом могуть работать люди с разных стран мира. В поле записывается их локальное время, CEDT, CET, EDT ,и т.д.
Мне в историю нужно вывести три даты, основываясь на их локальное время(хранящееся в поле)

| Пусть будет какое-н Европейское | какое-н Американское | локально, которое уже хранится в поле


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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#2
если заносится в поле типа дата - никаких проблем не вижу
есть ф-ции пересчета у класса NotesDateTime - поиграйтесь
с переходом времени тоже не будет особенных траблав, если админы следят за ОС :(
http://codeby.net/forum/threads/43489.html
 

wowa

Well-known member
01.02.2007
848
0
#3
есть ф-ции пересчета у класса NotesDateTime - поиграйтесь
Да мне собаки нужны :(

@Zone
@TimeZoneToText
@TimeToTextInZone

Пример. Есть такое время: 10/04/2011 10:15:39 PM ZE12 - Вроде Фиджи

Как его перевести, например в Австрийское или Индийское. При условии, что где-то может быть летнее время, а где-то его не переводят...
Это бы время перевести в канонический вид, но не знаю как

Есть такое: @GetCurrentTimeZone , но параметр передать нельзя ;)
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.
Или Вы хотите фиджийцам показывать текущее время индусов?
 

wowa

Well-known member
01.02.2007
848
0
#5
Или Вы хотите фиджийцам показывать текущее время индусов?
Что-то типа такого.
Допустим Фиджийцы сохранили документ, по их времени это 13.00. и чтобы в историю было записано
Фиджи Time - 13.00
Russian Time - 07.00
Austrian Time - 05.00


Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.
Вот как раз таки и не надо чтобы оно все там автоматом переводило. Допустим я из Беларуси, а на компе у меня американские настройки, время и т.д. Чтобы самому все в уме не пересчитывать сколько времени назад док был сохранен, нужно сделать что-то типа такого.

Но главную мысль вы озвучили: "Или Вы хотите фиджийцам показывать текущее время индусов? "
 

wowa

Well-known member
01.02.2007
848
0
#6
Что-то мне подсказывает что надо тупо хардкодить:

Например в Австрии это такое время:

Код:
Austria_Time:= @TimeToTextInZone( Fidji_Time; "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=97$ZN=W. Europe";"D2T1S3")
 

nvyush

Lotus team
22.04.2009
2 317
0
#8
Прочитал по приведённой ссылке:
Notes Date & Time Implementation

Notes Time & Date Implementation uses the TIMEDATE data type an internal 2 times 32 bit storage that contains date, time, timezone and daylight saving information

typedef struct tagTIMEDATE {
DWORD Innards[2];
} TIMEDATE;


All TIMEDATEs are internally stored in GMT also called Coordinated Universal Time (UTC) and the timezone and daylight saving settings when storing this information are also saved into this data type.
Что не так?
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#10
Храните одно поле с GMT-временем (приставка " GMT" должна быть в поле явно). Если инициализировать объект NotesDataTime по этому сохранённому GMT-времени, то он в соотв. свойствах с учётом зоны текущей локали и перевода времени сам рассчитает и покажет правильное локальное время. С @-формулами тоже работать без проблем - формула будет для всех одной и той же, - GMT для того и было "сделано")
Добавлено: в крайнем случае можно на открытии дока определять время по NotesDataTime и писать в какой-нить item с SaveToDisk = False, а его уже отображать в истории.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#11
чесслово не понятен упор в собаки...
в скрипте есть ZoneTime и никаких бубнов не надо

Добавлено: вот так (тупо) отрезать зону:
Код:
Private Function cutZone(dt As Variant) As NotesDateTime
Dim s As String
Dim s1 As String
s=dt.ZoneTime
Dim tmp As New NotesDateTime(Left$(s,Len(s)-3))
Set cutZone=tmp
'check if zone isn't specified
If Year(tmp.LSLocalTime) <> Year(dt.LSLocalTime) Then Set cutZone=dt
End Function
Добавлено: If Year(tmp.LSLocalTime) <> Year(dt.LSLocalTime) Then Set cutZone=dt
эту строку уже не могу объяснить (забыл - почему так делал) :)
скорее всего - не заморачивался на анализ результата от Left, на границе года эта ф-ция не используется (по логике приложения), ситуация с отсутствием TZ - редка
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#12
Я предлагаю немного проще:
Код:
vDateTime = "05.10.2011 07:18:00 GMT"  'пример
Dim ndt As New NotesDateTime(vDateTime)
'ndt.LSLocalTime  'возвращает уже рассчитанное правильное локальное время (с учётом зоны текущей локали и перевода времени, если он включен)
 
30.05.2006
1 345
11
#14
Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.
Неправда. Время хранится в текущем формате того, кто его "засёк" - вместе с TZ и DST

А.. Опоздал
 

wowa

Well-known member
01.02.2007
848
0
#15
Собаки надо, т.к. это Computed text где строиться HTML и т.д.
Вообщем захардкодил и вот что получилось, мало ли кому-н пригодится или кто-то сможет что-то улучшить

Код:
@Transform( @GetField("HistoryDate"); "x";
@Do(
_DateAustria := @TextToTime(@TimeToTextInZone( x; "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=97$ZN=W. Europe";"D2T1S3"));
_DateIndia := @TextToTime(@TimeToTextInZone( x; "Z=-3005$DO=0$ZX=42$ZN=India";"D2T1S3"));
_DateLocal := @TextToTime(@TimeToTextInZone( x; @GetCurrentTimeZone;"D2T1S3"))
)
)
 

nvyush

Lotus team
22.04.2009
2 317
0
#16
Вообщем захардкодил и вот что получилось, мало ли кому-н пригодится или кто-то сможет что-то улучшить
В плане улучшения можно вынести формулу в настроечный документ/профиль, чтобы при необходимости добавить/убавить время не пришлось менять дизайн.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#17
Собаки надо, т.к. это Computed text где строиться HTML и т.д.
VladSh уже указал - надо создать поле, при открытии формы, а сохраняться ему запретить
и юзайте инфу из этого поля какими хотите собаками