2

How do we get user's time zone offset integer in Apex or Formula Field?

For example, a user's personal information time zone

(GMT-04:00) Eastern Daylight Time (America/New_York)

should return -4.


More information:

My requirement to have a commandButton Apex class which assigns custom object records to Users if the

custom object's state's time zone == the current user's time zone.

Hence, I created two fields on my custom object:

  1. State__c - for 2 letter USA state code
  2. GMT_Offset__c - formula field which maps all USA states to a time zone offset integer

However, I am unable to get the current user's time zone offset integer.

1

LaceySnr posted a solution to this problem on his blog a while back. AFAIK there have not been any timezone API changes since then that would render his solution obsolete.

Just beware - it's pretty rare to actually need the user's timezone offset, there is often a better way to achieve what you're trying to do either via VF or via non-offset-modified dates. If in doubt, post more info on what you're trying to achieve.

  • Thank you for your time and answer. I have added more information of what I am trying to achieve. – Shumon Saha Apr 9 '13 at 7:51
  • 1
    Interesting requirement! The solution here should do just fine for it. – jkraybill Apr 9 '13 at 7:58
4

I'm late to the party, but in trying to tackle the same problem I arrived at the approach below for getting the exact value of the time zone offset. I hope this becomes useful if you ever face the same problem in the future (such as trying to render things correctly in Visualforce).

DateTime now = DateTime.now();
Long offset = DateTime.newInstance(now.date(), now.time()).getTime()
    - DateTime.newInstance(now.dateGmt(), now.timeGmt()).getTime();

System.debug('offset (milliseconds): ' + offset);
    // -14,400,000 for EDT (America/New_York)

System.debug('offset (hours): ' + (offset / (60 * 60 * 1000)));
    // -4 for EDT (America/New_York)
  • Can you explain how (offset / (60 * 60 * 1000) can convert gmt to -4GMT? What formula can I use to get +7 or +8 GMT? – compski Oct 13 '17 at 16:47
  • 1
    Hi @compski the time zone offset is defined as the amount of time that must be added to the time expressed GMT to derive the local time. DateTime objects track time at the level of milliseconds, so by default the arithmetic gives back the offset in milliseconds. To convert from ms to hours, the math is offset in ms * (1 sec / 1000 ms) * (1 min / 60 sec) * (1 hr / 60 min). – Marty C. Oct 18 '17 at 22:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.