I am dealing with time.Time objects that has been parsed with the wrong timezone. They internally have a UTC tz but the original data come from a legacy MySQL database that internally store datetimes with the timezone Europe/Paris.
I would like to change the internal timezone of the time without reparsing it. I have tried the time.In() function but it does not solve my use case because it return the same time for another timezone.
My ultimate solution would be to use https://golang.org/pkg/time/#ParseInLocation to recreate the date from the value of the original with the proper location. However if this could be avoided this would be better.
Any thoughts ?
Thanks.
Can you just Add a fixed offest to them?
t,_ := time.Parse(...)
t = t.Add(-4 * time.Hour) // or whatever offset makes it work
// t is now correct utc time
// In should work less badly:
localTime := t.In(myRealLocation)
Related
how can we convert the GMT to local SQL DATE?
When i store GMT time , then 1 hour is subtracted from this value.
please help me.
Your question is a bit ambiguous as written, but I am guessing that you want to convert a UTC datetime (sometimes called GMT or Zulu time) into a datetime in your local timezone.
You indicate that your local time zone is -1 hour offset from UTC time.
In this case you simply use the DATEADD function:
SET MyTimeLocal = DATEADD(HH, -1, MyTimeGMT)
Note that this will only work so long as your time zone really is one hour before UTC time. If your location uses daylight saving time, this will be wrong as soon as the time changes, and it will be extra wrong when the time to be converted falls in the crack of the clock change.
There are many better ways to do this in general, but to give a general solution we would need to know what version of SQL is being used and what exactly you are trying to accomplish.
I am creating a Rails API that will be consumed by a Javascript framework. Time display and manipulation will be controlled with MomentJS. It is important for the front-end to be able to display the dates along with the time zone abbreviations (e.g. 1/1/2010 11:00 PST).
From what I understand, an offset (e.g. -0700) is not enough to determine the actual timezone, and the timezone abbreviations aren't always unique.
I can think of only two options to solve this:
Return all times in UTC and have an extra field for each time specifying the timezone (e.g. { pick_up: "17-06-08T18:59:21.215Z", pick_up_tz: 'America/New_York' } (or pick_up_tz: 'PST')
Use a non-standard datetime format, something that includes both the timezone abbreviation and the offset (e.g. { pick_up: "17/09/06 13:34:00 CDT -05:00")
Are these reasonable solutions or is there a better way?
Use a non-standard datetime format
Never do this. An API should always return time in ISO 8601.
Return all times in UTC and have an extra field for each time specifying the timezone
You are correct that an offset is insufficient to identify time zone, so you do need to include that in the API response, ideally as an IANA time zone.
Whether you convert to UTC or include an offset is a matter of preference; 2017-06-08T18:59:21.215Z and 2017-06-08T11:59:21.215-0700 mean the same time, regardless of the time zone you convert to for display. Including the offset can be useful to identify if the stored offset is different from the time zone, as you might only show the time zone qualifier if the offset is different.
I have been working on an application that takes dates from server in a certain format as given below.
"2015-02-03 00:00:00"
I want to show them with different UI format using NSDateFormatter
but as i change the timezone it show previous day or sometimes next day as i changing timezone. One important thing that server side date can be in any of timezone. So, we don't know what kind of timezone date has.
I need help to show this to the date as it is on server not change due to local timezone.
Thanks.
The simplest approach would be to parse it as if it were UTC - making it always valid, and without ever needing DST adjustments - and then format it in UTC as well. In other words, set the time zone of both the formatter and parser to UTC. For types which need a time zone, that's the simplest way of faking "There isn't a time zone here, just treat it all as local to an unspecified time zone."
We're currently storing local datetime of Pacific/Hawaii in the database. Assuming that I cannot change these dates to UTC, what information do I need to add to support timezone?
My thoughts are:
First, add a timezone field to indicate which timezone the user is viewing from. (The user will select this from a dropdown)
Second, add timezone field to indicate the timezone (Pacific/Hawaii) of the current datetimes values in the database.
Third, add offset to cover DST hours
So say a user from America/Los_Angeles views the site, it would pull the datetime from the database, append the offset and apply the timezone of Hawaii before converting it to Los Angeles time. For any calculation or comparison I would convert the Hawaii time to UTC first, then convert the UTC result to Los Angeles. Am I missing anything?
Your question is very broad, and without knowing more about your application, the platform, how you use collect dates and times, what they represent, etc., I can only speak in generalities.
Storing in UTC is recommended, but that is just by convention. The main necessities are that the time zone you are storing data in does not have DST (which Hawaii hasn't since 1947), and that you do not rely on your computer's operating system or environment settings to determine what time zone to use. You can use the Hawaiian time zone if you must. Be sure you document it somewhere though! It will surely be a surprise to anyone else that comes along in the lifecycle of the application.
While it would wolk, there is absolutely no advantage to doing this. You could just as easily convert your data to UTC when you roll out these changes and use UTC going forward. (That would be the preferred approach.)
The IANA time zone ID for Hawaii is "Pacific/Honolulu". If you're on Windows/.Net, the TimeZoneInfo ID is "Hawaiian Standard Time". Either way, they must be spelled, cased, and punctuated in exactly that manner.
Make sure you understand that a Time Zone Offset and a Time Zone are two different concepts. While Hawaii may use a fixed offset of -10:00, that's not guaranteed for most time zones. Please read the timezone tag wiki for further details.
You should probably not attempt to implement your own time zone logic. There are libraries for this in almost every language. Look to see what is appropriate for your platform. (If you provide details, I can offer suggestions.)
It would be a more robust solution to store the times as UTC time as time zone is local to the specific PC that is displaying the data. In your case if you store time plus offset how can you decide which offset to store? Not a workable solution if multiple time zones are involved.
I am basically trying to read a .vcs file in Android. It has timezone value in the below format:
TZ:+05:30
Now I want to get the timezone name corresponding to this value. Means in this case it would be Kolkata(India).
Is there any code to achieve this in android?
TimeZone tz = TimeZone.getTimeZone("GMT-06:00");
String tzarr[] = TimeZone.getAvailableIDs(tz.getRawOffset());
for(int i=0;i<tzarr.length;i++)
(I'm assuming you can parse the text into an offset easily enough.)
In general, you can't. Something like "+05:30" just represents an offset from UTC at one particular time. It doesn't express how the offset changes within the time zone across the year (or across history). For example, for some of the time the Europe/London time zone has the same offset as Africa/Casablanca - but not always.
Assuming this is associated with a specific date/time, you could use TimeZone.getAvailableIDs, iterate over all the time zones, check what the offset from UTC is at that particular instant (using TimeZone.getOffset(long)) and see which time zones have the right offset at the right time. There could be many such zones though.
If you don't have a specific date/time, it's even more ambiguous. You can use getRawOffset and getDSTSavings to see whether the target offset is either the standard or DST offset for any particular zone - although note that these calls assume that for a particular time zone, the DST offset and standard offset remain the same across history (which isn't always true).