2016-12-16 78 views
10

我所面臨的問題,爲單位時DateComponentsFormatter返回意外數字。有沒有人遇到同樣的問題?DateComponentsFormatter返回單位的錯誤數計數

import Foundation 

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full; 
formatter.maximumUnitCount = 1; 

let date = Date(timeIntervalSinceNow: -14.7 * 24 * 60 * 60) 
let dateString = formatter.string(from: date, to: Date()) // 2 weeks 1 day 

我預計會收到「2周」,但有「2周1天」。

+0

你爲什麼使用'14.7'? – shallowThought

+0

@shallowThought我已經設置了'maximumUnitCount' - 格式化程序不應該返回多個單元。 –

+0

僅供參考 - 使用'日期(timeIntervalSinceNow:-14.7 * 24 * 60 * 60)'是做日期數學的可怕方法。不是每天都有24小時。不是每個小時都有3600秒。使用'日期日期(byAdding ...)'方法之一。 – rmaddy

回答

1

你傳入-14.7這是四捨五入爲-15。所以你需要2周1天。因此,適當調整數字以獲得預期結果。

+3

存在我給自己定'maximumUnitCount' - 格式化不應返回超過一個單位。 –

+2

奇怪。只要你使它小於-14.5,它只顯示一個單位。如果你從-15開始,那麼它也只顯示1個單位。在-14.5到-14.99之間,它失敗了。同樣的觀察任何新的一週開始。我的意思是-21,-28等.. – Apurv

+0

謝謝。現在你明白了。) –

3

我通過檢查逗號分隔,並用它來串的DateFormatters輸出,在斯威夫特遊樂場例如3

// Test date 
var df = DateFormatter() 
df.dateFormat = "dd.MM.yyyy HH:mm:ss" 
df.timeZone = TimeZone(secondsFromGMT: 0) 
let fromDate = df.date(from: "01.01.2000 00:00:00") 
var timeDifference = Date().timeIntervalSince(fromDate!) 

// Setup formatter 
let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full 
formatter.includesApproximationPhrase = false 
formatter.zeroFormattingBehavior = .dropAll 
formatter.maximumUnitCount = 1 
formatter.allowsFractionalUnits = false 

// Use the configured formatter to generate the string. 
var outputString = formatter.string(from: timeDifference) ?? "" 

// Remove 2nd unit if exists 
let commaIndex = outputString.characters.index(of: ",") ?? outputString.endIndex 
outputString = outputString.substring(to: commaIndex) 

// Result 
print(outputString) 
+0

我建議檢查一些「,」出現次數取決於「maximumUnitCount」,以使它更一般。同時,是否所有語言都使用逗號分隔單位? –

+0

的[OpenRadar柱](https://openradar.appspot.com/26354907)僅指定一個'maximumUnitCount = 1'僅顯示出錯誤。我檢查了[documentation](https://developer.apple.com/reference/foundation/datecomponentsformatter/),並沒有找到關於分隔符的任何信息。後備只是使用整個字符串不變,所以我認爲這是一個可以接受的後備。 – Mknsri

+0

好吧,我會提高你的答案,因爲我幾乎一樣。 –

0

我建議多一點可靠的解決方案(雖然仍然不知道它的工作原理解決問題對於所有的情況)

let formatter = DateComponentsFormatter() 
formatter.unitsStyle = .full 
formatter.maximumUnitCount = 1 

let date = Date(timeIntervalSinceNow: -14.7 * 24 * 60 * 60) 
let dateString = formatter.string(from: date, to: Date()) ?? "" 
if let nsRange = try? NSRegularExpression(pattern: "\\A\\d* \\w*").rangeOfFirstMatch(in: dateString, options: [], range: NSRange(location: 0, length: dateString.count)), let range = Range(nsRange, in: dateString) { 
    let fixedString = String(dateString[range]) 
}