簡體   English   中英

swift 中未顯示秒數的兩個日期之間的差異

[英]difference between two dates not showing seconds in swift

在此處輸入圖像描述我有兩個日期格式的日期。我使用以下代碼來查找兩個日期之間的差異。

extension Date {
    /// Returns the amount of years from another date
    func years(from date: Date) -> Int {
        return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
    }
    /// Returns the amount of months from another date
    func months(from date: Date) -> Int {
        return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
    }
    /// Returns the amount of weeks from another date
    func weeks(from date: Date) -> Int {
        return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
    }
    /// Returns the amount of days from another date
    func days(from date: Date) -> Int {
        return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
    }
    /// Returns the amount of hours from another date
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
    }
    /// Returns the amount of minutes from another date
    func minutes(from date: Date) -> Int {
        return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
    }
    /// Returns the amount of seconds from another date
    func seconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
    }
    /// Returns the a custom time interval description from another date
    func offset(from date: Date) -> String {
        if years(from: date)   > 0 { return "\(years(from: date))y"   }
        if months(from: date)  > 0 { return "\(months(from: date))M"  }
        if weeks(from: date)   > 0 { return "\(weeks(from: date))w"   }
        if days(from: date)    > 0 { return "\(days(from: date))d"    }
        if hours(from: date)   > 0 { return "\(hours(from: date))h"   }
        if minutes(from: date) > 0 { return "\(minutes(from: date))m" }
        if seconds(from: date) > 0 { return "\(seconds(from: date))s" }
        return ""
    }
    func offsetLong(from date: Date) -> String {
        if years(from: date)   > 0 { return years(from: date) > 1 ? "\(years(from: date)) yrs ago" : "\(years(from: date)) yr ago" }
        if months(from: date)  > 0 { return months(from: date) > 1 ? "\(months(from: date)) mo ago" : "\(months(from: date)) mo ago" }
        if weeks(from: date)   > 0 { return weeks(from: date) > 1 ? "\(weeks(from: date)) wks ago" : "\(weeks(from: date)) wk ago"   }
        if days(from: date)    > 0 { return days(from: date) > 1 ? "\(days(from: date)) days ago" : "\(days(from: date)) day ago" }
        if hours(from: date)   > 0 { return hours(from: date) > 1 ? "\(hours(from: date)) hrs ago" : "\(hours(from: date)) hr ago"   }
        if minutes(from: date) > 0 { return minutes(from: date) > 1 ? "\(minutes(from: date)) mins ago" : "\(minutes(from: date)) min ago" }
        if seconds(from: date) > 0 { return seconds(from: date) > 1 ? "\(seconds(from: date)) secs ago" : "\(seconds(from: date)) sec ago" }
        return ""
    }
}

我已在 EDT 時區的兩個日期應用此擴展,如下所示:

let dateFormatterGet = DateFormatter()
                       // dateFormatterGet.timeZone = TimeZone(abbreviation: "UTC")
                        dateFormatterGet.dateFormat = "yyyy-MM-dd HH:mm:ss"

                        let dateFormatterPrint = DateFormatter()
                       // dateFormatterPrint.timeZone = TimeZone(abbreviation: "UTC")
                         dateFormatterPrint.dateFormat = "yyyy-MM-dd HH:mm:ss"

                        let date1: Date? = dateFormatterGet.date(from: date) as Date?
                        
                     //   print("date1 is",date1)

                                let now = Date()
                                
                                let dateFormatterGet1 = DateFormatter()
                                dateFormatterGet1.timeZone = TimeZone(abbreviation: "EDT")
                                dateFormatterGet1.dateFormat = "yyyy-MM-dd HH:mm:ss"
                                
                                let dateFormatterPrint1 = DateFormatter()
                                 dateFormatterPrint1.timeZone = TimeZone(abbreviation: "EDT")
                                 dateFormatterPrint1.dateFormat = "yyyy-MM-dd HH:mm:ss"
                                
                                let dat = dateFormatterPrint1.string(from: now) as String
                             
                                           
                                let date2: Date? = dateFormatterGet1.date(from: dat) as Date?
                              
                               let timeOffset3 = date2!.offsetLong(from: date1!)
                               
                                cell2.dateposted.text = timeOffset3

