I have a date string which looks like this: Mar 13 '15
I am not able to find the right way to parse this. I've tried the following:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM dd ''YY"];
//[df setDateFormat:#"MMM dd 'YY"];
//[df setDateFormat:#"MMM dd YY"];
NSDate *date = [df dateFromString:label.text];
Does anyone know how to do it using setDateFormat ?
Thanks^^
YY is for year in week based calendars, which is used in some non-gregorian calendars. You generally should use yy instead. See the unicode reference of valid date pattern.
And you should set the locale to en_US_POSIX, to make sure that the date is parsed as a date in the english language. For example in the german locale your conversion would fail because instead of Mar 13 '15 today is März 13 '15.
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM dd ''yy"];
[df setLocale:[NSLocale localeWithLocaleIdentifier:#"en_US_POSIX"]];
You are using the wrong style of year, you need to use lowercase y.
[df setDateFormat:#"MMM d ''yy"];
Uppercase Y is documented as "Year (in "Week of Year" based calendars)." and mentions "May not always be the same value as calendar year". See:
http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns
Related
What is exact difference between 'YYYY' and 'yyyy'. I read in this link, it states that
A common mistake is to use YYYY. yyyy specifies the calendar year
whereas YYYY specifies the year (of “Week of Year”), used in the ISO
year-week calendar. In most cases, yyyy and YYYY yield the same
number, however they may be different. Typically you should use the
calendar year.
But when I try to use
NSString *stringDate = #"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(#"Date 1 : %#",date); //2013-02-28 12:00:00 +0000
NSString *stringDatee = #"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:#"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(#"Date 2 : %#",datee); //2013-01-05 12:00:00 +0000
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(#"date 3 : %#", dateString); //Jan 05, 2013 05:30PM
As here, result to date and datee different, which I understood, but why result of date 2 and date 3 are different? As I am creating date from string and reversing same to string again, but output mismatches?
Has anybody knows reason about same?. Though it specifies week of year, still I should get result same.
Thanks..
EDIT :-
If I code
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(#"date: %#", dateString); //Feb 28, 2013 04:37PM
If results me proper result, but same which I pass as string to date I get 2013-01-05 12:00:00 +0000, check date 2 of NSLog, Strange result, why?
Also when using a date format string using the correct format is important.
#"YYYY" is week-based calendar year.
#"yyyy" is ordinary calendar year.
You can go through the whole blog, its a good to give it a look
https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time
http://realmacsoftware.com/blog/working-with-date-and-time (dead link)
A common mistake is to use
YYYY. yyyy specifies the calendar year whereas YYYY specifies the year
(of “Week of Year”), used in the ISO year-week calendar. In most
cases, yyyy and YYYY yield the same number, however they may be
different. Typically you should use the calendar year.
from Apple Docs
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
(see weekly calendar December month last Monday
suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.
All answers differentiating yyyy and YYYY are right answers for another question. The question itself refers to another thing.
Why does these two values are different? (extracted from question)
NSLog(#"Date 2 : %#",datee); //2013-01-05 12:00:00 +0000
NSLog(#"Date 3 : %#", dateString); //Jan 05, 2013 05:30PM
The answer here #P.J is that they are not really different in value. When you log an NSDate (which is Date 2) you are getting the full description of your object which happens to be on UTC Timezone. This logic does not happen when logging Date 3 because it was already converted to a String and applied your Timezone.
For printing Date 3 the 'same way' as you are getting Date 2. You should specify UTC TimeZone for Date 3. Something like this :
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:#"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(#"date 3 : %#", dateString);
Hope this helps.
tl;dr the Timezone
I have NSDate with value 2015-12-27 +0000 and when I convert this NSDate to NSString with format MMM, YYYY I am getting:
NSString as Dec, 2016
This is because the capital Y in your date format specifies the year in the ISO week date system, not the Gregorian calendar.
I imagine your code may look something like:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:#"MMM, YYYY"];
NSLog(#"Date: %#", [df stringFromDate:yourDate]);
Instead try using the format:
[df setDateFormat:#"MMM, yyyy"];
When using format strings such as this to specify your output format, NSDateFormatter uses the conventions from Unicode Technical Standard #35 (which describes the difference between Y and y if you want more detail).
I found this weird issue, when converting from string to a NSDate. The final date is wrong by exactly 2 or 3 hours (possible an integer number of hours). My data has an excellent quality as it was picked from other ios devices programmatically. For example when I try to convert:
"2014-05-23 03:14:04 a.m. +0000"
I get:
2014-05-23 00:14:04 +0000
or, when converting:
"2014-05-23 02:49:30 a.m. +0000"
I get:
2014-05-23 00:49:30 +0000
The date format is in Spanish and therefore my code is:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:#"en_US"]];
[dateFormatter setDateFormat:#"yyyy-MM-dd HH:mm:ss a ZZZ"];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:#"es"]];
[dateFormatter setAMSymbol:#"a.m."]; // default AM symbol for spanish is a.m.
[dateFormatter setPMSymbol:#"p.m."]; // default PM symbol for spanish is p.m.
// Set the date format for the input string
[dateFormatter setDateFormat:#"yyyy-MM-dd HH:mm:ss a ZZZ"];
newEvent.time = [dateFormatter dateFromString:[timeArray objectAtIndex:i]];
according to:
https://stackoverflow.com/a/13757666/2394901
but with a modification for a.m. and p.m. instead of AM and PM because that way the answer is nil.
UPDATE:
This issue is not due to time zone difference as suggested below. Instead the proper solution is:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:#"es"]];
[dateFormatter setDateFormat:#"yyyy-MM-dd hh:mm:ssa ZZZ"];
newEvent.time = [dateFormatter dateFromString:[timeArray objectAtIndex:i]];
**the problem is the capital letters HH, should be hh.
Anybody knows when should letters must by capitalized?
What is exact difference between 'YYYY' and 'yyyy'. I read in this link, it states that
A common mistake is to use YYYY. yyyy specifies the calendar year
whereas YYYY specifies the year (of “Week of Year”), used in the ISO
year-week calendar. In most cases, yyyy and YYYY yield the same
number, however they may be different. Typically you should use the
calendar year.
But when I try to use
NSString *stringDate = #"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(#"Date 1 : %#",date); //2013-02-28 12:00:00 +0000
NSString *stringDatee = #"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:#"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(#"Date 2 : %#",datee); //2013-01-05 12:00:00 +0000
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(#"date 3 : %#", dateString); //Jan 05, 2013 05:30PM
As here, result to date and datee different, which I understood, but why result of date 2 and date 3 are different? As I am creating date from string and reversing same to string again, but output mismatches?
Has anybody knows reason about same?. Though it specifies week of year, still I should get result same.
Thanks..
EDIT :-
If I code
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(#"date: %#", dateString); //Feb 28, 2013 04:37PM
If results me proper result, but same which I pass as string to date I get 2013-01-05 12:00:00 +0000, check date 2 of NSLog, Strange result, why?
Also when using a date format string using the correct format is important.
#"YYYY" is week-based calendar year.
#"yyyy" is ordinary calendar year.
You can go through the whole blog, its a good to give it a look
https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time
http://realmacsoftware.com/blog/working-with-date-and-time (dead link)
A common mistake is to use
YYYY. yyyy specifies the calendar year whereas YYYY specifies the year
(of “Week of Year”), used in the ISO year-week calendar. In most
cases, yyyy and YYYY yield the same number, however they may be
different. Typically you should use the calendar year.
from Apple Docs
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
(see weekly calendar December month last Monday
suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.
All answers differentiating yyyy and YYYY are right answers for another question. The question itself refers to another thing.
Why does these two values are different? (extracted from question)
NSLog(#"Date 2 : %#",datee); //2013-01-05 12:00:00 +0000
NSLog(#"Date 3 : %#", dateString); //Jan 05, 2013 05:30PM
The answer here #P.J is that they are not really different in value. When you log an NSDate (which is Date 2) you are getting the full description of your object which happens to be on UTC Timezone. This logic does not happen when logging Date 3 because it was already converted to a String and applied your Timezone.
For printing Date 3 the 'same way' as you are getting Date 2. You should specify UTC TimeZone for Date 3. Something like this :
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:#"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:#"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(#"date 3 : %#", dateString);
Hope this helps.
tl;dr the Timezone
I have set the locale and timezone but when I format the date, I always get invalid date. The month is always December and year is one less that the specified year. In my case I dont need the day component.
I checked other similar post but it didn't solved the problem.
Any help is appreciated. Thank you.
Here is the code:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:#"en_US"] autorelease];
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:#"GMT"];
[dateFormatter setDateFormat:#"MMM YYYY"];
NSDate *formattedDate = [dateFormatter dateFromString:#"Sep 2013"];
NSLog(#"Date: %#", [dateFormatter stringFromDate:formattedDate]);
[dateFormatter release]; dateFormatter = nil;
OUTPUT: Date: Dec 2012
"YYYY" format is used for "Week of Year" based calendars. Use "yyyy" format specifier instead:
[dateFormatter setDateFormat:#"MMM yyyy"];
I just wanted to add something to the great answer by Vladimir. If you do this before setting your locale, it seems that the date formatting goes crazy. What I had to do was to set the locale before setting the new format, and then use the setDateFormat to change the format based on the locale used.So something like this would do:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];//I wanted to set the locale to wherever user is using my app in
[formatter setDateFormat:#"MMM YYYY"];
NSDate *now = [NSDate Date];
NSString *fancyLookingDate = [formatter stringFromDate:now];