JSQMessage 从未格式化的字符串设置日期属性
JSQMessage set date attribute from unformatted String
我正在从 API
接收聊天数据,它 returns 消息的日期如下:
30 minutes ago
1 hour ago
2 weeks ago
... etc
但在 JSQMessage 中它只需要 NSDate
,我搜索并未能找到一种动态方法将其转换为没有特定格式的 NSDate
JSQMessage* message = [[JSQMessage alloc] initWithSenderId:@"3" senderDisplayName:@"Name" date:@"" text:@"msg"];
任何帮助将不胜感激。
最好更改API响应。或者,您可以使用以下功能。
-(void)getLocationDetails:(NSString *)strDiffFrmAPI{
NSDate *dateActual;
if ([strDiffFrmAPI isEqualToString:@"30 minutes ago"]) {
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMinute
value:-30
toDate:[NSDate date]
options:0];
}
else if ([strDiffFrmAPI isEqualToString:@"1 hour ago"]){
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitHour
value:-1
toDate:[NSDate date]
options:0];
}
else if ([strDiffFrmAPI isEqualToString:@"2 weeks ago"]){
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
value:(-7*2)
toDate:[NSDate date]
options:0];
}
}
我认为这不是一个好的方法。最好从 API.
获取 Date 的时间戳值
因为我无法控制 API
,所以我手动这样做了
- (int) getCountFromDisplayDate : (NSString*) date {
NSString* number = @"";
for (int i = 0;i < date.length;i ++)
if ([date characterAtIndex:i] == ' ')
break;
else
number = [NSString stringWithFormat:@"%@%c",number,[date characterAtIndex:i]];
if ([number intValue])
return [number intValue];
return 0;
}
- (NSDate*) dateForIndexPath:(NSIndexPath*) indexPath {
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @"MM/dd/yyyy"];
NSString* displayDate= _chat[indexPath.item][@"DisplayDate"];
NSString* whatWeDisplay = @"";
if ([displayDate containsString:@"ago"]) {
int count = [self getCountFromDisplayDate : displayDate] * -1;
if ([displayDate containsString:@"second"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count]];
}
else if ([displayDate containsString:@"minute"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60]];
}
else if ([displayDate containsString:@"hour"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60 * 60]];
}
else if ([displayDate containsString:@"day"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"week"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 7 * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"month"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 30 * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"year"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 365 * 30 * 24 * 60 * 60]];
}
}
else
whatWeDisplay = displayDate;
NSDate* theDate = [dateFormatter dateFromString:whatWeDisplay];
if (!theDate) {
return [NSDate date];
}
return theDate;
}
我正在从 API
接收聊天数据,它 returns 消息的日期如下:
30 minutes ago
1 hour ago
2 weeks ago
... etc
但在 JSQMessage 中它只需要 NSDate
,我搜索并未能找到一种动态方法将其转换为没有特定格式的 NSDate
JSQMessage* message = [[JSQMessage alloc] initWithSenderId:@"3" senderDisplayName:@"Name" date:@"" text:@"msg"];
任何帮助将不胜感激。
最好更改API响应。或者,您可以使用以下功能。
-(void)getLocationDetails:(NSString *)strDiffFrmAPI{
NSDate *dateActual;
if ([strDiffFrmAPI isEqualToString:@"30 minutes ago"]) {
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMinute
value:-30
toDate:[NSDate date]
options:0];
}
else if ([strDiffFrmAPI isEqualToString:@"1 hour ago"]){
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitHour
value:-1
toDate:[NSDate date]
options:0];
}
else if ([strDiffFrmAPI isEqualToString:@"2 weeks ago"]){
dateActual = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
value:(-7*2)
toDate:[NSDate date]
options:0];
}
}
我认为这不是一个好的方法。最好从 API.
获取 Date 的时间戳值因为我无法控制 API
,所以我手动这样做了- (int) getCountFromDisplayDate : (NSString*) date {
NSString* number = @"";
for (int i = 0;i < date.length;i ++)
if ([date characterAtIndex:i] == ' ')
break;
else
number = [NSString stringWithFormat:@"%@%c",number,[date characterAtIndex:i]];
if ([number intValue])
return [number intValue];
return 0;
}
- (NSDate*) dateForIndexPath:(NSIndexPath*) indexPath {
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: @"MM/dd/yyyy"];
NSString* displayDate= _chat[indexPath.item][@"DisplayDate"];
NSString* whatWeDisplay = @"";
if ([displayDate containsString:@"ago"]) {
int count = [self getCountFromDisplayDate : displayDate] * -1;
if ([displayDate containsString:@"second"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count]];
}
else if ([displayDate containsString:@"minute"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60]];
}
else if ([displayDate containsString:@"hour"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 60 * 60]];
}
else if ([displayDate containsString:@"day"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"week"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 7 * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"month"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 30 * 24 * 60 * 60]];
}
else if ([displayDate containsString:@"year"]) {
whatWeDisplay = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:count * 365 * 30 * 24 * 60 * 60]];
}
}
else
whatWeDisplay = displayDate;
NSDate* theDate = [dateFormatter dateFromString:whatWeDisplay];
if (!theDate) {
return [NSDate date];
}
return theDate;
}