【问题标题】:Time/Date from NSDate to show just like Message and Mail app in iOSNSDate 的时间/日期显示就像 iOS 中的消息和邮件应用程序一样
【发布时间】:2014-02-10 01:50:27
【问题描述】:

我正在构建一个应用程序,如果对象是在 24 小时之前创建的,则需要我显示时间和日期,例如星期日等。就像 iOS 中的消息和邮件应用程序会显示 24 小时的时间,而不是将其更改为显示日期'星期一,星期二..'。我正在寻找是否可以找到任何与此完全相同的框架,还是我必须为此编写代码?

【问题讨论】:

  • 我不能只需要在 TableViewCell 中显示它,就像 iOS 中的邮件和消息应用程序一样
  • 只需使用两种可能的日期格式之一 (NSDateFormatter),具体取决于日期的新近程度。
  • @rmaddy 我认为您的评论更有意义。到目前为止,我的代码只给了我时间。我如何利用这段时间知道它是否在 24 小时之前,如果是,我如何得到像星期一、星期二这样的日子?如果你能用一些例子来回答,那就太好了。 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"HH:mm:ss"]; NSString *timeStampStr = [dateFormatter stringFromDate:someObj.timeStamp];

标签: ios cocoa-touch nsdate


【解决方案1】:

以下是使用 Swift 4 和 5 本地完成所有操作的方法:

extension Date {

    func formatRelativeString() -> String {
        let dateFormatter = DateFormatter()
        let calendar = Calendar(identifier: .gregorian)
        dateFormatter.doesRelativeDateFormatting = true

        if calendar.isDateInToday(self) {
            dateFormatter.timeStyle = .short
            dateFormatter.dateStyle = .none
        } else if calendar.isDateInYesterday(self){
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .medium
        } else if calendar.compare(Date(), to: self, toGranularity: .weekOfYear) == .orderedSame {
            let weekday = calendar.dateComponents([.weekday], from: self).weekday ?? 0
            return dateFormatter.weekdaySymbols[weekday-1]
        } else {
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .short
        }

        return dateFormatter.string(from: self)
    }
}

【讨论】:

    【解决方案2】:

    我也需要这个,所以我写了以下 NSDate 扩展:

    extension NSDate {
    
        func formattedRelativeString() -> String {
            let dateFormatter = NSDateFormatter()
            dateFormatter.doesRelativeDateFormatting = true
    
            if isToday() {
                dateFormatter.timeStyle = .ShortStyle
                dateFormatter.dateStyle = .NoStyle
            } else if isYesterday() {
                dateFormatter.timeStyle = .NoStyle
                dateFormatter.dateStyle = .MediumStyle
            } else if daysAgo() < 6 {
                return dateFormatter.weekdaySymbols[weekday()-1]
            } else {
                dateFormatter.timeStyle = .NoStyle
                dateFormatter.dateStyle = .ShortStyle
            }
    
            return dateFormatter.stringFromDate(self)
        }
    }
    

    这需要 Matthew York 出色的 DateTools 才能发挥作用。

    【讨论】:

      【解决方案3】:

      Swift 3 版本的@avf 回复:

      extension NSDate {
          func formattedRelativeString() -> String 
          {
              let dateFormatter = DateFormatter()
              dateFormatter.doesRelativeDateFormatting = true
      
              if isToday() {
                  dateFormatter.timeStyle = .short
                  dateFormatter.dateStyle = .none
              } else if isYesterday() {
                  dateFormatter.timeStyle = .none
                  dateFormatter.dateStyle = .medium
              } else if daysAgo() < 6 {
                  return dateFormatter.weekdaySymbols[weekday()-1]
              } else {
                  dateFormatter.timeStyle = .none
                  dateFormatter.dateStyle = .short
              }
      
              return dateFormatter.string(from: self as Date)
          }
      }
      

      【讨论】:

        【解决方案4】:

        为 swift 4 更新:

         extension NSDate {
        
            func formattedRelativeString() -> String 
            {
                let dateFormatter = DateFormatter()
        
                if isInToday || isInYesterday {
                    /// today and yesterday
                    /// Today, 3:57 PM
                    dateFormatter.doesRelativeDateFormatting = true
                    dateFormatter.timeStyle = .short
                    dateFormatter.dateStyle = .short
                } else if isLessThanAweekAgo {
        
                    /// less than a week ago
                    /// Friday, 4:03 PM
                    dateFormatter.dateFormat = "EEEE, h:mm a"
                 } else if isInThisYear {
        
                    // more than a week ago
                    // Fri, 4 Aug, 3:55
                    dateFormatter.dateFormat = "E, d MMM, h:mm a"
                 } else {
                    // more than a year ago
                    // Aug 10, 2016, 3:56
                    dateFormatter.dateFormat = "MMM d, yyyy, h:mm a"
                 }
        
                return dateFormatter.string(from: self)
            }
        
        }
        

        您可以使用这些示例日期在操场上对其进行测试:

        let now = Date()
        let yesterday = Date(timeInterval: -24*60*60, since: Date())
        let weekAgo = Date(timeInterval: -7*24*60*60, since: Date())
        let yearAgo = Date(timeInterval: -366*24*60*60, since: Date())
        

        【讨论】:

          【解决方案5】:
          NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                                        dateStyle:NSDateFormatterShortStyle
                                                                        timeStyle:NSDateFormatterFullStyle];
                  NSLog(@"%@",dateString);
          

          试试这个代码,根据你的要求修改它。

          【讨论】:

            【解决方案6】:

            Objective C 格式化日期和时间。

            使用 Matthew York 出色的 DateTools 方法。

            NSDate 扩展:

            -(NSString *)formatDateTimeToString{
                NSDateFormatter* dateFormatter = [[NSDateFormatter alloc]init];
                [dateFormatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: [[NSLocale currentLocale] localeIdentifier]]];
            
                if ([[NSCalendar currentCalendar] isDateInToday:self])
                {
                    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
                    [dateFormatter setDateStyle:NSDateFormatterNoStyle];
                }
                else if ([[NSCalendar currentCalendar] isDateInYesterday:self])
                {
                    [dateFormatter setDoesRelativeDateFormatting:YES];
                    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
                    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
                }
                else if ([self daysAgo]<6)
                {
                    [dateFormatter setDateFormat:@"EEEE"];
                }
                else
                {
                    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
                    [dateFormatter setDateStyle:NSDateFormatterShortStyle];
                }
                return  [dateFormatter stringFromDate:self];
            }
            
            
            -(NSInteger)daysAgo{
                return [self daysEarlierThan:[NSDate date]];
            }
            
            -(NSInteger)daysEarlierThan:(NSDate *)date{
                return ABS(MIN([self daysFrom:date], 0));
            }
            -(NSInteger)daysFrom:(NSDate *)date{
                return [self daysFrom:date calendar:nil];
            }
            -(NSInteger)daysFrom:(NSDate *)date calendar:(NSCalendar *)calendar{
                NSDate *earliest = [self earlierDate:date];
                NSDate *latest = (earliest == self) ? date : self;
                NSInteger multiplier = (earliest == self) ? -1 : 1;
                NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:earliest toDate:latest options:0];
                return multiplier*components.day;
            }
            

            【讨论】:

              【解决方案7】:

              使用 NSDateFormatter 并将其 doesRelativeDateFormatting 属性设置为 YES。

              【讨论】:

              猜你喜欢
              • 2014-08-29
              • 2020-09-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多