swift日期相減 - timeintervalsince1970




日期/時間自然語言在Swift中的近似值 (2)

我試圖將一個UTC格式的日期從一個API轉換為人類可讀的近似格式使用Swift。

我正在尋找像下面這樣的東西:

2015-07-14T13:51:05.423Z

大約兩週前

Swift中最好的方法是什麼? 雖然最佳這可以直接格式化字符串,我明白,這可能需要將字符串轉換為一個NSDate對象。

任何幫助將不勝感激。

編輯:我的問題已被確定為另一個問題的可能重複。 下面的湯姆的解決方案是為Swift編寫的,比創建一個關於我的情況的新方法要優雅得多。


你需要兩個步驟。 首先,將你的日期字符串轉換為一個NSDate

let dateString = "2015-07-14T13:51:05.423Z"

let df = NSDateFormatter()
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = df.dateFromString(dateString)

(如果這不是你得到的字符串的確切表示,你將不得不改變日期格式字符串來獲得這個轉換)。

接下來,使用NSDateComponentsFormatter來獲得你想要的字符串:

let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full
formatter.includesApproximationPhrase = true
formatter.includesTimeRemainingPhrase = false
formatter.allowedUnits = NSCalendarUnit.WeekOfMonthCalendarUnit

if let pastDate = date {
    let dateRelativeString = formatter.stringFromDate(pastDate, toDate: NSDate())
}

今天是7月28日,所以這個字符串的結果是“大約2週”。 allowedUnits屬性是一個位字段,因此您可以指定任意數量的單位類型。


正如Tom Harrington的答案所指出的那樣,您可以使用NSDateComponentsFormatter生成一個時間或時間間隔的口語化表示。

然而,如果你想要正確地完成問題中的問題,那就是在過去的時間裡,相對於當前的時刻 ,像面向時間線的UI那樣產生一個口頭表達 ,那麼NSDateComponentsFormatter就好像是不合適。 正如stringFromTimeInterval(_:)的文檔所述,時間間隔值“必須是有限數字,負數字在創建字符串時被視為正數”。

就我所知,最好的選擇是TTTTimeIntervalFormatter ,它是Mattt Thompson的FormatterKit中的一個獨立類。

我已經生成了一個Xcode 7 TTTTimeIntervalFormatterRelativeDatePlayground ,它將NSDateFormatter輸出的輸出與TTTTimeIntervalFormatter進行比較。 這是一個表格,顯示不同相對時間的輸出,以秒為單位。 正如你所看到的, NSDateComponentsFormatter似乎沒有處理過去的時刻或現在的時刻:

        -1488010 |               2 weeks ago |         -1 week remaining
        -1468800 |               2 weeks ago |         -1 week remaining
         -864000 |                1 week ago |       0 seconds remaining
          -86400 |                 1 day ago |          -1 day remaining
          -36000 |              10 hours ago |       -10 hours remaining
           -3600 |                1 hour ago |         -1 hour remaining
            -600 |            10 minutes ago |     -10 minutes remaining
             -60 |              1 minute ago |       -1 minute remaining
             -10 |            10 seconds ago |     -10 seconds remaining
              -1 |              1 second ago |       -1 second remaining
              -0 |                  just now |       0 seconds remaining
               0 |                  just now |       0 seconds remaining
               1 |         1 second from now |        1 second remaining
              10 |       10 seconds from now |      10 seconds remaining
              60 |         1 minute from now |        1 minute remaining
             600 |       10 minutes from now |      10 minutes remaining
            3600 |           1 hour from now |          1 hour remaining
           36000 |         10 hours from now |        10 hours remaining
           86400 |            1 day from now |           1 day remaining
          864000 |           1 week from now |          1 week remaining
         1468800 |          2 weeks from now |         2 weeks remaining
         1488010 |          2 weeks from now |         2 weeks remaining




swift2