時間偏移值顯示到幾小時,而不是以分鍾或秒顯示。 誰能告訴我這個轉換有什么問題?

有一個內置的 class DateComponentsFormatter ,它將根據時間間隔或一對日期創建格式化字符串。 您可以使用所需的單位和所需的單位樣式對其進行配置,它會執行 rest。 它僅提供某些預設格式(使用 DateComponentsFormatter.UnitsStyle 指定)

如果您想以任意格式顯示兩個日期之間的差異,則可能需要使用Calendar function dateComponents(_:from:to:) function 需要兩個日期和一組您要使用的組件,並返回一個 DateComponents object。 然后,您需要編寫自定義代碼,以您想要的格式顯示DateComponents object 的值,這應該不難。

如果您在問題中解釋了您想要的 output 將會有所幫助。

好的,我看了一下圖片。 看起來您想要一個字符串,例如“3 分鍾前”“7 小時前”“三天前”、“三個月前”等。

試試這樣的代碼:

import Foundation

 var timeFormatter:DateComponentsFormatter = {
    let temp = DateComponentsFormatter()
    temp.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
    temp.maximumUnitCount = 1
    temp.unitsStyle = .full
    return temp
}()

let now = Date()

func timefromDateToNow(_ date: Date) -> String {
    if let output = timeFormatter.string(from: date, to: now) {
        return output + " ago"
    } else {
        return "error"
    }
}

enum Ranges: Int, CaseIterable {
    case seconds
    case minutes
    case hours
    case days
    case weeks
    case months
    case years
}

for _ in 1 ... 20 {
    var min: Double
    var max: Double = 0
    let range = Ranges.allCases.randomElement()!
    switch range {
    case .seconds:
        min = -59.999
    case .minutes: //0 ... 1 hours
        min = -3600
    case .hours: //0 ... 1 day
        min = -86400
    case .days: //0 ... 1 month
        min = -3600 * 24 * 31
    case .weeks:
        min = -3600 * 24 * 31
        max = -3600 * 24 * 7
    case .months:
        min = -3600 * 24 * 365
    case .years: // 0 ... 5 years
        min = -3600 * 24 * 365 * 5
    }
    let past = now.addingTimeInterval(Double.random(in: min ... max))
    print("Range = \(range): \(timefromDateToNow(past))")
}


var units: NSCalendar.Unit

//Note that all 3 methods of populating `units' yields the same value:

print("\nNow show that the order of OptionSet values does not matter:\n")
units = [.year, .second, .month, .hour]
print(units.rawValue)

units = [.second, .hour, .month, .year]
print(units.rawValue)


units = NSCalendar.Unit( rawValue:
                            NSCalendar.Unit.month.rawValue +
                            NSCalendar.Unit.year.rawValue +
                            NSCalendar.Unit.second.rawValue +
                            NSCalendar.Unit.hour.rawValue
)
print(units.rawValue)

這會生成 output ,如下所示:

Range = years: 3 years ago
Range = seconds: 56 seconds ago
Range = months: 9 months ago
Range = minutes: 27 minutes ago
Range = minutes: 34 minutes ago
Range = hours: 15 hours ago
Range = years: 1 year ago
Range = months: 2 months ago
Range = years: 1 year ago
Range = years: 3 years ago
Range = years: 3 years ago
Range = years: 3 years ago
Range = years: 2 months ago
Range = years: 2 years ago
Range = seconds: 59 seconds ago
Range = days: 6 days ago
Range = weeks: 3 weeks ago
Range = years: 11 months ago
Range = hours: 16 hours ago
Range = hours: 7 hours ago

Now show that the order of OptionSet values does not matter:

172
172
172

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM