【问题标题】:How to get date and time in format like - [Today 10:01:20], [08-jan-17 11:20:51] etc?如何以 [Today 10:01:20]、[08-jan-17 11:20:51] 等格式获取日期和时间?
【发布时间】:2017-01-07 15:11:18
【问题描述】:

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

  - (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";
     }
   }

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

【问题讨论】:

    标签: ios nsdate datetime-format


    【解决方案1】:

    要获取[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]
    

    要以[10:01:20] 格式获取时间,您可以使用以下代码

    // 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];
        }
    }
    

    【讨论】:

      【解决方案2】:

      几个观察:

      1. 你想要NSCalendarUnitWeekOfMonth,而不是NSCalendarUnitWeekOfYear

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

        事实上,如果现在是上午 9 点,而您正在查看昨晚 11 点的消息,它会计算出 day < 1,因此它会显示“今天晚上 11 点”(这是错误的)而不是“昨天晚上 11 点” ”。

      3. 如果您要包含“x 个月前”字符串,我建议您不要自己构建它。 Apple 有一个类可以为您执行此操作 (NSDateComponentsFormatter),并且已本地化。

      所以,把所有这些放在一起,你会得到类似的东西:

      - (NSString *)relativeDateStringForDate:(NSDate *)date {
          // get the number of days differences
      
          NSCalendarUnit units =  NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitMonth | NSCalendarUnitYear;
          NSCalendar *calendar = [NSCalendar currentCalendar];
          NSDateComponents *dateComponents = [calendar components:units fromDate:date];
          NSDateComponents *nowComponents2 = [calendar components:units fromDate:[NSDate date]];
          NSDateComponents *components = [calendar components:units fromDateComponents:dateComponents toDateComponents:nowComponents2 options:0];
          
          if (components.year > 0 || components.month > 0 || components.weekOfMonth > 0 || components.day > 1) {
              NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
              formatter.allowedUnits = units;
              formatter.maximumUnitCount = 2;    // set this to whatever you want, but 1 or 2 is often best
              formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
              return [NSString stringWithFormat:@"%@ %@", [formatter stringFromDateComponents:components], NSLocalizedString(@"ago", @"x days _ago_")];
          } else {
              // build time string
              
              NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
              formatter.timeStyle = NSDateFormatterShortStyle;
              NSString *timeString = [formatter stringFromDate:date];
              
              if (components.day == 1) {
                  return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Yesterday", @"day before today"), timeString];
              } else {
                  return [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Today", @"well, er, today"), timeString];
              }
          }
      }
      

      现在,请注意,如果日期在昨天之前,我排除了时间。如果日期字符串以任何大于天的单位来衡量,则时间没有意义(例如,时间在此字符串中没有意义:“3 个月前,上午 11:20”)。如果要包含时间,则必须包含日期(这会使这些相对的“以前”字符串变得无用)。所以你可能会摆脱这个“之前”的部分:

      - (NSString *)relativeDateStringForDate:(NSDate *)date {
          // get the number of days differences
          
          NSCalendarUnit units =  NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitMonth | NSCalendarUnitYear;
          NSCalendar *calendar = [NSCalendar currentCalendar];
          NSDateComponents *dateComponents = [calendar components:units fromDate:date];
          NSDateComponents *nowComponents2 = [calendar components:units fromDate:[NSDate date]];
          NSDateComponents *components = [calendar components: NSCalendarUnitDay fromDateComponents:dateComponents toDateComponents:nowComponents2 options:0];
                  
          if (components.day > 1) {
              // build date/time string
              
              NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
              formatter.timeStyle = NSDateFormatterShortStyle;
              formatter.dateStyle = NSDateFormatterShortStyle;
              return [formatter stringFromDate:date];
          } else {
              // build time string
              
              NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
              formatter.timeStyle = NSDateFormatterShortStyle;
              NSString *timeString = [formatter stringFromDate:date];
              
              if (components.day == 1) {
                  return [NSString stringWithFormat:@"%@, %@", NSLocalizedString(@"Yesterday", @"day before today"), timeString];
              } else {
                  return [NSString stringWithFormat:@"%@, %@", NSLocalizedString(@"Today", @"well, er, today"), timeString];
              }
          }
      }
      

      这解决了奇怪的“3 个月前,上午 11:20”问题,但话又说回来,它不再是相对日期/时间字符串。

      另一种选择是完全放弃绝对时间,只显示一个相对字符串:

      - (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_")];
      }
      

      上述示例的细节不如基本概念重要,即:

      • 在确定“今天”和“昨天”时要小心使用日期组件;
      • 在尝试创建时间字符串或日期/时间字符串时使用日期格式化程序;和
      • 在尝试构建表示已过去时间(或天数)的字符串时,请使用日期组件格式化程序。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2019-06-15
        • 2016-01-18
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        相关资源
        最近更新 更多