From 56e5abb2c3f22e2ee95ac1c79e96d045afb3d8c8 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 9 Jul 2018 13:20:58 -0600 Subject: [PATCH] Format date breaks to spec // FREEBIE --- .../ConversationView/Cells/OWSMessageCell.m | 19 +--- Signal/src/util/DateUtil.h | 2 + Signal/src/util/DateUtil.m | 88 +++++++++++++++++++ 3 files changed, 91 insertions(+), 18 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index dc47b1af6..48d5f8e1f 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -253,26 +253,9 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssert(self.conversationStyle); - static NSDateFormatter *dateHeaderDateFormatter = nil; - static NSDateFormatter *dateHeaderTimeFormatter = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - dateHeaderDateFormatter = [NSDateFormatter new]; - [dateHeaderDateFormatter setLocale:[NSLocale currentLocale]]; - [dateHeaderDateFormatter setDoesRelativeDateFormatting:YES]; - [dateHeaderDateFormatter setDateStyle:NSDateFormatterMediumStyle]; - [dateHeaderDateFormatter setTimeStyle:NSDateFormatterNoStyle]; - - dateHeaderTimeFormatter = [NSDateFormatter new]; - [dateHeaderTimeFormatter setLocale:[NSLocale currentLocale]]; - [dateHeaderTimeFormatter setDoesRelativeDateFormatting:YES]; - [dateHeaderTimeFormatter setDateStyle:NSDateFormatterNoStyle]; - [dateHeaderTimeFormatter setTimeStyle:NSDateFormatterShortStyle]; - }); - if (self.viewItem.shouldShowDate) { NSDate *date = self.viewItem.interaction.dateForSorting; - NSString *dateString = [dateHeaderDateFormatter stringFromDate:date]; + NSString *dateString = [DateUtil formatDateForConversationDateBreaks:date]; self.dateHeaderLabel.font = self.dateHeaderFont; self.dateHeaderLabel.textColor = UIColor.lightGrayColor; diff --git a/Signal/src/util/DateUtil.h b/Signal/src/util/DateUtil.h index 3a5974a21..fe9631812 100644 --- a/Signal/src/util/DateUtil.h +++ b/Signal/src/util/DateUtil.h @@ -34,6 +34,8 @@ NS_ASSUME_NONNULL_BEGIN + (NSString *)exemplaryNowTimeFormat; + (NSString *)exemplaryMinutesTimeFormat; ++ (NSString *)formatDateForConversationDateBreaks:(NSDate *)date; + + (BOOL)isSameDayWithTimestamp:(uint64_t)timestamp1 timestamp:(uint64_t)timestamp2; + (BOOL)isSameDayWithDate:(NSDate *)date1 date:(NSDate *)date2; diff --git a/Signal/src/util/DateUtil.m b/Signal/src/util/DateUtil.m index 28aece134..ad9c954bf 100644 --- a/Signal/src/util/DateUtil.m +++ b/Signal/src/util/DateUtil.m @@ -25,6 +25,64 @@ static NSString *const DATE_FORMAT_WEEKDAY = @"EEEE"; return formatter; } ++ (NSDateFormatter *)dateBreakRelativeDateFormatter +{ + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale currentLocale]; + formatter.dateStyle = NSDateFormatterShortStyle; + formatter.timeStyle = NSDateFormatterNoStyle; + formatter.doesRelativeDateFormatting = YES; + }); + + return formatter; +} + ++ (NSDateFormatter *)dateBreakThisWeekDateFormatter +{ + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale currentLocale]; + // "Monday", "Tuesday", etc. + formatter.dateFormat = @"EEEE"; + }); + + return formatter; +} + ++ (NSDateFormatter *)dateBreakThisYearDateFormatter +{ + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale currentLocale]; + // Tue, Jun 6 + formatter.dateFormat = @"EE, MMM d"; + }); + + return formatter; +} + ++ (NSDateFormatter *)dateBreakOldDateFormatter +{ + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale currentLocale]; + formatter.dateStyle = NSDateFormatterMediumStyle; + formatter.timeStyle = NSDateFormatterNoStyle; + formatter.doesRelativeDateFormatting = YES; + }); + + return formatter; +} + + (NSDateFormatter *)weekdayFormatter { static NSDateFormatter *formatter; static dispatch_once_t onceToken; @@ -83,6 +141,17 @@ static NSString *const DATE_FORMAT_WEEKDAY = @"EEEE"; return dayDifference > 0; } ++ (BOOL)dateIsOlderThanYesterday:(NSDate *)date +{ + return [self dateIsOlderThanYesterday:date now:[NSDate date]]; +} + ++ (BOOL)dateIsOlderThanYesterday:(NSDate *)date now:(NSDate *)now +{ + NSInteger dayDifference = [self daysFromFirstDate:date toSecondDate:now]; + return dayDifference > 1; +} + + (BOOL)dateIsOlderThanOneWeek:(NSDate *)date { return [self dateIsOlderThanOneWeek:date now:[NSDate date]]; @@ -206,6 +275,25 @@ static NSString *const DATE_FORMAT_WEEKDAY = @"EEEE"; return dateTimeString.localizedUppercaseString; } ++ (NSString *)formatDateForConversationDateBreaks:(NSDate *)date +{ + OWSAssert(date); + + if (![self dateIsThisYear:date]) { + // last year formatter: Nov 11, 2017 + return [self.dateBreakOldDateFormatter stringFromDate:date]; + } else if ([self dateIsOlderThanOneWeek:date]) { + // this year formatter: Tue, Jun 23 + return [self.dateBreakThisYearDateFormatter stringFromDate:date]; + } else if ([self dateIsOlderThanYesterday:date]) { + // day of week formatter: Thursday + return [self.dateBreakThisWeekDateFormatter stringFromDate:date]; + } else { + // relative format: Today / Yesterday + return [self.dateBreakRelativeDateFormatter stringFromDate:date]; + } +} + + (NSString *)formatTimestampAsTime:(uint64_t)timestamp { return [self formatDateAsTime:[NSDate ows_dateWithMillisecondsSince1970:timestamp]];