17

jdayクライアント側の検証を行うために、JavaScriptで計算する必要がありますJDAY.JavaScriptまたはスクリプトで計算して、指定されたJDAYを実際の日付に、またはその逆に変更する方法を教えてください。

JDayとは何か知りたくて見つけたサイトは、

http://www.pauahtun.org/Software/jday.1.html

JAVAで言及されている計算については、以下のサイトも参照しています

http://www.rgagnon.com/javadetails/java-0506.html

前もって感謝します

4

8 に答える 8

31

ユリウス日

ユリウスは、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 }

于 2012-08-01T13:16:04.167 に答える
14

new Date().getTime()/86400000 + 2440587.5 UNIXタイムスタンプを取得し、それを日数に変換して、UNIXタイムスタンプのエポックである1970-01-01のJDを追加します。

これは、天文学者がユリウス日と呼ぶものです。それは明確に定義されています。UnixタイムスタンプもJDもうるう秒を考慮していないため、精度が低下することはありません。JDはタイムゾーンUTCである必要はないことに注意してください(ただし、通常はそうです)。この回答により、タイムゾーンUTCでのJDが得られます。

于 2012-08-01T13:13:54.840 に答える
6

ウィキペディアによると:

a = (14 - month) / 12
y = year + 4800 - a
m = month + 12a - 3
JDN = day + (153m + 2) / 5 + 365y + y/4 - y/100 + y/400 - 32045

実装に関してより具体的な問題が発生している場合は、質問でそれらの詳細を提供してください。

注:Wikiの「山かっこ」はここで忘れられているため、これは正しくありません。

正しい式は次のとおりです。

a = Int((14 - Month) / 12)
y = Year + 4800 - a
m = Month + 12 * a - 3
JDN = Day + Int((153 * m + 2) / 5) + 365 * y + Int(y / 4) - Int(y / 100) + Int(y / 400) - 32045
于 2012-08-01T13:13:52.637 に答える
1

受け入れられた回答で指定された最終コードが間違っているようです。米国海軍天文台の Web サイトで「公式」オンライン計算機を確認してください。

http://aa.usno.navy.mil/data/docs/JulianDate.php

回答時間とカレンダーの正解を知っている人がいたら、それは USNO です。

于 2017-03-27T11:44:05.933 に答える