2017-04-21 43 views
0

DateComponentsを使用して作成した2つの日付の間隔を調べようとしています。私が最初の日付を2年前の1年前にすると、365日、0時間、0分、0秒が得られます。私が日付をさらに離れて(ここ400年)、突然私の日付は11分56秒ずれています。ここでは、コードは次のとおりです。Swift 3 2つの日付間の時間間隔のエラー

import Foundation 
var mycal = Calendar(identifier: .iso8601) 
var datum = DateComponents(year:1600, month:1, day:1, hour:12, minute:0, 
          second:0) 
let j2000 = DateComponents(year:2000, month:1, day:1, hour:12, minute:0, 
          second:0) 
let datum_date = mycal.date(from: datum) 
let j2000_date = mycal.date(from: j2000) 

let interval = mycal.dateComponents([.day, .hour, .minute, .second], from:j2000_date!, to:datum_date!) 
print("Datum: \(datum_date!)") //1600-01-01 19:48:04 +0000 
print("j2000: \(j2000_date!)") //2000-01-01 20:00:00 +0000 

は、次のツー最後の行に注意してください。コメントはプリントが生成するかを示します。私はグレゴリオ暦でも同じ問題を試しました。私は矛盾がどれくらいまで戻っているのか正確にはわかりません。私は十分に生産して戻ってきました。不思議なことに、「間隔」には正しい日数(ここでは-146097)が表示されますが、表示された日付が正しくないため、計算に必要となる可能性があります。誰にでもアイデアはありますか?

+0

エラーはありません。 –

+0

「間隔」にエラーはありませんが、11:56までに作成された日付はなぜですか?私は最初の段落を編集しました。私は間違って私の間隔がオフだと言ったが、実際に生産された日付です。ありがとう。 – Aloft

+0

カレンダーの調整。 https://en.wikipedia.org/wiki/Gregorian_calendarなぜそれが必要でしょうか? –

答えて

0

この違いは、閏年の調整に関連する可能性がありますが、それは11分と14秒の差を与えます(まだ40秒が計上されず、26秒が閏秒です)。

参照:https://www.infoplease.com/leap-year-101-next-when-list-days-calendar-years-calculation-last-rules

あなたは分と秒の精度で複数年の時間差を計算した場合の理論では、あなたが取得する必要5時間のバリエーション48分46秒ごとに3 4年のうちと4年目に11分14秒以内に取得してください。私はmacOS(Unix)がそこで扱っていることを考えているかもしれませんが、おそらく彼らは考慮する必要があると考えています(特に11分14秒が調整される400年を超える)。

このレベルの精度が必要な場合は、時間の計算の細部の詳細をお読みください。日付は内部的に数秒で保存されるため、これらの長期間にわたって正確な日時に戻るには、特別な数学的なアクロバットが必要です。

Appleのマニュアルはこちらhttps://developer.apple.com/reference/foundation/nscalendar

+0

アランに感謝しますが、本当にこれは違いを説明していません。そして、この違いは広範囲の「遠く離れた」日付にとどまっています。私はDateFormatter()を使って日付を文字列(実際には正しい時刻)として取り出し、再び日付に変換しようとしました(Leo Dabusがヒントしたように)。 Dateオブジェクトを直接印刷するのは間違っていますが、計算で値を使用できる理由については説明していません。 – Aloft

関連する問題