iOS 'dateFromString' Returning different? - ios

I am using the NSDateFormatter's dateFromString, yet when it is given the string, it spits out different hours.
code
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
dateformatter.dateFormat = #"yyyy-MM-dd";
NSDate *firstDate = [dateformatter dateFromString:#"2017-06-02"];
NSDate *secondDate = [dateformatter dateFromString:#"2016-11-02"];
output
firstDate: 2017-06-01 22:00:00 +0000
secondDate: 2016-11-01 23:00:00 +0000
I wonder why they do not have the same hour?

You did not specify a time for the two dates, so they were initialized to midnight, local time. When you printed them they were displayed in UTC. Your local time zone (Central European Time) observed Daylight Savings Time from March 27, 2016 to October 30, 2016. Therefore the June midnight date, which fell under Daylight Savings, is 2 hours ahead of UTC (22:00:00), while the November midnight date, which did not fall under Daylight Savings, is only 1 hour ahead of UTC (23:00:00).

Related

NSDateFormatter returning null value

I'm trying to format a date using NSDateFormatter however for some dates, formatted the same way, it returns the time without the first digit, and for others it returns null.
NSDateFormatter *dateFormat = [NSDateFormatter new];
[dateFormat setDateFormat:#"EEEE dd/MM/yyyy HH:mm"];
dateFormat.locale = [NSLocale localeWithLocaleIdentifier:#"en_AU"];
NSDate *startDate = [dateFormat dateFromString:startString];
NSDate *endDate = [dateFormat dateFromString:endString];
This date: "Saturday 1/21/2017 17:00" will return (null)
This date: "Thursday 2/9/2017 14:00" will return 2017-09-02 04:00:00 +0000
This date: "Thursday 2/9/2017 20:30" will return 2017-09-02 10:30:00 +0000
Can anyone shed some light on where I am going wrong.
Thanks
EEEE dd/MM/yyyy HH:mm to EEEE MM/dd/yyyy HH:mm. Just a small mistake inverting days and months place.
Because, clearly "Saturday 1/21/2017 17:00", means the 21th of January, because the 21th month in a year doesn't exist (at least, not here).
For the 10h difference, it's due to time zones. In en_AU (east coast I guess), there is a 10h difference from GMT.

Using NSDate to convert a string to a date, my dates are changed to 6 months back [duplicate]

This question already has an answer here:
NSDateFormatter dateFromString returns date with wrong month
(1 answer)
Closed 6 years ago.
I have an web service that spits out some dates, and in my iOS app, I'm converting UTC date to local date. I have verified that the web service is spitting out UTC dates and that iOS recognizes it as UTC.
Once i have converted my web service JSON to an NSMutableArray, set a break point and type po [listOfTasks valueForKey:#"LASTEMAILDATE"]
Results
<__NSArrayI 0x157068c80>(
,
7/28/2016 2:01:41 PM,
7/28/2016 2:01:39 PM,
7/28/2016 2:01:42 PM
)
Now, i do a for loop
for (int i = 0; i < listOfTasks.count; i++) {
FireStormCategories *cat = [listOfTasks objectAtIndex:i];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"mm/dd/yyyy hh:mm:ss a"];
NSDate *date = [df dateFromString:cat.LASTEMAILDATE];
MNLog(#"%# was changed to %#", cat.LASTEMAILDATE, [df stringFromDate:date]);
}
that log spits out
was changed to (null)
7/28/2016 2:01:41 PM was changed to 01/28/2016 02:01:41 PM (expecting: 7/28/2016 10:01:41 AM )
7/28/2016 2:01:39 PM was changed to 01/28/2016 02:01:39 PM (expecting: 7/28/2016 10:01:39 AM )
7/28/2016 2:01:42 PM was changed to 01/28/2016 02:01:42 PM (expecting: 7/28/2016 10:01:42 AM )
my first object has no date, the (null) is expected, however, this is where I'm confused. my other 3 dates are changed to a date that reflects 6 months ago and the hours should go back 5 (EST).
You are using wrong format for month. MM is used for month and mm is used for minutes
[df setDateFormat:#"mm/dd/yyyy hh:mm:ss a"];
should be
[df setDateFormat:#"MM/dd/yyyy hh:mm:ss a"];
The 01 you are getting is the minutes from the date.

Is it possible to convert input string with any format into date ios?

Is it possible to convert input string with any format into date?
I want to receive ate and time from textfield with any format like date: may 22 2000, wed may 20, may, 30 2000 etc.. and also need to get correct value according to the local timezone.
please help?
NSDateFormatter can help convert any type of date NSString to NSDate. The important thing is to use the right format for the date.
Here is some code you can try
NSString *dateString = #"01-02-2010";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"dd-MM-yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:dateString];
You will have to set the date format to whatever format your string is in. Here are some date format specifiers: (Complete list here)
eeee - Local day of week spelled out
yyyy - year (4 digits)
MMMM - Month spelled out
dd - day of month with no leading zeros
HH - hour of day (24 hour format)
mm - minutes of hour (with leading zero)
Edit
The date format for the following dates will be:
May 03 2000 : "MMM dd yyyy"
Mon, Jan 03 : "eee, MMM dd"
Mon 31 Jan : "eee dd MMM"

Unix time stamp received from server using EEST timezone

In my application i request certain date field from my server, the server returns values like :2014-06-03 00:00:00 EEST , but i need to load that data using GMT(GMT+2…) format, i am using the following code :
double unixTimeStamp = [[date objectAtIndex:indexPath.row] doubleValue];
NSTimeInterval _interval=unixTimeStamp;
NSDate *dateToFinal = [NSDate dateWithTimeIntervalSince1970:_interval];
NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
_formatter.dateFormat = #"yyyy-MMMM-dd HH:mm:ss zzz";
[_formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:[[NSUserDefaults standardUserDefaults] objectForKey:#"timeZone"]] ];
[_formatter setDateFormat:#"dd MMMM yyyy"];
dateFinal=[_formatter stringFromDate:dateToFinal];
// NSLog(#"Date Time < 3 %#" , dateFinal);
the user has the possibility to change his timezone, that's why when he saves it it's stored in a local cached variable , which i call in the previous code. But the most weird part is , if the user changes to GMT +1 or +2 or whatever, the application would still output the same hour time, which is 00:00, but if he changes to anything different from GMT, it will change. It's not normal to have GMT,GMT+1,GMT+4… to output the same hour which is 00:00. As a unix timestamp example we have 1401742800, which if u use an online time converter you would get Mon, 02 Jun 2014 21:00:00 GMT , but in the app its neither the same date nor time…what am i missing ?

NSDateFormatter Issues

Hi I have a question regarding NSDateFormatter.
Maybe Im missing something but my NSDateFormatter is not adjusting the date correctly only the time:
// NSDateFormatter (self.df) initialized in another method.
[self.df setDateFormat:#"MMM dd, YYYY hh:mm a"];
NSString *dpDate = [(UITextField*)[dateCell viewWithTag:101] text];
NSLog(#"tf date: %#",dpDate);
NSDate *date = [[NSDate alloc] init];
date = [self.df dateFromString:dpDate];
NSLog(#"Date: %#",[self.df stringFromDate:date]);
However after printing it seems the date doesn't format correctly Below are a few outputs:
Consult Output 1:
xxx[5262:60b] tf date: Dec 05, 2013 09:35 AM
2013-12-05 09:35:17.718 xxx[5262:60b] Date: Dec 23, 2012 09:35 AM
Consult Output 2:
xxx[5262:60b] tf date: Jan 16, 2014 09:45 AM
2013-12-05 09:36:21.151 xxx[5262:60b] Date: Dec 22, 2013 09:45 AM
In addition, I am only setting the dateFormat once.
You need to use yyyy, not YYYY. The first is the regular year number (with respect to the configured calendar) and the second is for week-based calendar year.
See this detailed article on how to use NSDateFormatter, and the distinction between the two.

Resources