NSDateFormatter MMM conversion - ios

As before XCode 9 I had no issue regarding DateFormatter.
With the update I have a issue I do not seem to be able to bypass.
I am busy converting dates from NSString to NSDate, however my code seems to not be able to initialize the NSDate.
My Code:
NSString *testdate = #"Sep 20 2017 1:46PM"; // this is how my date looks
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM dd yyyy hh:mma"];
NSDate *thisDate = [df dateFromString: testdate]; // this returns nil
I have tried manipulating the string in various ways, and only after I turned the function I found the dateformat issue to have appeared.
Has anyone found this issue and a possible solution?
Edit:
The only device I have this on is a iPhone 7 with iOS 11 (two different devices was tested and iPhone 7 with iOS 10 is also working correctly). I have an iPhone 6 plus as well as an iPhone 7 Plus which are both on iOS 11, and both these are working... with the time format
When I convert the [NSDate date] to string with the same date formatter my result is: M09 20 2017 1:46PM... - this was a date format issue it seems(seems to have happened when I changed the timeformat to test) and is now working however is not the problem to my issue

After closer investigation it seems like if I have setup a DateFormatter I also need to add a Locale to get it to work... The dates I got from a server so I can't just change it, due to being used on a website as well.
I received the date from the server as AM/PM and the Locale solved the issue
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM dd yyyy hh:mma"];
[df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:#"en_US_POSIX"]];
This solved the issue that I had.

Related

Issue with Caracas time zone in 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

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