DateFormatter date(from:)
メソッドが特定の日付のいくつかを解析できないことが判明しました。メソッドは、1981年〜1984年の第1四半期にnil
を返します。それは財団の不具合ですか?そのような日付の解析を実行するために私たちは何ができますか?80年1月4日がiOS 10.0で解析できません
Xcode 8.0、iOS SDK 10.0。ここでは、短い遊び場の例のスクリーンショットです:
DateFormatter date(from:)
メソッドが特定の日付のいくつかを解析できないことが判明しました。メソッドは、1981年〜1984年の第1四半期にnil
を返します。それは財団の不具合ですか?そのような日付の解析を実行するために私たちは何ができますか?80年1月4日がiOS 10.0で解析できません
Xcode 8.0、iOS SDK 10.0。ここでは、短い遊び場の例のスクリーンショットです:
それが(例えば参照年1981年から1984年にモスクワでそうであったよう昼間は、 深夜に開始正確に時間を節約する場合、この問題が発生しますClock Changes in Moscow, Russia (Moskva))。
これはまた
例えばで観察され、4月1日1984年深夜に、クロックはその日を意味し、1つ前の時間を調整しました。 "1984-04-01 00:00" は、そのタイムゾーンに存在しません:
let dFmt = DateFormatter()
dFmt.dateFormat = "yyyy-MM-dd"
dFmt.timeZone = TimeZone(identifier: "Europe/Moscow")
print(dFmt.date(from: "1984-04-01")) // nil
ソリューションとして、あなたは「寛大」であることを日付フォーマッタを伝えることができます。
dFmt.isLenient = true
し、それはその日の最初の有効な日付を返します。
dFmt.isLenient = true
if let date = dFmt.date(from: "1984-04-01") {
dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
print(dFmt.string(from: date))
}
// 1984-04-01 01:00:00
A different solution が与えられましたこれは、日付フォーマッタを のデフォルト日付として深夜の代わりにの代わりにを使用するようにすることです。 Objective-CからSwiftへのRobのコードの翻訳は次のとおりです。
let noon = DateComponents(calendar: dFmt.calendar, timeZone: dFmt.timeZone,
year: 2001, month: 1, day: 1, hour: 12, minute: 0, second: 0)
dFmt.defaultDate = noon.date
if let date = dFmt.date(from: "1984-04-01") {
dFmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
print(dFmt.string(from: date))
}
// 1984-04-01 12:00:00
あなたはどのタイムゾーンにいますか?その日に夏時間が始まったのですか? –
これはFoundationのバグではありません。私はこれらの日付の正しい値を得ることができます。これは動作しない特定の設定(タイムゾーン、グレゴリオンカレンダーなど)のようです。私はロンドンからテストしています。 –
いいえ、それはFoundationのバグではありません。タイムゾーンとカレンダーを変更してみてください。あなたの問題を解決するはずです。 – Wolverine