Je veux convertir nsdate au format relatif comme "Today","Yesterday","a week ago","a month ago","a year ago","date as it is"
.
J'ai écrit méthode suivante pour elle .. mais certains comment son impression juste comme il est date .. pouvez-vous s'il vous plaît dites-moi quel devrait être le problème?
// Voici ma fonction qui convertit la date en chaîne relative
+(NSString *)getDateDiffrence:(NSDate *)strDate{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.timeStyle = NSDateFormatterMediumStyle;
df.dateStyle = NSDateFormatterShortStyle;
df.doesRelativeDateFormatting = YES;
NSLog(@"STRING DATEEE : %@ REAL DATE TODAY %@",[df stringFromDate:strDate],[NSDate date]);
return [df stringFromDate:strDate];
}
J'ai une chaîne de date au format "2013-10-29T09:38:00"
suivant
Lorsque j'ai essayé de donner l'objet NSDate, il me renvoie toujours la date null.
J'ai donc essayé de convertir cette date en yyyy-MM-dd HH:mm:ssZZZZ
, puis je passe cette date pour qu'elle fonctionne, puis il ne fait qu'imprimer la date entière ..
Comment résoudre ce problème?
// Voici le code que j'appelle la fonction ci-dessus
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSDate *date = [formatter dateFromString:[threadDict objectForKey:@"lastMessageDate"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZZZZ"];
NSString *date1 = [formatter stringFromDate:date];
NSDate *date_d = [formatter dateFromString:date1];
NSString *resultstr=[UserManager getDateDiffrence:date];
self.dateLabel.text=resultstr;
Pour simplifier, je suppose que les dates que vous formatez sont toutes du passé (pas de "demain" ou "la semaine prochaine"). Ce n'est pas que cela ne peut pas être fait, mais il y aurait plus de cas à traiter et plus de chaînes à renvoyer.
Vous pouvez utiliser components:fromDate:toDate:options:
avec n'importe quelle combinaison de composants de date que vous recherchez pour obtenir le nombre d'années, de mois, de semaines, de jours, d'heures, etc. entre deux dates. En les passant ensuite par ordre croissant du plus significatif (par exemple année) au moins significatif (par exemple jour), vous pouvez formater une chaîne basée uniquement sur le composant le plus significatif.
Par exemple: une date d'il y a 1 semaine, 2 jours et 7 heures est formatée "1 semaine".
Si vous souhaitez créer des chaînes spéciales pour un numéro spécial d'une unité, comme "demain" pour "il y a 1 jour", vous pouvez vérifier la valeur de ce composant après avoir déterminé qu'il s'agit du composant le plus significatif.
Le code ressemblerait à ceci:
- (NSString *)relativeDateStringForDate:(NSDate *)date
{
NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear |
NSCalendarUnitMonth | NSCalendarUnitYear;
// if `date` is before "now" (i.e. in the past) then the components will be positive
NSDateComponents *components = [[NSCalendar currentCalendar] components:units
fromDate:date
toDate:[NSDate date]
options:0];
if (components.year > 0) {
return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
} else if (components.month > 0) {
return [NSString stringWithFormat:@"%ld months ago", (long)components.month];
} else if (components.weekOfYear > 0) {
return [NSString stringWithFormat:@"%ld weeks ago", (long)components.weekOfYear];
} else if (components.day > 0) {
if (components.day > 1) {
return [NSString stringWithFormat:@"%ld days ago", (long)components.day];
} else {
return @"Yesterday";
}
} else {
return @"Today";
}
}
Si vos dates peuvent également être ultérieures, vous pouvez vérifier la valeur absolue des composants dans le même ordre, puis vérifier si le résultat est positif ou négatif pour renvoyer les chaînes appropriées. Je ne montre que l'année ci-dessous:
if ( abs(components.year > 0) ) {
// year is most significant component
if (components.year > 0) {
// in the past
return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
} else {
// in the future
return [NSString stringWithFormat:@"In %ld years", (long)components.year];
}
}
Mise à jour rapide, grâce à la réponse objective-c de David Rönnqvist, cela fonctionnera pour les dates passées.
func relativeDateStringForDate(date : NSDate) -> NSString {
let todayDate = NSDate()
let units: NSCalendarUnit = [.Hour, .Day, .Month, .Year, .WeekOfYear]
let components = NSCalendar.currentCalendar().components(units, fromDate: date , toDate: todayDate, options: NSCalendarOptions.MatchFirst )
let year = components.year
let month = components.month
let day = components.day
let hour = components.hour
let weeks = components.weekOfYear
// if `date` is before "now" (i.e. in the past) then the components will be positive
if components.year > 0 {
return NSString.init(format: "%d years ago", year);
} else if components.month > 0 {
return NSString.init(format: "%d months ago", month);
} else if components.weekOfYear > 0 {
return NSString.init(format: "%d weeks ago", weeks);
} else if (components.day > 0) {
if components.day > 1 {
return NSString.init(format: "%d days ago", day);
} else {
return "Yesterday";
}
} else {
return NSString.init(format: "%d hours ago", hour);
}
}
Voici ma réponse (en Swift 3!) Et pourquoi c'est meilleur.
func datePhraseRelativeToToday(from date: Date) -> String {
// Don't use the current date/time. Use the end of the current day
// (technically 0h00 the next day). Apple's calculation of
// doesRelativeDateFormatting niavely depends on this start date.
guard let todayEnd = dateEndOfToday() else {
return ""
}
let calendar = Calendar.autoupdatingCurrent
let units = Set([Calendar.Component.year,
Calendar.Component.month,
Calendar.Component.weekOfMonth,
Calendar.Component.day])
let difference = calendar.dateComponents(units, from: date, to: todayEnd)
guard let year = difference.year,
let month = difference.month,
let week = difference.weekOfMonth,
let day = difference.day else {
return ""
}
let timeAgo = NSLocalizedString("%@ ago", comment: "x days ago")
let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale.autoupdatingCurrent
formatter.dateStyle = .medium
formatter.doesRelativeDateFormatting = true
return formatter
}()
if year > 0 {
// sample output: "Jan 23, 2014"
return dateFormatter.string(from: date)
} else if month > 0 {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .brief // sample output: "1mth"
formatter.allowedUnits = .month
guard let timePhrase = formatter.string(from: difference) else {
return ""
}
return String(format: timeAgo, timePhrase)
} else if week > 0 {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .brief; // sample output: "2wks"
formatter.allowedUnits = .weekOfMonth
guard let timePhrase = formatter.string(from: difference) else {
return ""
}
return String(format: timeAgo, timePhrase)
} else if day > 1 {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .abbreviated; // sample output: "3d"
formatter.allowedUnits = .day
guard let timePhrase = formatter.string(from: difference) else {
return ""
}
return String(format: timeAgo, timePhrase)
} else {
// sample output: "Yesterday" or "Today"
return dateFormatter.string(from: date)
}
}
func dateEndOfToday() -> Date? {
let calendar = Calendar.autoupdatingCurrent
let now = Date()
let todayStart = calendar.startOfDay(for: now)
var components = DateComponents()
components.day = 1
let todayEnd = calendar.date(byAdding: components, to: todayStart)
return todayEnd
}
N'oubliez pas de réutilisez vos formateurs pour éviter toute perte de performances! Astuce: les extensions sur DateFormatter et DateComponentsFormatter sont de bonnes idées.
Cette réponse a été inspirée par DateTools sur GitHub.
POUR: Swift 3
Voici une version de Swift 3, pour les dates antérieures, qui gère toutes les unités et les singuliers ou les pluriels dans la chaîne renvoyée.
Exemple d'utilisation:
let oneWeekAgo = Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date())!
print(relativePast(for: oneWeekAgo)) // output: "1 week ago"
Je l'ai basé sur un riff de Saurabh Yadav. Merci.
func relativePast(for date : Date) -> String {
let units = Set<Calendar.Component>([.year, .month, .day, .hour, .minute, .second, .weekOfYear])
let components = Calendar.current.dateComponents(units, from: date, to: Date())
if components.year! > 0 {
return "\(components.year!) " + (components.year! > 1 ? "years ago" : "year ago")
} else if components.month! > 0 {
return "\(components.month!) " + (components.month! > 1 ? "months ago" : "month ago")
} else if components.weekOfYear! > 0 {
return "\(components.weekOfYear!) " + (components.weekOfYear! > 1 ? "weeks ago" : "week ago")
} else if (components.day! > 0) {
return (components.day! > 1 ? "\(components.day!) days ago" : "Yesterday")
} else if components.hour! > 0 {
return "\(components.hour!) " + (components.hour! > 1 ? "hours ago" : "hour ago")
} else if components.minute! > 0 {
return "\(components.minute!) " + (components.minute! > 1 ? "minutes ago" : "minute ago")
} else {
return "\(components.second!) " + (components.second! > 1 ? "seconds ago" : "second ago")
}
}
Pour éviter le problème de 24 heures mentionné par Budidino dans la réponse de David, je l'ai modifié pour que ceci ressemble à ceci:
- (NSString *)relativeDateStringForDate:(NSDate *)date
{
NSCalendarUnit units = NSDayCalendarUnit | NSWeekOfYearCalendarUnit |
NSMonthCalendarUnit | NSYearCalendarUnit ;
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components1 = [cal components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components1];
components1 = [cal components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay) fromDate:date];
NSDate *thatdate = [cal dateFromComponents:components1];
// if `date` is before "now" (i.e. in the past) then the components will be positive
NSDateComponents *components = [[NSCalendar currentCalendar] components:units
fromDate:thatdate
toDate:today
options:0];
if (components.year > 0) {
return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
} else if (components.month > 0) {
return [NSString stringWithFormat:@"%ld months ago", (long)components.month];
} else if (components.weekOfYear > 0) {
return [NSString stringWithFormat:@"%ld weeks ago", (long)components.weekOfYear];
} else if (components.day > 0) {
if (components.day > 1) {
return [NSString stringWithFormat:@"%ld days ago", (long)components.day];
} else {
return @"Yesterday";
}
} else {
return @"Today";
}
}
Fondamentalement, il crée 2 nouvelles dates sans horodatage inclus. Ensuite, la comparaison est faite pour la différence "jours".
check NSDate-TimeAgo , il prend également en charge plusieurs langues.
Vous devrez élaborer cette logique vous-même. Vous devrez déterminer le nombre de jours entre ces deux dates.
Voici une approche relativement naïve:
+ (NSString *) dateDifference:(NSDate *)date
{
const NSTimeInterval secondsPerDay = 60 * 60 * 24;
NSTimeInterval diff = [date timeIntervalSinceNow] * -1.0;
// if the difference is negative, then the given date/time is in the future
// (because we multiplied by -1.0 to make it easier to follow later)
if (diff < 0)
return @"In the future";
diff /= secondsPerDay; // get the number of days
// if the difference is less than 1, the date occurred today, etc.
if (diff < 1)
return @"Today";
else if (diff < 2)
return @"Yesterday";
else if (diff < 8)
return @"Last week";
else
return [date description]; // use a date formatter if necessary
}
C'est naïf pour un certain nombre de raisons:
Cependant, cela devrait au moins vous aider à aller dans la bonne direction. De même, évitez d’utiliser get
dans les noms de méthodes. L'utilisation de get
dans un nom de méthode indique généralement que l'appelant doit fournir son propre tampon de sortie. Considérons la méthode NSArray
, getItems:range:
et la méthode NSString
, getCharacters:range:
.
NSString* AgoStringFromTime(NSDate* dateTime)
{
NSDictionary *timeScale = @{@"sec" :@1,
@"min" :@60,
@"hr" :@3600,
@"day" :@86400,
@"week" :@605800,
@"month":@2629743,
@"year" :@31556926};
NSString *scale;
int timeAgo = 0-(int)[dateTime timeIntervalSinceNow];
if (timeAgo < 60) {
scale = @"sec";
} else if (timeAgo < 3600) {
scale = @"min";
} else if (timeAgo < 86400) {
scale = @"hr";
} else if (timeAgo < 605800) {
scale = @"day";
} else if (timeAgo < 2629743) {
scale = @"week";
} else if (timeAgo < 31556926) {
scale = @"month";
} else {
scale = @"year";
}
timeAgo = timeAgo/[[timeScale objectForKey:scale] integerValue];
NSString *s = @"";
if (timeAgo > 1) {
s = @"s";
}
return [NSString stringWithFormat:@"%d %@%@", timeAgo, scale, s];
}
Voici le code que j'ai créé pour mon usage:
+ (NSString*) getTimestampForDate:(NSDate*)date {
NSDate* sourceDate = date;
// Timezone Offset compensation (optional, if your target users are limited to a single time zone.)
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
// Timestamp calculation (based on compensation)
NSCalendar* currentCalendar = [NSCalendar currentCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
NSDateComponents *differenceComponents = [currentCalendar components:unitFlags fromDate:destinationDate toDate:[NSDate date] options:0];//Use `date` instead of `destinationDate` if you are not using Timezone offset correction
NSInteger yearDifference = [differenceComponents year];
NSInteger monthDifference = [differenceComponents month];
NSInteger dayDifference = [differenceComponents day];
NSInteger hourDifference = [differenceComponents hour];
NSInteger minuteDifference = [differenceComponents minute];
NSString* timestamp;
if (yearDifference == 0
&& monthDifference == 0
&& dayDifference == 0
&& hourDifference == 0
&& minuteDifference <= 2) {
//"Just Now"
timestamp = @"Just Now";
} else if (yearDifference == 0
&& monthDifference == 0
&& dayDifference == 0
&& hourDifference == 0
&& minuteDifference < 60) {
//"13 minutes ago"
timestamp = [NSString stringWithFormat:@"%ld minutes ago", (long)minuteDifference];
} else if (yearDifference == 0
&& monthDifference == 0
&& dayDifference == 0
&& hourDifference == 1) {
//"1 hour ago" EXACT
timestamp = @"1 hour ago";
} else if (yearDifference == 0
&& monthDifference == 0
&& dayDifference == 0
&& hourDifference < 24) {
timestamp = [NSString stringWithFormat:@"%ld hours ago", (long)hourDifference];
} else {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
NSString* strDate, *strDate2 = @"";
if (yearDifference == 0
&& monthDifference == 0
&& dayDifference == 1) {
//"Yesterday at 10:23 AM", "Yesterday at 5:08 PM"
[formatter setDateFormat:@"hh:mm a"];
strDate = [formatter stringFromDate:date];
timestamp = [NSString stringWithFormat:@"Yesterday at %@", strDate];
} else if (yearDifference == 0
&& monthDifference == 0
&& dayDifference < 7) {
//"Tuesday at 7:13 PM"
[formatter setDateFormat:@"EEEE"];
strDate = [formatter stringFromDate:date];
[formatter setDateFormat:@"hh:mm a"];
strDate2 = [formatter stringFromDate:date];
timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];
} else if (yearDifference == 0) {
//"July 4 at 7:36 AM"
[formatter setDateFormat:@"MMMM d"];
strDate = [formatter stringFromDate:date];
[formatter setDateFormat:@"hh:mm a"];
strDate2 = [formatter stringFromDate:date];
timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];
} else {
//"March 24 2010 at 4:50 AM"
[formatter setDateFormat:@"d MMMM yyyy"];
strDate = [formatter stringFromDate:date];
[formatter setDateFormat:@"hh:mm a"];
strDate2 = [formatter stringFromDate:date];
timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];
}
}
return timestamp;
}
Ceci est juste une copie d'une réponse précédente, mais renvoie Just now
s'il reste moins de cinq secondes.
func relativePast(for date : Date) -> String {
let units = Set<Calendar.Component>([.year, .month, .day, .hour, .minute, .second, .weekOfYear])
let components = Calendar.current.dateComponents(units, from: date, to: Date())
if components.year! > 0 {
return "\(components.year!) " + (components.year! > 1 ? "years ago" : "year ago")
} else if components.month! > 0 {
return "\(components.month!) " + (components.month! > 1 ? "months ago" : "month ago")
} else if components.weekOfYear! > 0 {
return "\(components.weekOfYear!) " + (components.weekOfYear! > 1 ? "weeks ago" : "week ago")
} else if (components.day! > 0) {
return (components.day! > 1 ? "\(components.day!) days ago" : "Yesterday")
} else if components.hour! > 0 {
return "\(components.hour!) " + (components.hour! > 1 ? "hours ago" : "hour ago")
} else if components.minute! > 0 {
return "\(components.minute!) " + (components.minute! > 1 ? "minutes ago" : "minute ago")
} else {
return "\(components.second!) " + (components.second! > 5 ? "seconds ago" : "Just Now".replacingOccurrences(of: "0", with: "")
}
}
Le problème avec doesRelativeDateFormatting
est qu’il est plutôt limité à Yesterday
, Today
, Tomorrow
. Si vous cherchez quelque chose de plus complet, jetez un œil à les réponses ici .
Code complet des dates futures
NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear |
NSCalendarUnitMonth | NSCalendarUnitYear;
NSDateComponents *components = [[NSCalendar currentCalendar] components:units fromDate:date toDate:[NSDate date] options:0];
if (components.year < 0) {
return [NSString stringWithFormat:@"%ld years from now", labs((long)components.year)];
} else if (components.month < 0) {
return [NSString stringWithFormat:@"%ld months from now", labs((long)components.month)];
} else if (components.weekOfYear < 0) {
return [NSString stringWithFormat:@"%ld weeks from now", labs((long)components.weekOfYear)];
} else if (components.day < 0) {
if (components.day < 1) {
return [NSString stringWithFormat:@"%ld days from now", labs((long)components.day)];
} else {
return @"Tomorrow";
}
}
else if (components.year > 0) {
return [NSString stringWithFormat:@"%ld years ago", (long)components.year];
} else if (components.month > 0) {
return [NSString stringWithFormat:@"%ld months ago", (long)components.month];
} else if (components.weekOfYear > 0) {
return [NSString stringWithFormat:@"%ld weeks ago", (long)components.weekOfYear];
} else if (components.day > 0) {
if (components.day > 1) {
return [NSString stringWithFormat:@"%ld days ago", (long)components.day];
} else {
return @"Yesterday";
}
} else {
return @"Today";
}
J'ai joint la démo ici s'il vous plaît trouver sur ce lien. TimestampAgo-Demo
Merci à n00bprogrammer
Edit: - J'ai apporté des modifications à Sourcetimezone avec [NSTimeZone systemTimeZone] car, en raison du fuseau horaire statique, un problème est survenu au format GMT ou UTC. (la seconde passe en moins) et change les méthodes obsolètes.
Voici ma solution dans Swift 2 qui évite les problèmes de 24 heures en comparant deux dates avec une heure nulle.
extension NSDate {
private func dateWithZeroTime(date: NSDate) -> NSDate? {
let calendar = NSCalendar.currentCalendar()
let units: NSCalendarUnit = [.Day, .WeekOfYear, .Month, .Year]
let components = calendar.components(units, fromDate: date)
return calendar.dateFromComponents(components)
}
private func thisDay() -> NSDate? {
return self.dateWithZeroTime(self)
}
private func today() -> NSDate? {
return self.dateWithZeroTime(NSDate())
}
var relativeFormat: String? {
let today = self.today()
let thisDay = self.thisDay()
let formatter = NSDateFormatter()
formatter.dateStyle = NSDateFormatterStyle.LongStyle
let dateString = formatter.stringFromDate(self)
if nil != thisDay && nil != today {
let units: NSCalendarUnit = [.Day, .WeekOfYear, .Month, .Year]
let components = NSCalendar.currentCalendar().components(units, fromDate: thisDay!, toDate: today!, options: [])
if (components.year > 0) {
return components.year == 1 ? "A year ago, \(dateString)" : "\(components.year) years ago, \(dateString)"
} else if (components.month > 0) {
return components.month == 1 ? "A month ago, \(dateString)" : "\(components.month) months ago, \(dateString)"
} else if (components.weekOfYear > 0) {
return components.weekOfYear == 1 ? "A week ago, \(dateString)" : "\(components.weekOfYear) weeks ago, \(dateString)"
} else if (components.day > 0) {
return components.day == 1 ? "Yesterday, \(dateString)" : "\(self.dayOfTheWeek()), \(dateString)"
} else {
return "Today"
}
}
return nil
}
func dayOfTheWeek() -> String {
let weekdays = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
]
let calendar: NSCalendar = NSCalendar.currentCalendar()
let components: NSDateComponents = calendar.components(.Weekday, fromDate: self)
return weekdays[components.weekday - 1]
}
}
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
let now = NSDate()
let dateMakerFormatter = DateFormatter()
dateMakerFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss z"
let dateString = "2017-03-13 10:38:54 +0000"
let stPatricksDay = dateMakerFormatter.date(from: dateString)!
let calendar = NSCalendar.current
let components = calendar.dateComponents([.hour, .minute,.weekOfMonth,.day,.year,.month,.second], from: stPatricksDay, to: now as Date)
if components.year! > 0 {
formatter.allowedUnits = .year
} else if components.month! > 0 {
formatter.allowedUnits = .month
} else if components.weekOfMonth! > 0 {
formatter.allowedUnits = .weekOfMonth
} else if components.day! > 0 {
formatter.allowedUnits = .day
} else if components.hour! > 0 {
formatter.allowedUnits = .hour
} else if components.minute! > 0 {
formatter.allowedUnits = .minute
} else {
formatter.allowedUnits = .second
}
let formatString = NSLocalizedString("%@ ago", comment: "Used to say how much time has passed. e.g. '2 hours ago'")
let timeString = formatter.string(from: components)
String(format: formatString, timeString!)
Pour formater la "sourceDate" donnée comme "17 h 56" pour aujourd'hui, "hier" pour toute heure hier, "16 janvier" pour n'importe quel jour de la même année et "16 janvier 2014". Je poste ma propre méthode.
sourceDate = //some date that you need to take into consideration
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
NSDateComponents *sourceDateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate: sourceDate];
NSString* timestamp;
NSDateFormatter *formatSourceDate = [NSDateFormatter new];
[formatSourceDate setAMSymbol:@"AM"];
[formatSourceDate setPMSymbol:@"PM"];
//same day - time in h:mm am/pm
if (components.day == sourceDateComponents.day) {
NSLogInfo(@"time");
[formatSourceDate setDateFormat:@"h:mm a"];
timestamp = [NSString stringWithFormat:@"%@",[formatSourceDate stringFromDate:date]];
return timestamp;
}
else if (components.day - sourceDateComponents.day == 1) {
//yesterday
timestamp = NSLocalizedString(@"Yesterday", nil);
return timestamp;
}
if (components.year == sourceDateComponents.year) {
//september 29, 5:56 pm
[formatSourceDate setDateFormat:@"MMMM d"];
timestamp = [NSString stringWithFormat:@"%@",[formatSourceDate stringFromDate:date]];
return timestamp;
}
[formatSourceDate setDateFormat:@"MMMM d year"];
timestamp = [NSString stringWithFormat:@"%@",[formatSourceDate stringFromDate:date]];
return timestamp;
NSLogInfo(@"Timestamp : %@",timestamp);