Convert iOS localTimeZone to a knownTimeZone - ios
Using NSTimeZone the list of knownTimeZoneNames does not match the timezone retrieved by localTimeZone. How can I convert a timezone from localTimeZone to a time zone from knownTimeZoneNames. More specifically, the timezone .name return value must match a timezone in this list of timezones.
(lldb) po [NSTimeZone localTimeZone]
Local Time Zone (US/Pacific (PST) offset -28800)
(lldb) po [[NSTimeZone localTimeZone] name]
US/Pacific
(lldb) po [NSTimeZone knownTimeZoneNames]
<__NSCFArray 0x10ab5c00>(
Africa/Abidjan,
Africa/Accra,
Africa/Addis_Ababa,
Africa/Algiers,
Africa/Asmara,
Africa/Bamako,
Africa/Bangui,
Africa/Banjul,
Africa/Bissau,
Africa/Blantyre,
Africa/Brazzaville,
Africa/Bujumbura,
Africa/Cairo,
Africa/Casablanca,
Africa/Ceuta,
Africa/Conakry,
Africa/Dakar,
Africa/Dar_es_Salaam,
Africa/Djibouti,
Africa/Douala,
Africa/El_Aaiun,
Africa/Freetown,
Africa/Gaborone,
Africa/Harare,
Africa/Johannesburg,
Africa/Juba,
Africa/Kampala,
Africa/Khartoum,
Africa/Kigali,
Africa/Kinshasa,
Africa/Lagos,
Africa/Libreville,
Africa/Lome,
Africa/Luanda,
Africa/Lubumbashi,
Africa/Lusaka,
Africa/Malabo,
Africa/Maputo,
Africa/Maseru,
Africa/Mbabane,
Africa/Mogadishu,
Africa/Monrovia,
Africa/Nairobi,
Africa/Ndjamena,
Africa/Niamey,
Africa/Nouakchott,
Africa/Ouagadougou,
Africa/Porto-Novo,
Africa/Sao_Tome,
Africa/Tripoli,
Africa/Tunis,
Africa/Windhoek,
America/Adak,
America/Anchorage,
America/Anguilla,
America/Antigua,
America/Araguaina,
America/Argentina/Buenos_Aires,
America/Argentina/Catamarca,
America/Argentina/Cordoba,
America/Argentina/Jujuy,
America/Argentina/La_Rioja,
America/Argentina/Mendoza,
America/Argentina/Rio_Gallegos,
America/Argentina/Salta,
America/Argentina/San_Juan,
America/Argentina/San_Luis,
America/Argentina/Tucuman,
America/Argentina/Ushuaia,
America/Aruba,
America/Asuncion,
America/Atikokan,
America/Bahia,
America/Bahia_Banderas,
America/Barbados,
America/Belem,
America/Belize,
America/Blanc-Sablon,
America/Boa_Vista,
America/Bogota,
America/Boise,
America/Cambridge_Bay,
America/Campo_Grande,
America/Cancun,
America/Caracas,
America/Cayenne,
America/Cayman,
America/Chicago,
America/Chihuahua,
America/Costa_Rica,
America/Creston,
America/Cuiaba,
America/Curacao,
America/Danmarkshavn,
America/Dawson,
America/Dawson_Creek,
America/Denver,
America/Detroit,
America/Dominica,
America/Edmonton,
America/Eirunepe,
America/El_Salvador,
America/Fortaleza,
America/Glace_Bay,
America/Godthab,
America/Goose_Bay,
America/Grand_Turk,
America/Grenada,
America/Guadeloupe,
America/Guatemala,
America/Guayaquil,
America/Guyana,
America/Halifax,
America/Havana,
America/Hermosillo,
America/Indiana/Indianapolis,
America/Indiana/Knox,
America/Indiana/Marengo,
America/Indiana/Petersburg,
America/Indiana/Tell_City,
America/Indiana/Vevay,
America/Indiana/Vincennes,
America/Indiana/Winamac,
America/Inuvik,
America/Iqaluit,
America/Jamaica,
America/Juneau,
America/Kentucky/Louisville,
America/Kentucky/Monticello,
America/Kralendijk,
America/La_Paz,
America/Lima,
America/Los_Angeles,
America/Lower_Princes,
America/Maceio,
America/Managua,
America/Manaus,
America/Marigot,
America/Martinique,
America/Matamoros,
America/Mazatlan,
America/Menominee,
America/Merida,
America/Metlakatla,
America/Mexico_City,
America/Miquelon,
America/Moncton,
America/Monterrey,
America/Montevideo,
America/Montreal,
America/Montserrat,
America/Nassau,
America/New_York,
America/Nipigon,
America/Nome,
America/Noronha,
America/North_Dakota/Beulah,
America/North_Dakota/Center,
America/North_Dakota/New_Salem,
America/Ojinaga,
America/Panama,
America/Pangnirtung,
America/Paramaribo,
America/Phoenix,
America/Port-au-Prince,
America/Port_of_Spain,
America/Porto_Velho,
America/Puerto_Rico,
America/Rainy_River,
America/Rankin_Inlet,
America/Recife,
America/Regina,
America/Resolute,
America/Rio_Branco,
America/Santa_Isabel,
America/Santarem,
America/Santiago,
America/Santo_Domingo,
America/Sao_Paulo,
America/Scoresbysund,
America/Shiprock,
America/Sitka,
America/St_Barthelemy,
America/St_Johns,
America/St_Kitts,
America/St_Lucia,
America/St_Thomas,
America/St_Vincent,
America/Swift_Current,
America/Tegucigalpa,
America/Thule,
America/Thunder_Bay,
America/Tijuana,
America/Toronto,
America/Tortola,
America/Vancouver,
America/Whitehorse,
America/Winnipeg,
America/Yakutat,
America/Yellowknife,
Antarctica/Casey,
Antarctica/Davis,
Antarctica/DumontDUrville,
Antarctica/Macquarie,
Antarctica/Mawson,
Antarctica/McMurdo,
Antarctica/Palmer,
Antarctica/Rothera,
Antarctica/South_Pole,
Antarctica/Syowa,
Antarctica/Vostok,
Arctic/Longyearbyen,
Asia/Aden,
Asia/Almaty,
Asia/Amman,
Asia/Anadyr,
Asia/Aqtau,
Asia/Aqtobe,
Asia/Ashgabat,
Asia/Baghdad,
Asia/Bahrain,
Asia/Baku,
Asia/Bangkok,
Asia/Beirut,
Asia/Bishkek,
Asia/Brunei,
Asia/Choibalsan,
Asia/Chongqing,
Asia/Colombo,
Asia/Damascus,
Asia/Dhaka,
Asia/Dili,
Asia/Dubai,
Asia/Dushanbe,
Asia/Gaza,
Asia/Harbin,
Asia/Hebron,
Asia/Ho_Chi_Minh,
Asia/Hong_Kong,
Asia/Hovd,
Asia/Irkutsk,
Asia/Jakarta,
Asia/Jayapura,
Asia/Jerusalem,
Asia/Kabul,
Asia/Kamchatka,
Asia/Karachi,
Asia/Kashgar,
Asia/Kathmandu,
Asia/Katmandu,
Asia/Khandyga,
Asia/Kolkata,
Asia/Krasnoyarsk,
Asia/Kuala_Lumpur,
Asia/Kuching,
Asia/Kuwait,
Asia/Macau,
Asia/Magadan,
Asia/Makassar,
Asia/Manila,
Asia/Muscat,
Asia/Nicosia,
Asia/Novokuznetsk,
Asia/Novosibirsk,
Asia/Omsk,
Asia/Oral,
Asia/Phnom_Penh,
Asia/Pontianak,
Asia/Pyongyang,
Asia/Qatar,
Asia/Qyzylorda,
Asia/Rangoon,
Asia/Riyadh,
Asia/Sakhalin,
Asia/Samarkand,
Asia/Seoul,
Asia/Shanghai,
Asia/Singapore,
Asia/Taipei,
Asia/Tashkent,
Asia/Tbilisi,
Asia/Tehran,
Asia/Thimphu,
Asia/Tokyo,
Asia/Ulaanbaatar,
Asia/Urumqi,
Asia/Ust-Nera,
Asia/Vientiane,
Asia/Vladivostok,
Asia/Yakutsk,
Asia/Yekaterinburg,
Asia/Yerevan,
Atlantic/Azores,
Atlantic/Bermuda,
Atlantic/Canary,
Atlantic/Cape_Verde,
Atlantic/Faroe,
Atlantic/Madeira,
Atlantic/Reykjavik,
Atlantic/South_Georgia,
Atlantic/St_Helena,
Atlantic/Stanley,
Australia/Adelaide,
Australia/Brisbane,
Australia/Broken_Hill,
Australia/Currie,
Australia/Darwin,
Australia/Eucla,
Australia/Hobart,
Australia/Lindeman,
Australia/Lord_Howe,
Australia/Melbourne,
Australia/Perth,
Australia/Sydney,
Europe/Amsterdam,
Europe/Andorra,
Europe/Athens,
Europe/Belgrade,
Europe/Berlin,
Europe/Bratislava,
Europe/Brussels,
Europe/Bucharest,
Europe/Budapest,
Europe/Busingen,
Europe/Chisinau,
Europe/Copenhagen,
Europe/Dublin,
Europe/Gibraltar,
Europe/Guernsey,
Europe/Helsinki,
Europe/Isle_of_Man,
Europe/Istanbul,
Europe/Jersey,
Europe/Kaliningrad,
Europe/Kiev,
Europe/Lisbon,
Europe/Ljubljana,
Europe/London,
Europe/Luxembourg,
Europe/Madrid,
Europe/Malta,
Europe/Mariehamn,
Europe/Minsk,
Europe/Monaco,
Europe/Moscow,
Europe/Oslo,
Europe/Paris,
Europe/Podgorica,
Europe/Prague,
Europe/Riga,
Europe/Rome,
Europe/Samara,
Europe/San_Marino,
Europe/Sarajevo,
Europe/Simferopol,
Europe/Skopje,
Europe/Sofia,
Europe/Stockholm,
Europe/Tallinn,
Europe/Tirane,
Europe/Uzhgorod,
Europe/Vaduz,
Europe/Vatican,
Europe/Vienna,
Europe/Vilnius,
Europe/Volgograd,
Europe/Warsaw,
Europe/Zagreb,
Europe/Zaporozhye,
Europe/Zurich,
GMT,
Indian/Antananarivo,
Indian/Chagos,
Indian/Christmas,
Indian/Cocos,
Indian/Comoro,
Indian/Kerguelen,
Indian/Mahe,
Indian/Maldives,
Indian/Mauritius,
Indian/Mayotte,
Indian/Reunion,
Pacific/Apia,
Pacific/Auckland,
Pacific/Chatham,
Pacific/Chuuk,
Pacific/Easter,
Pacific/Efate,
Pacific/Enderbury,
Pacific/Fakaofo,
Pacific/Fiji,
Pacific/Funafuti,
Pacific/Galapagos,
Pacific/Gambier,
Pacific/Guadalcanal,
Pacific/Guam,
Pacific/Honolulu,
Pacific/Johnston,
Pacific/Kiritimati,
Pacific/Kosrae,
Pacific/Kwajalein,
Pacific/Majuro,
Pacific/Marquesas,
Pacific/Midway,
Pacific/Nauru,
Pacific/Niue,
Pacific/Norfolk,
Pacific/Noumea,
Pacific/Pago_Pago,
Pacific/Palau,
Pacific/Pitcairn,
Pacific/Pohnpei,
Pacific/Ponape,
Pacific/Port_Moresby,
Pacific/Rarotonga,
Pacific/Saipan,
Pacific/Tahiti,
Pacific/Tarawa,
Pacific/Tongatapu,
Pacific/Truk,
Pacific/Wake,
Pacific/Wallis
)
The reason localTimeZone is not included in the list is that your local time zone is showing an older name that's only supported for backward compatibility. The semi-official list of time zones is maintained by IANA. Their format is generally Continent/City but they support older names for compatibility.
Unlike API calls, older names are not in any sense deprecated. They're not current, but still completely valid.
If your local time zone is US/Pacific, the current official name for the zone is America/Los_Angeles, which does appear in the list. Based on your results it would appear that knownTimeZoneNames only lists current names. Why iOS is giving you an older name isn't something I can answer, but I do know that it's common.
To match them up, you have a couple of options:
Run through known time zones and exhaustively compare the zone data attribute to find one that's equivalent. Yeah, ugly.
Get the IANA data. It includes a file called backward that maps old names to new names. Include that file in your project. Then, if you get a zone name not found in the "known" list, consult the backward compatibility list to get the current name.
I wouldn't recommend #eipipuz's approach. It seems to work, but the problem with abbreviations is that they're not globally unique. Known abbreviations may vary depending on the user's locale (for example, more than one place as "EST" for its Eastern time zone). As a result some "common" abbreviations may have different definitions in different places, or simply have no definition.
You can use the dictionary described in this question: GMT timezone conversion in objective c. Makes it pretty simple since you have the key.
Hold on a second, the problem is that you are going to have multiple entries that apply given only the code. What you have is not enough information.
This question is pretty close: iPhone NSTimeZone: localTimeZone confusion to your observation.
I think the answer is:
NSString *known = #"US/Pacific"
NSString *abbr = [[NSTimeZone timeZoneWithName:known] abbreviation];
NSString *expected = [[NSTimeZone abbreviationDictionary] objectForKey:abbr];
Related
Getting datetime as a string in current timezone
In the MySQL DB: '2020-04-19 22:00:00'(UTC). That's also what my endpoint returns since I set the connection option dataStrings:true. On the client, after I fetch date: const timezone = moment.tz.guess(); const convertedDate = moment(date) .tz(timezone) .format(); convertedDate then equals to "2020-04-19T22:00:00+02:00" (I'm in the UTC+2 zone). I would like to get it in the format "2020-04-20T00:00:00" instead. How can I do that?
It looks like moment(date) believes your incoming date value is in local time, not UTC. So, your timezone conversion to local time changes nothing. You can tell moment it's UTC, like this: const timezone = moment.tz.guess(); const convertedDate = moment.utc(date) .tz(timezone) .format();
You do not need moment-timezone for this. With Moment by itself you can use the utc function when parsing, and the local function to convert to the user's local time zone before formatting. moment.utc('2020-04-19 22:00:00').local().format() //=> "2020-04-20T00:00:00+02:00" Also, the Moment team recommends using Moment for existing projects only. For new development, we recommend using Luxon instead: luxon.DateTime.fromSQL('2020-04-19 22:00:00', {zone: 'utc'}).toLocal().toISO() //=> "2020-04-20T00:00:00.000+02:00"
DateTime from WebApi to Breeze is transformed with the Time Localization
I have a form on which I set a start Date and a finish Date for a entity. On the Web Api side, before saving the date to the database,I set the start date: 2013-09-25 00:00:00.000 and the the end date as 2013-09-26 23:59:59.000. var vote = (VotingSet)Entity; vote.Start = new DateTime(vote.Start.Year, vote.Start.Month, vote.Start.Day, 0, 0, 0, 0); vote.End = new DateTime(vote.End.Year, vote.End.Month, vote.End.Day, 23, 59, 58); This is from the JSON that is send to the rest service looks like this: Start: "2013-09-25T00:00:00.000Z" End: "2013-09-26T00:00:00.000Z" After the save, in the javascript client, the entity is updated with the new key and with the properties that come from the server. The observable date objects will have the following value Start: Wed Sep 25 2013 03:00:00 GMT+0300 (GTB Daylight Time) End: Fri Sep 27 2013 02:59:58 GMT+0300 (GTB Daylight Time) This is what i am getting back from the server Start: "2013-09-25T00:00:00.000" End: "2013-09-26T23:59:58.000" How can i make sure that the hours in my object are not modified? EDIT: There is a a good explaniation here on what's happening with the datetime in javascript. In the end i used this snipped to solve my problem: breeze.DataType.parseDateFromServer = function (source) { var date = moment(source); return date.toDate(); }; It override's breeze own function with adds a time offset to the datetime.
Breeze does not manipulate the datetimes going to and from the server in any way EXCEPT to add a UTZ timezone specifier to any dates returned from the server that do not already have one. This is only done because different browsers interpret dates without a timezone specifier differently and we want consistency between browsers. This is discussed in more detail in the answer posted here.
You are passing ISO8601 formatted timestamps, which is good. When you pass the Z at the end, you are indicating that the timestamp represents UTC. When you load those into JavaScript, it's going to take that into account. You still need to show more code if you are looking for a useful response. What you've currently described from .NET doesn't quite line up with the timestamps you've provided. And it seems like most of this problem has to do with JavaScript and you haven't yet shown any of that code, so I can only guess what you might be doing. Please update your question, and understand that we have no knowledge of your system other than what you show us. It's possible you may find moment.js to be useful in this scenario, but I can't elaborate further without seeing the relevent JavaScript code.
How to use NSTimeZone -timeZoneWithName: with a city name from Rails ActiveSupport?
If I only have the city name like Bangkok or Tokyo, how can I supply a timezone parameter in [NSTimeZone timeZoneWithName:#"Asia/Tokyo"] where it also has continent and slash in front of city? I already tried [NSTimeZone timeZoneWithName:#"Tokyo"], it doesn't work.
Thanks for the answers guys, but it looks like those city names are just a format that Rails "ActiveSupport::TimeZone" uses. So I just have to map it back. The mapping is here -> http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html It maps the timezone from Rails "ActiveSupport::TimeZone" format to another format that iOS uses (e.g. "International Date Line West" => "Pacific/Midway", "Midway Island" => "Pacific/Midway", "Samoa" => "Pacific/Pago_Pago", ... ). I have created a plist file containing a NSDictionary property that can easily be used for mapping. Edit: an updated version (with usage example) for Rails 3.2 (thanks RJ Regenold!)
You can see list of all timezone names. NSLog(#"%#", [NSTimeZone knownTimeZoneNames]); Hope this will be helpful for you.
If they're all in Asia, why not use something like: MYCITY=Tokyo [NSTimeZone timeZoneWithName:#"Asia/$MYCITY"] If you need more cities and timezones, you could create a static text list file based on all the time zones found at /usr/share/zoneinfo. create file 'timezones.by.city.txt' with the following text. (Truncated here.) "Asia/Aden" "Asia/Almaty" "Asia/Amman" "Asia/Anadyr" "Asia/Aqtau" "Asia/Aqtobe" "Asia/Ashgabat" "Asia/Ashkhabad" "Asia/Baghdad" "Asia/Bahrain" "Asia/Baku" "Asia/Bangkok" "Asia/Beirut" "Asia/Bishkek" ... etc. "US/Alaska" "US/Aleutian" "US/Arizona" "US/Central" "US/Eastern" "US/East-Indiana" "US/Hawaii" "US/Indiana-Starke" "US/Michigan" "US/Mountain" "US/Pacific" "US/Pacific-New" "US/Samoa" Then: MYCITY=Bangkok MYTZ=`grep "$MYCITY" ./timezones.by.city.txt` [df setTimeZone:[NSTimeZone timeZoneWithName:#"$MYTZ"]]
NSArray *zones = [NSTimeZone knownTimeZoneNames]; It returns all the set of timeszones supported by your system. You have to setTime zone like below, which you have tried already. [NSTimeZone timeZoneWithName:#"Asia/Tokyo"];
You may find the dataset and/or API from http://www.geonames.org/ useful in solving this sort of problem. They have the correct olsen timezone (which is what the 'Asia/Tokyo' is called) for a vast number of locations and you can either download and wrangle the data yourself, or use their API to get what you need.
NSString * TimeZoneName=[[NSTimeZone localTimeZone]name];
how to get timezone from a calendar
I am trying to get the timezone from native calendar using the following code but i am getting the timezone has Asia/Calcutta instead of just 'IST' Calendar calendarLocal = Calendar.getInstance(); // fetches time zone TimeZone timeZone = calendarLocal.getTimeZone(); System.out.println("Time Zone getAvailableIDs() --->"+timeZone.getAvailableIDs()); String[] x=timeZone.getAvailableIDs(); for(int i=0;i<x.length;i++){ System.out.println("Time Zone IDs-->"+x[i]); } System.out.println("Time Zone ID--->"+timeZone.getID()); System.out.println(" Calender Default-------->>>"+timeZone.getDefault()); System.out.println("Time Zone --->"+timeZone.getTimeZone(timeZone.getID())); Here TimeZone is Asia/Calcutta i need it to print IST
BlackBerry Java doesn't give you the time zone short codes, at least not reliably (it only gaurantees to know about the "GMT" code). You can see my answer here for information about how to code a mapping between strings like "Asia/Calcutta" and "IST". (my method mapTimeZoneCodes() in that example) I provide a template method for setting up the mapping, and a link to this article on Desktop Java, which seems to have a pretty complete list of the time zone codes, and how to map codes to the long Java time zone strings. It will be boring work to copy the strings into my template, but once you have it, you'll be able to easily lookup the short code based on the long name: String longName = timeZone.toString(); String shortCode = (String)_timeZones.get(longName);
Posting date issue due to time zones and the use of SystemDateGet()
Summary We are experiencing a problem where the systemDateGet() function is returning the AOS wher the local date is required when determining the date for posting purposes. Details We have branches around the world, both sides of the international date line, with users connecting to local terminal servers with the appropriate time zone settings for the user's branch. Each branch is associated with a different company, which has been configured with the correct time zone. We run a single AOS with the time zone setting set for the head office. There is not an option to introduce additional AOS's. The SystemDateGet() function is returning the AOS date as the user is not changing their Axapta session date. A number of system fields in the database related to posting dates are DATE based and not UTCDATETIME based. We are running AX2009 SP1 RU7. Kernel version 5.0.1500.4570 Application version 5.0.1500.4570 Localization version: Brazil, China, Japan, Thailand, India I am aware that the SystemDateGet() function was designed to return the AOS date unless the user changes their session date in which case that date is returned. Each user has the appropriate time zone setting in there user profile. Problem One example of the problem is when a user attempts to post a journal involving financial transactions, where the ledger period is checked to see if it is open. For example, the user is in England attempting to post a journal at 3:00pm on the 30st of November, local time, the standard Axapta code uses the systemDateGet() function to determine the date to use in the validation (determining if the period is open). In our case, the AOS is based in Brisbane Australia and the systemDateGet() function is returning the 1st of December (local time 1:00am on the 1st of December). Another example of the problem is where an invoice is posted in the United States on a Friday and the day of the week where the AOS is situated is a Saturday. We need the system to record the local date. Question Besides rewriting all system code involving systemDateGet(), over 2000 entities, is there any other options that can be used to get around the problem of getting the correct local date? Solution limitations. In the example given above of the ledger period being closed, it is not possible from a business practices standpoint to open the next period before end of month processing has been completed. There is currently no option for the purchase of additional AOS's.
Create a function in the Global class: static date systemDateGetLocal() { return DateTimeUtil::date(DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::utcNow(), DateTimeUtil::getUserPreferredTimeZone())); } Then in Info.watchDog() do a: systemDateSet(systemDateGetLocal()); This may only be a partial solution, the watchDog is executed on the client side only.
Here is a quick update. Let me know if there are any issues or situations that need to be addressed. USING LOCAL TIME Introduction: The following is a work in progress update, as the solution has yet to be fully tested in all situations. Problem: If the user has a different time zone to the AOS, the timeNow() and systemDateGet() functions are returning the AOS details when the local date time is required. Clarifiers: When the local date time is changed within Axapta, the systemDateGet() function will return the local date, however the timeNow() function still returns the AOS time. Coding changes: A number of coding changes have been made to handle a number of different situations. Comments will be added where an explanation may be required. The brackets were changed to { and } to allow this to be posted. CLASS:GLOBAL One requirement I was given was to allow the system to handle multiple sites within a company that may have different time zones. Presently this functionality is not required. static server void setSessionDateTime( inventSiteId inventSiteId = '', utcDateTime reference = dateTimeUtil::utcNow()) { str sql; sqlStatementExecutePermission perm; connection conn = new UserConnection(); timeZone timeZone; int ret; ; if (inventSiteId) { timeZone = inventSite::find(inventSiteId).Timezone; } else { timeZone = dateTimeUtil::getCompanyTimeZone(); } //This is to get around the kernel validation of changing timezones //when the user has more than one session open. sql = strfmt("Update userInfo set preferredTimeZone = %1 where userInfo.id = '%2'", enum2int(timeZone), curUserId()); perm = new SQLStatementExecutePermission(sql); perm.assert(); ret = conn.createStatement().executeUpdate(sql); dateTimeUtil::setUserPreferredTimeZone(timeZone); dateTimeUtil::setSystemDateTime(reference); CodeAccessPermission::revertAssert(); } static int localTime() { utcDateTime tmp; ; setSessionDateTime(); tmp = dateTimeUtil::applyTimeZoneOffset( dateTimeUtil::utcNow(), dateTimeUtil::getCompanyTimeZone()); return dateTimeUtil::time(tmp); } The following method was implemented as a cross check to ensure that systemDateGet() returns the expected value. static date localDate() { utcDateTime tmp; ; setSessionDateTime(); tmp = dateTimeUtil::applyTimeZoneOffset( dateTimeUtil::utcNow(), dateTimeUtil::getCompanyTimeZone()); return dateTimeUtil::date(tmp); } CLASS:APPLICATION Modify the method setDefaultCompany. Add the line setSessionDateTime(); directly after the super call. This is to allow the time to change when the user changes company (another requirement I was given). CLASS:INFO So that the system uses the correct date/time from the start of the session. void startupPost() { ; setSessionDateTime(); } Modify the method canViewAlertInbox() adding the line setSessionDateTime(); as the first line. This is to handle if the user has multiple forms open for different companies. Localization dependent changes: Depending on your service pack and localizations, you will need to change a function of objects to use the localTime() function, replacing timeNow(). IMPORTANT NOTE: Do not change the class BatchRun to use the new localTime function as this will stop it working correctly. In our system there were around 260 instances that could be changed. If you do not use all modules and localizations the actual number of lines you need to change will be less. Final note: There are a number of today() calls in the code. I have not yet gone through each line to ensure it is coded correctly, i.e. using today() instead of systemDateGet(). Known issues: I have come across a situation where the timezone change function did not work completely as expected. This was when one session was doing a database synchronisation and another session was opened in a different company. As normal users will never be able to do this, I have not spent much time on its solution at this stage. It is something I do intend to resolve.