Думаю, это будет очень легкая задача для большинства пользователей форума. Но решил не гуглить, а спросить, чтоб сохранить здесь ответ на будущее.
Какой то важный функционал должен начать функционировать для пользователя строго с полуночи первого марта. Полуночь первого марта в разным частях света наступает в разное время
Как Апекс кодом проверить наступила ли дата, привязанная ко времени какого-то конкретного часового пояса, а не к поясу текущего пользователя?
PS: а как тестеры должны тестировать сценарий с юзером в другом часовом поясе? Только в настройках пользователя СФ. Системное время компьютера пользователя при проверке АПЕКСом не имеет значению.
Думаю, это будет очень легкая задача для большинства пользователей форума. Но решил не гуглить, а спросить, чтоб сохранить здесь ответ на будущее. Какой то важный функционал должен начать функционировать для пользователя строго с полуночи первого марта. Полуночь первого марта в разным частях света наступает в разное время :) Как Апекс кодом проверить наступила ли дата, привязанная ко времени какого-то конкретного часового пояса, а не к поясу текущего пользователя? PS: а как тестеры должны тестировать сценарий с юзером в другом часовом поясе? Только в настройках пользователя СФ. Системное время компьютера пользователя при проверке АПЕКСом не имеет значению.
Я думаю что тут все должно быть просто.
Надо поиграться c Date в GMT +UserInfo.getTimeZone()
Datetime dt = Datetime.now();
SYSTEM.DEBUG(dt);
SYSTEM.DEBUG(JSON.serialize(dt));
TimeZone tz = UserInfo.getTimeZone();
system.debug('Offset ' + tz.getOffset(dt)/1000/60/60);
На счет другого часового пояса я бы не стал наверное заморачиваться если не будет конкретного требования. Источник правды для таймзоны должен быть один и по мне это SF. То что пользователь указал одну тайм зону а сам свалил в другую это уже его проблемы. Пусть указывает в настройках правильную. Хотя знаю клиентов и их принцип "юзверь всегда прав" то можно и здесь заморочиться. НО я бы ограничился простым warning выводимым где-нибудь на главной странице - мол парень у тебя таймзона указана в SF такая а в браузере определена такая - так не должно быть или ты соглашаешься со всеми проблемами.
Я думаю что тут все должно быть просто. Надо поиграться c Date в GMT +[b]UserInfo.getTimeZone()[/b] [code] Datetime dt = Datetime.now(); SYSTEM.DEBUG(dt); SYSTEM.DEBUG(JSON.serialize(dt)); TimeZone tz = UserInfo.getTimeZone(); system.debug('Offset ' + tz.getOffset(dt)/1000/60/60); [/code] На счет другого часового пояса я бы не стал наверное заморачиваться если не будет конкретного требования. Источник правды для таймзоны должен быть один и по мне это SF. То что пользователь указал одну тайм зону а сам свалил в другую это уже его проблемы. Пусть указывает в настройках правильную. Хотя знаю клиентов и их принцип "юзверь всегда прав" то можно и здесь заморочиться. НО я бы ограничился простым warning выводимым где-нибудь на главной странице - мол парень у тебя таймзона указана в SF такая а в браузере определена такая - так не должно быть или ты соглашаешься со всеми проблемами.
ok,
просто спрошу вас привести пример Апекс кода который возвращает текущее дата-время в "EST" или "America/New_York" часовом поясе в DateTime (не стрингом),
мой вариант выглядит слишком коряво
ok, просто спрошу вас привести пример Апекс кода который возвращает текущее дата-время в "EST" или "America/New_York" часовом поясе в DateTime (не стрингом), мой вариант выглядит слишком коряво
Оставлю здесь, вдруг пригодится.
Довольно замудреная функция, но если вкратце, то она сравнивает текущий момент с "16:00" по Чикаго, при этом учитывая переход на "летнее время" и не важно, какой timezone стоит у пользователя.
private final static Integer lastHour = 16;
public static Boolean isValidePublishDate(Deal__c deal) {if (deal.CLM_Publish_Date__c == null) {
return false;
}Datetime nowGmt = Datetime.now();
Integer localOffset = UserInfo.getTimeZone().getOffset(nowGmt);
Datetime nowLocal = nowGmt.addSeconds(localOffset / 1000);
Date publishDate = deal.CLM_Publish_Date__c;
TimeZone chicagoTimeZone = TimeZone.getTimeZone('America/Chicago');
Integer chicagoOffset = chicagoTimeZone.getOffset(publishDate);
Integer chicagoLocalOffset = (localOffset - chicagoOffset);
Time dueTime = Time.newInstance(lastHour, 0, 0, 0);
Datetime gmtDeadLine = DateTime.newInstanceGMT(publishDate, dueTime);
Datetime localDueDateTime = gmtDeadLine.addSeconds(chicagoLocalOffset / 1000);
return localDueDateTime > nowLocal;
}
Оставлю здесь, вдруг пригодится. Довольно замудреная функция, но если вкратце, то она сравнивает текущий момент с "16:00" по Чикаго, при этом учитывая переход на "летнее время" и не важно, какой timezone стоит у пользователя. [code] private final static Integer lastHour = 16; public static Boolean isValidePublishDate(Deal__c deal) { if (deal.CLM_Publish_Date__c == null) { return false; } Datetime nowGmt = Datetime.now(); Integer localOffset = UserInfo.getTimeZone().getOffset(nowGmt); Datetime nowLocal = nowGmt.addSeconds(localOffset / 1000); Date publishDate = deal.CLM_Publish_Date__c; TimeZone chicagoTimeZone = TimeZone.getTimeZone('America/Chicago'); Integer chicagoOffset = chicagoTimeZone.getOffset(publishDate); Integer chicagoLocalOffset = (localOffset - chicagoOffset); Time dueTime = Time.newInstance(lastHour, 0, 0, 0); Datetime gmtDeadLine = DateTime.newInstanceGMT(publishDate, dueTime); Datetime localDueDateTime = gmtDeadLine.addSeconds(chicagoLocalOffset / 1000); return localDueDateTime > nowLocal; }[/code]
спасибо, вот это похоже на то что нужно
[quote="Advega"]Оставлю здесь, вдруг пригодится.[/quote] спасибо, вот это похоже на то что нужно