I'm working on an app that can book services in later dates in many timezones.
My problem is that when i'm getting timezone for one country, i got this timezone for now.
But this week-end we will change our timezone, and Paris (Actually +1) we'll become +2.
How can I get this timezone for a date like tuesday programmatically ?
You can use various methods.
One would be to use
- (NSInteger)secondsFromGMTForDate:(NSDate *)aDate
of NSTimeZone and get the GMT offset for a certain date and a certain timezone.
Or you can use
– daylightSavingTimeOffsetForDate:
to check wether there needs a DST offset to be accounted for.
Related
I send a local date to my iCloud container, but when I query it, it returns a UTC date, does anyone know how to change this?
The date also seems to be inconsistent on the dashboard. As you can see, in the data list, the time is local. When I click on it and scroll to the time property, it's UTC.
From Date documentation:
A specific point in time, independent of any calendar or time zone.
So when you are querying the Date from iCloud I am pretty sure you are getting a correct one since it is free of any time zone, so it's dependant on the formatter's locale/time zone when it comes to displaying it.
The date you seen on the record list is date formatter for the locale and timezone of your system. The date you see when you open record details is the same point in time but displayed as UTC date.
e.g. I live in Poland and my timezone is UTC+2 so for me the same Date (point in time) is displayed in the dashboard like this:
How to convert one time zone value to another time zone value using <s:date>
For example I would like to convert
CTS to GMT+05:30(or IST) using <s:date> tag
In my database I have added date and user time zone value with respect to GMT.
my data base server is showing time zone CTS(I am unalbe to chage it).
Here I would like to convert date from CTS time zone to user time zone that is GMT+05:30(or IST) or users time zone stored in database
For Indian Standard Time, this is the way:
<s:date name = "yourDate"
format = "dd/MM/yyyy HH:mm:ss a"
timezone = "GMT+05:30" />
In the comments to this related question, you can read about common mistakes you might encounter when dealing with this.
A Date has no TimeZone. A date is just a number of milliseconds since a specific point in time (EPOCH: 01-01-1970, 00:00:00 UTC).
When you save a Date into a database, you are just saving that Long number. If your database has a specific TimeZone, it means that when you will run a query on it, it will format the Dates for human representation with that TimeZone. There are TimeZone settings in your DB, in your AS, in your framework too. But through the whole chain, the Date remains always the same Date object, just represented differently.
Many databases allows you to save the TimeZone informations along with the date. But since you said:
In my database I have added date and user time zone value with respect to GMT.
Then you can absolutely ignore the fact that
my data base server is showing time zone CTS
Just take that Date, and format it with your desired TimeZone, with the code provided.
If this is just confusing you (taking GMT dates, shown as CTS in your DB visualizer, and shown as IST in the browser), then log-print that Date three times in the Action using the three different TimeZones, to have a match between the whole chain, that will help you debugging where the conversions are applied and how.
I need to know if we can determine that a particular date had Daylighttime saving ON or OFF.
For eg. In Germany , Daylighttime saving was not there from 1950-1979. Can I determine this programmatically in iOS if these days did not have Daylighttime saving?
You can pick a date and test it. The NSDate accounts for daylight savings.
isDaylightSavingTimeForDate: returns YES if daylight savings time was in effect at that moment in time. If you want to check whether it was in effect in a certain country in a certain year, create an NSDate on 1st of July of that year, and an NSDate on 1st of January of that year, and if neither date had daylight savings time on, then the country didn't have it at all.
(You need to check a date in January as well because Australia, New Zealand etc. have daylight savings time in Summer = January).
iOS is quite good with that kind of historical knowledge. Actually, there are quite a few posts from time to time where iOS has some bizarre but correct information about a timezone and people think it's a bug.
I'm keeping the current date in a model using a datetime field in which I am indicating default to take the current date as a value.
_defaults = {
'f_inicio' : lambda *a: datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
}
Assuming that the current date is '07/10/2013 17:24:05 ', in the view is the date '07/10/2013 12:24:05' and rectified in the database and the date is '07/10/2013 17:24:05'; gather that this subtracting five hours. The user can set the time zone 'America/Bogota', Colombia is in the region (GTM - 5:00). But do not understand how to properly show when the user since I get a totally different value that should show. Apparently this taking as 'GTM 0' the GTM Colombia. Taking the approximate date create_date field that should have given me as default is '2013-10-07 22:24:05.384'.
Anyone have any idea what may be happening, really appreciate any help on this issue that is driving me crazy.
This drived me too crazy in the past. This is a real simple issue.
The date stored in the database is UTC (GMT-0) timezone. Assume that the person is set with timezone GMT - 5:00, then while storing the value to the database, the date will be added with 5 hrs (exactly 5, not little more or little less) and thus we get the UTC time to store into the database. Now when displaying the same it will check for the users timezone and it finds that its GMT - 5:00 so the database time will be subtracted with 5 (again exactly 5, not little more or little less) and displayed the user.
This will be great for system which is used in different timezones. So the understanding is the input is taken in the user's timezone stored in UTC(GMT-0) and displayed to user's timezone (even if the user viewing is in the different timezone the time will be accurate to their timezone)
Note: if the user is not set with the timezone the browsers timezone is considered and will be used with the warning icon on the top corner
That's it. Hope this gives u better clarity!!
If the user is in Eastern time, I don't want to display "EST" or "EDT" but if they are not, I do want to display it.
Is there an easy way to compare TimeZone rules in iOS?
[NSTimeZone localTimeZone] returns America/Indianapolis, but I just want to know if it is eastern.
Comparing data does not work, do I just compare secondsFromGMT?
EDIT
Comparing offsets does seem to work, but I don't know if it is going to cause problems later?
You can use [[NSTimeZone localTimeZone] abbreviation]; to get the abbreviation of whatever time zone the user is in.
This gives the abbreviation of the current date (EDT if not daylight savings and EST if daylight savings, in your case). If you want the abbreviation of a specific date, you can use abbreviationForDate: and insert any date.
Here is some more information about NSTimeZone
Edit:
If you want to actually compare multiple time zones (as in to check if it is the current time zone or not), you can use isEqualToTimeZone:. If that does not fit your needs, look at some of the other NSTimeZone methods in that link.
I've had lots of pain from dealing with time zone issues on our tools app, that includes event scheduling across time zones. The time zone names have not been friendly to use. Also, Daylight savings time is a great big pain.
What has worked consistently for me is calls like this using timeZoneForSecondsFromGMT
I also convert my stored dates to GMT, then I can set them to the local time on display.
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger timeZoneOffset = [zone secondsFromGMT];
[self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:timeZoneOffset]];