2016-12-16 7 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

FYI - 'Date(timeIntervalSinceNow:-14.7 * 24 * 60 * 60) 'を使うことは、日付の計算を行うためのひどい方法です。毎日24時間ではありません。すべての時間に3600秒があるわけではありません。 'Calendar date(byAdding ...)'メソッドの1つを使用します。 – rmaddy

答えて

1

-14.7を-15として四捨五入しています。だから、あなたは2週間1日を取得しています。正しい結果を得るには、数字を適切に丸めてください。

+3

私は 'maximumUnitCount'を設定しました - フォーマッタは複数のユニットを返さないようにしてください。 –

+2

不思議です。 uを-14.5以下にするとすぐに、1つのユニットしか表示されません。それを-15にすると、1ユニットしか表示されません。 -14.5〜-14.99の間のどこかに、失敗します。新しい週の開始時にも同じことが観察されます。私は-21、-28を意味する。 – Apurv

+0

ありがとう。今すぐ参照してください。) –

3

私は、カンマ区切りのチェックとまだそれは確かに動作していない間(私はもう少し信頼性の高いソリューションを提案する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 post](https://openradar.appspot.com/26354907)は、 'maximumUnitCount = 1'がバグを示すことのみを指定しています。私は[documentation](https://developer.apple.com/reference/foundation/datecomponentsformatter/)をチェックし、セパレータに関する情報は見つけられませんでした。フォールバックは文字列全体をそのまま使用するので、これは受け入れ可能なフォールバックだと思います。 – Mknsri

+0

OK、私はほとんど同じであるので、私はあなたの答えをupvoteします。 –

0

DateFormatters出力、スウィフトにある遊び場の例をサブストリングにそれを使用することによって、問題を解決すべてのケースのために)まだ答えをお探しの方に

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]) 
} 
関連する問題