Converting NSString into NSDate in objective c for mention Date String - objective-c

I am trying to convert DateString into Different DateFromat.
strDate = #"24-08-2022 06:38:50 +0:00"
NSDateFormatter *dateformate = [[NSDateFormatter alloc] init];
[dateformate setTimeZone:[NSTimeZone localTimeZone]];
[dateformate setLocale:[NSLocale localeWithLocaleIdentifier:#"en_US_POSIX"]];
[dateformate setDateFormat:#"dd-MM-yyyy HH:mm:ss Z"];
NSLog(#"%#", [dateformate dateFromString:strDate]);
[dateformate setDateFormat:#"dd-MM-yyyy HH:mm:ss ZZ"];
NSLog(#"%#", [dateformate dateFromString:strDate]);
[dateformate setDateFormat:#"dd-MM-yyyy HH:mm:ss ZZZ"];
NSLog(#"%#", [dateformate dateFromString:strDate]);
[dateformate setDateFormat:#"dd-MM-yyyy HH:mm:ss ZZZZ"];
NSLog(#"%#", [dateformate dateFromString:strDate]);
[dateformate setDateFormat:#"dd-MM-yyyy HH:mm:ss ZZZZZ"];
NSLog(#"%#", [dateformate dateFromString:strDate]);
Output
2023-01-16 19:01:22.124912+0530 [11231:315465] (null)
2023-01-16 19:01:22.125229+0530 [11231:315465] (null)
2023-01-16 19:01:22.125492+0530 [11231:315465] (null)
2023-01-16 19:01:22.125724+0530 [11231:315465] (null)
2023-01-16 19:01:22.126006+0530 [11231:315465] (null)
Actually I am getting date fro server and what to prepare my NSDate. So in my application as per need I can show different date.
Note: When testing with ZZZZZ on https://nsdateformatter.com it will give proper answer but when try in Xcode 13.3.1 it gives me null.

(NS)DateFormatter doesn't support an one digit hour time zone format.
A possible solution is to insert the leading zero with Regular Expression. The pattern searches for a plus or minus sign followed by a single zero followed by a colon and inserts one zero on success. $1 represents the captured plus or minus sign.
The time zone specifier for +00:00 is xxx
NSString *strDate = #"24-08-2022 06:38:50 +0:00";
NSString *trimmedStrDate = [strDate stringByReplacingOccurrencesOfString:#"([+-])0:"
withString:#"$100:"
options:NSRegularExpressionSearch
range:NSMakeRange(0, strDate.length)];
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
dateformatter.timeZone = [NSTimeZone localTimeZone];
dateformatter.locale = [NSLocale localeWithLocaleIdentifier: #"en_US_POSIX"];
dateformatter.dateFormat = #"dd-MM-yyyy HH:mm:ss xxx";
NSLog(#"%#", [dateformatter dateFromString: trimmedStrDate]);
Side note: The convenient dot-notation dateformatter.dateFormat = syntax has been introduced more than 10 years ago.

Related

Formatting Date Using NSDateFormatter Not Working

I have this NSString that has a date and time that I want to format:
Jul 17, 2013 09:10 PM
I want to format it like this:
yyyy-MM-dd HH:mm
but it doesn't work.
This is the code I'm using:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:#"en_US"];
[formatter setDateFormat:#"MMM dd, yyyy hh:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSLog(#"_date: %#", _date);
[formatter setDateFormat:#"yyyy-MM-dd HH:mm"];
NSString *_newDate = [formatter stringFromDate:_date];
NSLog(#"_newDate: %#", _newDate);
NSLog returns:
_date: 2013-07-17 04:10:00 +0000
_newDate: 2013-07-17 04:10:00 +0000
Am I missing something? After formatting the date, I want to subtract 45 minutes from the formatted date using the code:
_newDate = [_date dateByAddingTimeInterval:-60*45];
NSLog(#"Subtracted date: %#", _newDate);
But this isn't my worry right now since the first step isn't working, which is to format the date from NSString. Any idea why it isn't working?
Edit
Updated the typo on the code for dateByAddingInterval by changing _newDate with _date.
Since your dateString is in AM/PM format you will have to use
[formatter setDateFormat:#"MMM dd, yyyy hh:mm a"];
you are using HH and a in your dateFormat. HH means "hour in 24 hour format", and it looks like it takes precedence over a, the period (i.e. PM).
Use #"MMM dd, yyyy hh:mm a" with hh, which means "hour in 12 hour format" to convert your string into a NSDate.
NSString *_dateToFormat = #"Jul 17, 2013 09:10 PM"; // this is in local time zone! (mine is UTC+2)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:#"en_US"];
[formatter setDateFormat:#"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSLog(#"wrong _date: %#", _date);
[formatter setDateFormat:#"MMM dd, yyyy hh:mm a"];
_date = [formatter dateFromString:_dateToFormat];
NSLog(#"correct _date: %#", _date); // this is in UTC, not in local time zone!
NSLog(#"correct _date: %#", [_date descriptionWithLocale:[NSLocale currentLocale]]); // this should be in your local timezone
Output:
wrong _date: 2013-07-17 10:10:00 +0000
correct _date: 2013-07-17 19:10:00 +0000 (in my timezone: 21:10, or 09:10 PM)
correct _date: Wednesday, July 17, 2013, 9:10:00 PM Central European Summer Time
Keep in mind that printing a NSDate usually prints in UTC. So if your timezone is different the logged NSDate will not match your input date. It will be off by the offset between your timezone and UTC.
You can print [_date descriptionWithLocale:[NSLocale currentLocale]] to see the time in your local timezone.
But this is just when you NSLog the NSDate. The NSDate is still correct, it's just the printed output that seems to be wrong.
To conclude, your code should look like this:
NSString *_dateToFormat = #"Jul 17, 2013 09:10 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:#"en_US"];
[formatter setDateFormat:#"MMM dd, yyyy hh:mm a"];
// create date from string
NSDate *_date = [formatter dateFromString:_dateToFormat];
// subtract 45 minutes
_date = [_date dateByAddingTimeInterval:-60*45];
[formatter setDateFormat:#"yyyy-MM-dd HH:mm"];
// turn date into string
NSString *_newDate = [formatter stringFromDate:_date];
NSLog(#"%#", _newDate);
Output: 2013-07-17 20:25
Use 2 different formatters, one for converting the string to a date and a second for converting your date back to a string. The first should use the en_US_POSIX locale and the second should probably use the system (default) locale (but if you want to force a particular format then you can use en_US_POSIX here too).
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:#"MMM dd, yyyy HH:mm a"];
NSDate *_date = [formatter dateFromString:_dateToFormat];
NSlog(#"Date: %#",_date);
(Posted answer on behalf of the question author).
I managed to make it work using this code with the appropriate output logs:
NSString *oldDate = #"Jul 17, 2013 09:10 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:#"en_US"];
[formatter setDateFormat:#"MMM dd, yyyy hh:mm a"];
NSDate *_date = [formatter dateFromString:oldDate];
NSLog(#"_date: %#", _date);
_date = [_date dateByAddingTimeInterval:-60*45];
NSLog(#"_date2: %#", _date);
[formatter setDateFormat:#"yyyy-MM-dd HH:mm"];
NSString *_newDate2 = [formatter stringFromDate:_date];
NSLog(#"_newDate2: %#", _newDate2);
Output:
_date: 2013-07-17 13:10:00 +0000
_newDate: 2013-07-17 21:10
_date2: 2013-07-17 12:25:00 +0000
_newDate2: 2013-07-17 20:25

Format date with NSDateFormatter

I want to format 06-06-2013 1:51 PM as Jun 06,2013.
I have tried all possible different formatting styles using NSDateFormatter but failed.
Try this
First You need to convert this string back to NSDate then again convert the NSdate to string using formatter.
NSDateFormatter *dateFormatForDB = [[NSDateFormatter alloc] init];
[dateFormatForDB setDateFormat:#"dd-MM-yyyy HH:mm a"]; //Note capital H is 4 24-hour time format
NSDate *aDate = [[[NSDate alloc] initWithTimeInterval:0 sinceDate:[dateFormatForDB dateFromString:aDateString]] autorelease];
if(aDate){
[formatter setDateFormat:#"MMM dd,yyyy"];
NSString *date = [formatter stringFromDate:aDate];
[dateFormatForDB release];
}
Try to use this format
[df setDateFormat:#"MMM dd,yyyy];
By looking at your format, i think this is what you are looking for...
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"dd-MM-yyyy hh:mm a"];
NSDate *newDate = [df dateFromString:dateString];
NSDateFormatter *df2 = [[NSDateFormatter alloc] init];
[df2 setDateFormat:#"MMM dd,yyyy"];
NSString *formattedDate = [df2 stringFromDate:newDate];
This will give you the date as string in the required format. If you want time in 24hr format, replace 'hh' with 'HH'.

How to get time with date string

How can i get the time from a datetime string according to my time zone. My time zone time is +5:30 GMT.The datetime looks like-
04/03/2013 3:30:00 AM
I want the output like-
9:00:00 AM
Thanks in advance.
You need two date formatters.
One to convert string to date. And then date to string to get required in time format.
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:#"MM/dd/yyyy hh:mm:ss a"];
NSDate *date=[dateFormatter dateFromString:#"04/03/2013 3:30:00 AM"];
NSDateFormatter *dfTime = [NSDateFormatter new];
[dfTime setDateFormat:#"hh:mm:ss a"];
NSString *time=[dfTime stringFromDate:date];
*Not compiled and check
If you have date and time in string which is date time in GMT then you need to add GMT in your string. By this you can get actual time of your time zone -
NSString *dateStr = #"04/03/2013 3:30:00 AM GMT";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MM/dd/yyyy hh:mm:ss a ZZZ"];
NSDate *date = [dateFormatter dateFromString:dateStr];
[dateFormatter setDateFormat:#"hh:mm:ss a"];
NSString *opDateStr = [dateFormatter stringFromDate:date];
NSLog(#"op = %#",opDateStr);
NSString *strdate= #"04/03/2013 3:30:00 AM";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:#"MM/dd/yyyy hh:mm:ss a"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date=[dateFormatter dateFromString:strdate];
NSDateFormatter *dfTime = [NSDateFormatter new];
[dfTime setDateFormat:#"hh:mm:ss a"];
NSString *time=[dfTime stringFromDate:date];
NSLog(#"%#",time);
NSDateFormatter * formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:#"dd/MM/yyyy hh:mm:ss a"];
NSLog(#"%#",[formatter stringFromDate:[NSDate date]]);
Output
06/03/2013 10:41:18 AM
[formatter setDateFormat:#"hh:mm:ss a"];
NSLog(#"%#",[formatter stringFromDate:[NSDate date]]);
Output
10:41:18 AM
instead of [NSDate date] pass the required date to be formatted.
As you want the time from the time string you provided according to the current time zone, you need to do something like this
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:#"MM/dd/yyyy hh:mm:ss a zzz"];
NSDate *date=[dateFormatter dateFromString:#"04/03/2013 3:30:00 AM 0000"];
NSDateFormatter *dfTime = [NSDateFormatter new];
[dfTime setTimeZone:[NSTimeZone systemTimeZone]];
[dfTime setDateFormat:#"hh:mm:ss a"];
NSString *time=[dfTime stringFromDate:date];
NSLog(#"%#",time);
you wont get the real output unless there is the offset present which is the 0000.(its the GMT offset). Also the time formatter wont work perfectly if the format of the dateString and its formatter are different. So you need to do it MM/dd/yyyy hh:mm:ss a zzz, zzz is the offset. Now your output will be 09:00:00 AM

Convert date time to NSDate from NSString

Time zone always made trouble for me. This time I have to convert date-time , that I have in NSSTring to NSDate.
I am doing something like this.
NSString *myStringDate=#"14-11-2012 4:09:00 PM +0500"
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone systemTimeZone]];
[formatter setDateFormat:#"dd-MM-yyyy h:mm:ss a Z"];
NSDate *aDate = [formatter dateFromString:myStringDate];
NSLog(#"%#",aDate);
but I am having the output like this
14-11-2012 11:09:00 +0000
Also, no AM/PM is setting :-(
What I want is 14-11-2012 4:09:00 PM +0500 i.e same Date-Time that I have in string.
Thanks in anticipation.
the output of your converting is giving the GMT time
NSString *myStringDate=#"14-11-2012 4:09:00 PM +0500"
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone systemTimeZone]];
[formatter setDateFormat:#"dd-MM-yyyy h:mm:ss a Z"];
NSDate *aDate = [formatter dateFromString:myStringDate];
NSDateFormatter* df_utc = [[[NSDateFormatter alloc] init] autorelease];
[df_utc setTimeZone:[NSTimeZone timeZoneWithName:#"UTC"]];
[df_utc setDateFormat:#"yyyy.MM.dd G 'at' HH:mm:ss zzz"];
NSDateFormatter* df_local = [[[NSDateFormatter alloc] init] autorelease];
[df_local setTimeZone:[NSTimeZone timeZoneWithName:#"EST"]];
[df_local setDateFormat:#"yyyy.MM.dd G 'at' HH:mm:ss zzz"];
NSString* ts_utc_string = [df_utc stringFromDate:aDate];
NSString* ts_local_string = [df_local stringFromDate:aDate];
Here Is the Change need to be taken.
[formatter setDateFormat:#"dd-MM-yyyy h:mm:ss a "];
Thanks
The conversion looks correct, but the default output is in UTC time (+0000) and with a 24h clock which is why you don't get the AM/PM distinction (“01:00 PM” would be 13:00). You also need to format the output if you want a specific representation ([formatter stringFromDate:aDate])…
For the UTC issue you need to select the time zone of your choice, by giving that choice in place of [NSTimeZone systemTimeZone]. Try [NSTimeZone localTimeZone] for starters.

Get the time and date of selected time zone?

I tried below snippet I'm getting current date and time of system instead of the selected time zone code.
NSDate *now = [NSDate date];
NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:selectedzone]];
NSDateComponents* timeZoneComps = [gregorian components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:now];
NSDate *selectedDate=[gregorian dateFromComponents:timeZoneComps];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setDateFormat:#"dd-MM-yyyy HH:mm:ss "];
NSString *strSelectedDate= [formatter stringFromDate:selectedDate];
setZone.text = strSelectedDate;`
Any ideas?
[NSDate date]returns a date object representing the current date and time, no matter where you are. NSDates are not subject to places or time zones. There is just one NSDate that represents now or any other moment for that matter, not different date objects for every time timezone. Therefore, you should not attempt to convert a date between time zones.
NSDate objects represent an absolute instant in time. Consider the following example of how two date representations in different time zones (9/9/11 3:54 PM in Paris and 9/9/11 11:54 PM in Sydney) are actually the same date.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:#"Europe/Paris"]];
NSDate *aDate = [formatter dateFromString:#"9/9/11 3:54 PM"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:#"Australia/Sydney"]];
NSDate *anotherDate = [formatter dateFromString:#"9/9/11 11:54 PM"];
NSLog(#"%#",anotherDate);
if ([aDate isEqualToDate:anotherDate]) {
NSLog(#"How about that?");
}
When it comes to output a date, bear in mind that NSDate's description method returns time in GMT and you need to use a NSDateFormatter to create a date string representing the local time in Paris, Sydney, etc. from a date:
NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:#"Australia/Sydney"]];
NSLog(#"%#",[formatter stringFromDate:now]); //--> 9/9/11 11:54 PM
[formatter setTimeZone:[NSTimeZone timeZoneWithName:#"Europe/Paris"]];
NSLog(#"%#",[formatter stringFromDate:now]); //--> 9/9/11 3:54 PM
[dateFormatter setDateFormat:#"EEE, d MMM yyyy HH:mm:ss z"];
Remove the trailing 'z' character from the format string if you don't want to display the time zone.
EDIT
On the other hand, if you just want to display the timezone name, just make the 'z' uppercase.
EDIT
Lowercase 'z' works fine for all the other timezones, but unfortunately GMT is a special case. So the easiest thing to do is to just omit the 'z' and append " GMT" to the formatted date.