Регистрация  |  Вход

Апекс код проверяет дату привязанную ко времени какого-то конкретного часового пояса, а не к поясу текущего пользователя

Думаю, это будет очень легкая задача для большинства пользователей форума. Но решил не гуглить, а спросить, чтоб сохранить здесь ответ на будущее.

Какой то важный функционал должен начать функционировать для пользователя строго с полуночи первого марта. Полуночь первого марта в разным частях света наступает в разное время


Как Апекс кодом проверить наступила ли дата, привязанная ко времени какого-то конкретного часового пояса, а не к поясу текущего пользователя?

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]

Advega
Оставлю здесь, вдруг пригодится.

спасибо, вот это похоже на то что нужно

[quote="Advega"]Оставлю здесь, вдруг пригодится.[/quote]

спасибо, вот это похоже на то что нужно