"today 2 hours ago" and "yesterday at 4 PM" in one formatter
LDOConditionalDateFormatter *formatter = [LDOConditionalDateFormatter new];
[formatter addFormat:@"just now" forTimeInterval:-10];
[formatter addFormat:@"R" forTimeInterval:-3600];
[formatter addFormat:@"{HH:mm}" for:LDOTimeUnitToday];
[formatter addFormat:@"I" for:LDOTimeUnitYesterday];
[formatter addFormat:@"R" forLast:7 unit:LDOTimeUnitDays];
formatter.defaultFormat = @"{yMd}";
[formatter stringForTimeIntervalFromDate:secondsAgo toReferenceDate:now];
// = just now
[formatter stringForTimeIntervalFromDate:minutesAgo toReferenceDate:now];
// = 42 minutes ago
[formatter stringForTimeIntervalFromDate:earlierToday toReferenceDate:now];
// = 13:37
[formatter stringForTimeIntervalFromDate:yesterday toReferenceDate:now];
// = yesterday
[formatter stringForTimeIntervalFromDate:threeDaysAgo toReferenceDate:now];
// = 3 days ago
[formatter stringForTimeIntervalFromDate:longAgo toReferenceDate:now];
// = 2/11/2015or
LDOConditionalDateFormatter *formatter = [LDOConditionalDateFormatter new];
[formatter addFormat:@"I R" for:LDOTimeUnitToday];
[formatter addFormat:@"I at {h}" for:LDOTimeUnitYesterday];
[formatter stringForTimeIntervalFromDate:twoHoursAgo toReferenceDate:now];
// = today 2 hours ago
[formatter stringForTimeIntervalFromDate:yesterdayAt4pm toReferenceDate:now];
// = yesterday at 4 PMLDOConditionalDateFormatter is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "LDOConditionalDateFormatter"-
(NSString *)stringForTimeIntervalFromDate:(NSDate *)date toReferenceDate:(NSDate *)referenceDateFormats the given date. For relative and idiomatic formats, the time difference between the given date and the reference date is used.
-
(NSString *)stringForTimeIntervalFromDate:(NSDate *)dateAlso formats the given date. The current date is used as reference date.
-
(NSString *)stringForTimeInterval:(NSTimeInterval)secondsThe given time interval is interpreted as offset from now. The calculated date is formatted. The current date is used as reference date.
Ifor idiomatic expressions like "yesterday" or "next month"Rfor relative expressions like "2 weeks ago" or "1 day from now"RRRRrepeat up to 7Rto specify the number of significant units.RRyields expressions like "2 days 13 hours ago"~Rprepend~to anyRformat to add an approximate qualifier as in "about 4 hours ago", if the time difference isn't exact{HH:mm}for usual date formatting. You can use anything you'd normally set on[NSDateFormatter -setDateFormat:]. UnlikeIandR, these patterns need to be wrapped in curly braces.{hm}for date formatting templates. Date formatting patterns that only consists of placeholders (no colons, spaces etc) will be used as template. Templates are converted to date formats using[NSDateFormatter +dateFormatFromTemplate:options:locale:]with regard to the set locale.
Formats can be added using one of four flavours.
-
addFormat:(NSString *)format forTimeInterval:(NSTimeInterval)timeIntervalAdds a format to be used if the difference between a date and the reference date lies in the given time interval.
-
addFormat:(NSString *)format for:(LDOTimeUnit)unitAdds a format to be used for a specific time unit. The time unit needs to be a relative time unit like
LDOTimeUnitToday,LDOTimeUnitSameWeekorLDOTimeNextYear. Check out the header for a complete list. -
addFormat:(NSString *)format forLast:(NSUInteger)count unit:(LDOTimeUnit)unitAdds a format for a relative time span in the past. The time unit should be
LDOTimeUnitDays,LDOTimeUnitWeeks,LDOTimeUnitMonthsorLDOTimeUnitYears. -
addFormat:(NSString *)format forNext:(NSUInteger)count unit:(LDOTimeUnit)unitSame as 3., but for a time span in the future.
The formats are checked in the same order they are added. If two formats satisfy the condition for a date, the date will be formatted with the one added first. Only one format will be applied.
If no format matches the condition for a given date, a default format will be used (if specified).
The library provides localization for many languages. If you want to customize a string, simply add it to your own localization and it will be used instead of the bundled translation.
However that does not mean the localizations are perfect yet. Please check how to contribute
The pod contains a bunch of unit tests trying to prove things work as they should. They are also good to illustrate the usage. To run them, clone the repo, and run pod install from the Example directory first.
Based on @mattt's work on FormatterKit and everybody who contributed there. Go check it out, maybe it better suits your needs.
Issues and pull requests are always welcome! The localizations probably need improvements the most. So please check, correct and provide translations. The following keys are still missing for most languages:
- today
- this week
- this month
- this year
twine is used to manage all translations in a single strings.txt file. If you want to regenerate the .strings files youself, use the following command from inside the Assets folder: twine generate-all-localization-files strings.txt ./ --format apple --file-name LDOConditionalDateFormatter.strings --create-folders --developer-language en --include all
Sebastian Ludwig, sebastian@lurado.de
LDOConditionalDateFormatter is available under the MIT license. See the LICENSE file for more info.