Quick Guide to Objective-C DateFormatting
The class NSDateFormatter allows us to define the date format of the textual representation of the date and time in iOS/Cocoa.
Below is a summary of the most commonly used specifiers used in the date format string (keep in mind that they are case sensitive):
- y = year
- Q = quarter
- M = month
- w = week of year
- W = week of month
- d = day of the month
- D = day of year
- E = day of week
- a = period (AM or PM)
- h = hour (1-12)
- H = hour (0-23)
- m = minute
- s = second
In general, the number of characters in a specifier determine the size of date field. Let’s use an example to illustrate date formatting.
eg. Input date = 2011-05-01 Sunday
1-character = 1-digit/character number or word (if number/word can’t be 1 character long then abbreviation or fullname is displayed).
[dateFormatter setDateFormat:@"E, d M y"]; // Output: Sun, 1 5 2011
2-character = 2-digit/character number or word (if number/word can’t be 2 character long then abbreviation is displayed).
[dateFormatter setDateFormat:@"EE, dd MM yy"]; // Output: Sun, 01 05 11
3-character = 3-digit/character number or word, or abbreviation (generally).
[dateFormatter setDateFormat:@"EEE, ddd MMM yyy"]; // Output: Sun, 001 May 2011
4-character = full name (generally).
[dateFormatter setDateFormat:@"EEEE, dddd MMMM yyyy"]; // Output: Sunday, 0001 May 2011
Here’s the weird part though, if you specify 5 E’s, you get an rather unexpected output. You would think that the output date field would be longer than 1 character:
[dateFormatter setDateFormat:@"EEEEE, ddddd MMMMM yyyyy"]; // Output: S, 00001 M 2011
For date formatting, the following reference table has been very useful:
Date Field Symbol Table - UTS #35 Unicode Locale Data Markup Language
Written by Samuel Chow
Related protips
2 Responses
As side note, to anyone who doesn't know, date formatters should be reused as much as possible. Also changing the date format is almost as costly as creating a new date formatter so it is often wise to create multiple instances with different date formats.
That's a good point. I usually instantiate NSDateFormatter as a static variable especially if I know that the date format is static and pre-defined.
NSString *getDateStringFromDate(NSDate *date) {
static NSDateFormatter *dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[NSDateFormatter alloc] init];
// Output: 2011-05-01 13:15:08
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
});
return [dateFormatter stringFromDate:date];
}