Ios 如何以-[Today 10:01:20]、[08-jan-17 11:20:51]等格式获取日期和时间?

Ios 如何以-[Today 10:01:20]、[08-jan-17 11:20:51]等格式获取日期和时间?,ios,nsdate,datetime-format,Ios,Nsdate,Datetime Format,我正在开发聊天应用程序,我想以特定格式发送日期/时间,比如今天、昨天和日期。如何按照此格式显示 - (NSString *)relativeDateStringForDate:(NSDate *)date { NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear

我正在开发聊天应用程序,我想以特定格式发送日期/时间,比如今天、昨天和日期。如何按照此格式显示

  - (NSString *)relativeDateStringForDate:(NSDate *)date
   {
      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 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";
     }
   }

我使用上面的函数来获取日期,但我想要组合字符串中的日期时间。那么如何将日期/时间组合到上述方法中呢?是否可以向此方法发送日期时间字符串?

要以
[08-jan-17 11:20:51]
格式获取日期,可以使用以下代码

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// Convert to new Date Format
[dateFormatter setDateFormat:@"dd-MMM-yy HH:mm:ss"];
NSDate *date = [NSDate date];
NSString *newDate = [dateFormatter stringFromDate:date]
NSLog(@"[%@]",newDate); // this will give you the date in format [08-jan-17 11:20:51]
// Convert to new Time Format
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDate *date = [NSDate date];
NSString *newTime = [dateFormatter stringFromDate:date];
NSLog(@"%@",newTime); // this will give you the time in format 10:01:20
要以
[10:01:20]
格式获取时间,可以使用以下代码

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// Convert to new Date Format
[dateFormatter setDateFormat:@"dd-MMM-yy HH:mm:ss"];
NSDate *date = [NSDate date];
NSString *newDate = [dateFormatter stringFromDate:date]
NSLog(@"[%@]",newDate); // this will give you the date in format [08-jan-17 11:20:51]
// Convert to new Time Format
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDate *date = [NSDate date];
NSString *newTime = [dateFormatter stringFromDate:date];
NSLog(@"%@",newTime); // this will give you the time in format 10:01:20
所以你可以像这样使用你的代码-

- (NSString *)relativeDateStringForDate:(NSDate *)date
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    // Convert to new Date Format
    [dateFormatter setDateFormat:@"dd-MMM-yy HH:mm:ss"];
    NSString *newDate = [dateFormatter stringFromDate:date];
    NSLog(@"[%@]",newDate);


    // Convert to new Time Format
    [dateFormatter setDateFormat:@"HH:mm:ss"];
    NSString *newTime = [dateFormatter stringFromDate:date];
    NSLog(@"%@",newTime);


    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 ago], [%@]", (long)components.year, newDate];
    } else if (components.month > 0) {
        return [NSString stringWithFormat:@"[%ld months ago], [%@]", (long)components.month, newDate];
    } else if (components.weekOfYear > 0) {
        return [NSString stringWithFormat:@"[%ld weeks ago], [%@]", (long)components.weekOfYear, newDate];
    } else if (components.day > 0) {
        if (components.day > 1) {
            return [NSString stringWithFormat:@"[%ld days ago], [%@]", (long)components.day, newDate];
        } else {
            return [NSString stringWithFormat:@"[Yesterday %@]",newTime];
        }
    } else
    {
        return [NSString stringWithFormat:@"[Today %@]", newTime];
    }
}

以下是几点观察:

  • 您想要的是
    NSCalendarUnitWeekOfMonth
    ,而不是
    NSCalendarUnitWeekOfYear

  • 为了区分“今天”和“昨天”,您不能只获取两个
    NSDate
    对象之间的日期组件。您应该首先获取两个日期的日期组件(而不是时间组件),然后获取这两组日期组件之间的差异

    事实上,如果是上午9点,而你看到的是昨晚11点的一条消息,它会计算出这一天
    - (NSString *)relativeDateStringForDate:(NSDate *)date {
        NSCalendarUnit units = NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitMonth | NSCalendarUnitYear;
        NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
        formatter.allowedUnits = units;
        formatter.maximumUnitCount = 2;
        formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
        return [NSString stringWithFormat:@"%@ %@", [formatter stringFromDate:date toDate:[NSDate date]], NSLocalizedString(@"ago", @"x days _ago_")];
    }