ユリウス日
ユリウス日は、7980 年周期の開始からの経過日数です。
Joseph Scaliger によって 1583 年に発明されたシステムの目的は、ある暦日と別の暦日の間の整数(整数)の差を簡単に計算できるようにすることです。
7980 年サイクルは、7980 が公倍数であるいくつかの伝統的な時間サイクル(太陽、月、および特定のローマ税サイクル)を組み合わせることによって導き出されました。
最初のユリウス周期の開始点は、紀元前 4713 年 1 月 1 日正午 GMT に始まり、3268 年 1 月 22 日正午 GMT に終了します。ちょうど 7980 日後です。
たとえば、2016 年 1 月 1 日のユリウス日は 2,457,389 で、これはその日の紀元前 4713 年 1 月 1 日からの日数です。
計算方法
Unix 時間は 1970 年 1 月 1 日 00:00:00 UTC からの秒数であり、閏秒はカウントされず、エポックとも呼ばれます。時間。
GMT と UTC は実際には同じ現在時刻を共有しているため、違いはありません。
まず、ユリウス周期が始まってから Unix タイムスタンプが始まるまでの日数を知る必要があります。
つまり、紀元前 4713 年 1 月 1 日 12:00:00 GMT から 1970 年 1 月 1 日 00:00:00 UTC までの日数です。
決して変わらないこの設定された日数を使用して、1970 年 1 月 1 日から今日までの日数を加算するだけで、JavaScript が返すものであり、ユリウス日を取得できます。
これらすべての年を合計せずに、単純に Web を検索すると、紀元前 4713 年と西暦 1970 年の間の日数の差は 2440588 日であり、ユリウス周期は真夜中ではなく正午に始まったので、次のようにする必要があります。ちょうど半日を引くと、2440587.5 日になります。
だから私たちが今持っているのは2440587.5 days + UNIX TIME in days === Julian Day
簡単な計算で、1 日の長さは 86,400 秒であり、Javascript を使用する場合の Unix タイムスタンプはミリ秒単位であるUNIX TIME / 86400000
ことがわかります。したがって、1970 年 1 月 1 日木曜日から今日までの日数が得られます。
ちょうどその日のために、小数ではなく整数の日数が必要でした。
Math.floor((UNIX TIME / 86400000) + 2440587.5);
ジュリアン・デイト
プログラミングでは、「ユリウス日」は年が始まってからの日数を意味することがあります。たとえば、2016 年 6 月 1 日はその年の 152 日などです。
「ユリウス日」の正しい使用法は、1 日の小数部分としてタイムスタンプが追加されたユリウス日です。
2016 年 1 月 1 日がユリウス日 2,457,389 であったこの回答の上部にある例を取り上げると、それに時間を追加できます。
ユリウス日は正午に始まり、端数は追加されないため、真夜中2457389.5
は 18:00、または正午から 6 時間後は2457389.25
、「半日」、「1 日の 4 分の 1」などを追加して 18:00 になります。 .
計算すると、また
これは、0.1 ユリウス日が 24 時間を 10 で割った値と同じであることを意味24 / 10 === 2.4 hours
します。つまり、ユリウス日のタイムスタンプは小数点以下(1 日の 10 分の 1 など)です。
いくつかの Javascript 関数を見てみましょう。まずDate
コンストラクターです。
Javascript は、それが実行されているコンピューターのローカル時間にしかアクセスできないため、その場合new Date()
、UNIX 時間が UTC であっても、必ずしも UTC 日付を作成する必要はなく、new Date
エポックからコンピューターのローカル時間までの秒数が得られます。タイムゾーンを考慮していません。
ただし、Javascript には がありDate.UTC
、日付を UTC 形式で返すため、違いを確認できます。これはもちろん、ローカル システムに設定したタイムゾーンによって異なります。
var regular_date = new Date(2016, 1, 1, 0, 0, 0);
var UTC_date = Date.UTC(2016, 1, 1, 0, 0, 0);
var difference = UTC_date - regular_date;
document.body.innerHTML = 'The difference between your local time and UTC is ' +(difference/1000)+ ' seconds';
この章の冒頭の部分を思い出してください。約 0.1 ユリウス日は、24 時間を 10 で割ったものと同じです。つまり24 / 10 === 2.4 hours
、2.4 時間は 144 分です。次に、JavascriptsgetTimezoneOffset()
メソッドを簡単に見てみましょう。
getTimezoneOffset() メソッドは、現在のロケールの UTC からのタイムゾーン オフセットを分単位で返します。
したがって、システムのタイムゾーンのオフセットを分単位で返します。これは、日付を処理するほとんどの JavaScript メソッドがミリ秒を返すため、興味深いことです。
1 日 10 分の 1 は 144 分であることはわかっているので、10 分の 1、つまり 1 日全体は 1440 分になります。正しい小数値を取得するための 1 日の分数
だから今、私たちは持っています
2440587.5 days + UNIX TIME in days === Julian Day
そして、Javascripts Date コンストラクターは実際には現在の日付に UTC を使用するのではなく、システム時刻を使用することを知っているので、
TIMEZONEOFFSET / 1440
それらを一緒に結合すると、
(JAVASCRIPT TIME / 86400000) - (TIMEZONEOFFSET / 1440) + 2440587.5
// ^^ days since epoch ^^ ^^ subtract offset ^^ ^^days from 4713 B.C. to 1970 A.D.
それをjavascriptに翻訳すると
var date = new Date(); // a new date
var time = date.getTime(); // the timestamp, not neccessarely using UTC as current time
var julian_day = (time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5);
これは、ユリウス日を取得するためにも使用する必要があるものであり、タイムゾーン オフセットを削除する手段を講じます。もちろん、ユリウス日の小数部分は使用しません。
これを行うには、最も近い整数に単純に切り捨てます。
var julian_date = Math.floor((time / 86400000) - (date.getTimezoneOffset()/1440) + 2440587.5));
そして、コメント欄での苦情の後、なぜこれが正しいアプローチであるかを説明するためにこの非常に長い編集を行う前に、この質問に対する私の最初の答えの時間です.
Date.prototype.getJulian = function() {
return Math.floor((this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5);
}
var today = new Date(); //set any date
var julian = today.getJulian(); //get Julian counterpart
console.log(julian)
.as-console-wrapper {top:0}
そして、小数部と同じ
Date.prototype.getJulian = function() {
return (this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5;
}
var today = new Date(); //set any date
var julian = today.getJulian(); //get Julian counterpart
console.log(julian)
.as-console-wrapper { top: 0 }
最後に、理由を示す例
new Date().getTime()/86400000 + 2440587.5
少なくとも、システム時間がオフセットのあるタイムゾーン、つまり GMT 以外に設定されている場合は機能しません
// the correct approach
Date.prototype.getJulian = function() {
return (this / 86400000) - (this.getTimezoneOffset() / 1440) + 2440587.5;
}
// the simple approach, that does not take the timezone into consideration
Date.prototype.notReallyJulian = function() {
return this.getTime()/86400000 + 2440587.5;
}
// --------------
// remember how 18:00 should return a fractional 0.25 etc
var date = new Date(2016, 0, 1, 18, 0, 0, 0);
// ^ ^ ^ ^ ^ ^ ^
// year month date hour min sec milli
var julian = date.getJulian(); //get Julian date
var maybe = date.notReallyJulian(); // not so much
console.log(julian); // always returns 2457389.25
console.log(maybe); // returns different fractions, depending on timezone offset
.as-console-wrapper { top: 0 }