Issue with Caracas time zone in iOS - ios

I am testing different time zones UTC offsets in application. And finally this code is properly working almost with all timezones. But i have an issue with Caracas.
Code that shows UTC offset.
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:#"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
//This NSDateFormatter will return timezone in format "UTC+XX:XX"
[dateFormatter setDateFormat:#"'UTC'xxxxx"];
NSString *formattedTimeZone = [dateFormatter stringFromDate:[NSDate date]];
return formattedTimeZone;
In Ukraine i receive UTC+03:00 and it is correct. In Caracas i receive UTC-04:00 but real offset is UTC-04:30.
Question is why i am missing -30 minutes in Caracas?

This is not a programming problem, Caracas(Venezuela) timezone has changed recently.
UTC-04:00 is correct right now.
Presidents of Venezuela had changed this a couple of times:
UTC-04:30 was used since 2007.
It was recently changed again to UTC-04:00.
http://www.bloomberg.com/news/articles/2016-04-14/maduro-orders-time-zone-change-to-battle-venezuela-power-crisis

Related

iOS time in 24 hours format

I want to get the current time and parse it to an String in 24 hours format, for example 13:30.
This is my code:
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:#"HH:mm"];
NSString *timeString = [formatter stringFromDate:date];
It works on the iOS simulator, but on my iPad I get 3:30 PM.
I have played around with different formats but still the same result.
Any idea why?
Thanks in advance.
The issue is the user's local is set to a 12 hour format. Set the local to en_US_POSIX to over-ride the user's setting.
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:#"en_US_POSIX"];
You need to explicitly set the locale to one with a 24 hour time.
See NSDateFormatter Locale for details on how to set the locale for the NSDateFormatter.
Note the answer by #mtb to that question. It explains how to not use a locale.

iOS how to parse "MM/DD/YY HH:MM AM" using NSDateFormatter on a device with 24 hour clock? [duplicate]

I'm having a problem. I get incoming time strings in 12-hour format, and I'm turning them into NSDate objects. When the iPhone is in 12 hour format, no problem. But when it's in 24 Hour format, things go wrong. Here's some sample code to demonstrate:
NSString *theTime = #"3:19 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"h:mm a"]; // "3:19 PM"
NSDate *date = [formatter dateFromString:theTime];
NSString *theString = [formatter stringFromDate:date];
In 24 hour mode, date is 1970-01-01 03:19:00, and theString is "3:19" - WRONG
In 12 hour mode, date is 1970-01-01 15:19:00, and theString is "3:19 PM" - RIGHT
So... question 1: why is the device's 24 hour setting overriding my date formatter setting?
and more importantly, question 2: How do I get a proper conversion from 12 hour time to 24 hour time?
I already have code to detect if the phone is in 24 hour mode, but other than digging around in the string and swapping the 3 with a 15, there doesn't seem to be a clean way to do this.
Not sure if you still need it, but I've had a similar problem which got solved by setting the locale for the date formatter. That is, if you want to force it to 12-hour mode, regardless of the user's 24/12 hour mode setting, you should set the locale to en_US_POSIX.
The reason for this behaviour is Locale, set the correct Locale
NSString *strAgendaDate = #"01/17/2012 12:00 AM";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:#"en_US"] autorelease];
[dateFormatter setDateFormat:AgendaDateFormatForMeeting];
NSDate *meetingDate = [dateFormatter dateFromString:aStrDate];
[dateFormatter setDateFormat:AgendaDateRepresentation];
strAgendaDate = [dateFormatter stringFromDate:meetingDate];
It works for both 24-hour and 12 hour format
I believe the #"h:mm a" should be #"HH:mm a".
If you use the pre-build dateformatter in cocoa, everything will be taken care of for you.
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];
NSDateFormatterShortStyle and NSDateFormatterNoStyle comes in different varieties.
Using those will make sure you respect the settings the user has selected for dates and times.
The 12-14 hour clock conversion is taken care of by the SDK, if you have a model or some value object for storing your dates try to keep them as NSDate. This way you can format them only when you need to display them. Saving dates as strings could open a world of trouble when you maybe parse them from xml where the GMT is specified separately or try to add and subtract NSTimeIntervals.
I changed from #"hh:mm:ss" to #"HH:mm:ss" and time style was changed from "1:03 PM" to "13:03".
Hope this will help you.
Okay, I left a comment, but it squished all the code together, so I'll have to "answer" my question with a comment:
Thanks. I gave it a whirl with this code:
NSString *theTime = #"3:19 PM";
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];
NSDate *date = [timeFormatter dateFromString:theTime];
NSString *theString = [timeFormatter stringFromDate:date];
And date comes up nil. I ran into this earlier when I tried this route, and it's not working. Very frustrating.

iOS 8 Europe/Moscow Time Zone Issue

This strange issue appeared with ios 8 release. Here is sample code:
NSDate * date = [NSDate dateWithTimeIntervalSince1970:1414785600];
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:#"ru_RU"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:#"Europe/Moscow"]];
[dateFormatter setDateStyle:NSDateFormatterFullStyle];
[dateFormatter setDateFormat:#"MM"];
NSString * month = [dateFormatter stringFromDate: date];
Date is 2014-11-01 00:00:00 MSK (or 2014-10-31 20:00:00 +0000)
Running ios 7, month value is 11. But on ios 8 it is 10.
Any ideas what's wrong?
Thanks.
PS. Checking Asia/Muscat timezone right now (+4 like MSK). Everything is OK, month is 11.
[timezone secondsFromGMTForDate:date] returns 14400 at iOs7 and 10800 at iOs8 for the given date. It should reflect the changes done (again) by the russian government http://www.timeanddate.com/time/change/russia/moscow which iOs7 isn't aware of yet.

iOS NSDateformatter issue - dateFromString returning same (incorrect) time regardless of input string

Not sure what I'm missing here. The following code returns a valid NSDate but with an incorrect time.
In fact it doesn't matter what the dateString's time returned is always incorrect so I don't think it is a timezone issue but a formatter issue.
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:#"yyyy-MM-dd'T'HH:mm:ss+HH:mm"];
[inputFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
NSString *dateString = #"2013-07-26T19:45:00+01:00";
NSDate *theDate = [inputFormatter dateFromString:dateString];
// returns an NSDate of 2013-07-26 01:00 BST or 2013-07-26 00:00 in NSLog
Anyone spot where I'm going wrong? Thanks, M.
Well there is a small mistake in your date formate, you are not handeling the date offset (timezone). NSDateFormatter will not pick the latest found time as the time not the timezone.
In your code yyyy-MM-dd'T'HH:mm:ss+HH:mm you are parsing the time twice, you should use yyyy-MM-dd'T'HH:mm:ssZZZZ. the ZZZZspecifies the time zone.
Be aware that this code will only work on iOS6 and higher, if you need support for iOS 5 you should remove the : from the timezone.

NSDateFormatter dateFromString behaviour changed in iOS6

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:#"UTC"];
[dateFormat setTimeZone:gmt];
[dateFormat setDateFormat:#"h:mm a"];
return [dateFormat dateFromString:text];
where text is 9:16 AM used to return a date starting from 1970 in iOS6 its returning a date like this
2000-01-01 09:16:00 +0000
is this a bug? anyway to switch to old vehaviour
on solution is to simply add "1970" to time text and then add "yyyy" to format but that seems kludgy
They've definitely changed something in iOS 6 with the date parsing. I already submitted a bug to Apple about it. There's noting in the release notes about any NSDateFormatter changes. Also see my similar bug around this parsing I added today.

Resources