@zone

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

wowa

Всем Добрый день.

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

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


Подскажите, может у кого-н уже есть что-то готовое, или натолкнете на какую-н мысль. Тут, насколько я понимаю, возникают проблемы с зимним и летним временем
 
если заносится в поле типа дата - никаких проблем не вижу
есть ф-ции пересчета у класса NotesDateTime - поиграйтесь
с переходом времени тоже не будет особенных траблав, если админы следят за ОС :(
https://codeby.net/threads/43489.html
 
есть ф-ции пересчета у класса NotesDateTime - поиграйтесь
Да мне собаки нужны :(

@Zone
@TimeZoneToText
@TimeToTextInZone

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

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

Есть такое: @GetCurrentTimeZone , но параметр передать нельзя ;)
 
Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.
Или Вы хотите фиджийцам показывать текущее время индусов?
 
Или Вы хотите фиджийцам показывать текущее время индусов?

Что-то типа такого.
Допустим Фиджийцы сохранили документ, по их времени это 13.00. и чтобы в историю было записано
Фиджи Time - 13.00
Russian Time - 07.00
Austrian Time - 05.00


Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.

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

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

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

Код:
Austria_Time:= @TimeToTextInZone( Fidji_Time; "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=97$ZN=W. Europe";"D2T1S3")
 
ябы так не сказал
Прочитал по приведённой ссылке:
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.
Что не так?
 
Храните одно поле с GMT-временем (приставка " GMT" должна быть в поле явно). Если инициализировать объект NotesDataTime по этому сохранённому GMT-времени, то он в соотв. свойствах с учётом зоны текущей локали и перевода времени сам рассчитает и покажет правильное локальное время. С @-формулами тоже работать без проблем - формула будет для всех одной и той же, - GMT для того и было "сделано")
Добавлено: в крайнем случае можно на открытии дока определять время по NotesDataTime и писать в какой-нить item с SaveToDisk = False, а его уже отображать в истории.
 
чесслово не понятен упор в собаки...
в скрипте есть 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 - редка
 
Я предлагаю немного проще:
Код:
vDateTime = "05.10.2011 07:18:00 GMT"  'пример
Dim ndt As New NotesDateTime(vDateTime)
'ndt.LSLocalTime  'возвращает уже рассчитанное правильное локальное время (с учётом зоны текущей локали и перевода времени, если он включен)
 
Если мне не изменяет склероз, Domino хранит время в UTC, а клиент Lotus сам переводит в локальное в соответствии с региональными настройками.
Неправда. Время хранится в текущем формате того, кто его "засёк" - вместе с TZ и DST

А.. Опоздал
 
Собаки надо, т.к. это 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"))
)
)
 
Вообщем захардкодил и вот что получилось, мало ли кому-н пригодится или кто-то сможет что-то улучшить
В плане улучшения можно вынести формулу в настроечный документ/профиль, чтобы при необходимости добавить/убавить время не пришлось менять дизайн.
 
Собаки надо, т.к. это Computed text где строиться HTML и т.д.
VladSh уже указал - надо создать поле, при открытии формы, а сохраняться ему запретить
и юзайте инфу из этого поля какими хотите собаками
 
_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"));

Подскажите, где можно взять список для всех стран канонический вид часового пояса?
 
Мы в соцсетях:

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