to.tetramorph.time
クラス JDay

java.lang.Object
  上位を拡張 to.tetramorph.time.JDay

public class JDay
extends Object

文字列表現の日付・時間・タイムゾーンから、ユリウス日を返すクラス。 ユリウス日を求める場合はつねにこのクラスを利用しスイスエフェメリスのSweDateは 使わない。
というのはユリウス日は天体や暦計算にはよく使用するので、 スイスエフェメリスに依存していると、ライセンスの問題等で不便がある。
プログラムを単純化できるという理由から、ユリウス日を求める公式は使用せず、 カレンダーのミリ秒表現から直接変換する方法を使っている。 TimePlace.getJDay()もこのクラスを呼び出している。


メソッドの概要
static double get(Calendar cal)
          カレンダーのユリウス日を返す。
static double get(int year, int month, int day)
          グレゴリオ暦年月日からユリウス日を求めて返す。
static double get(int era, int year, int month, int day, int hour, int minute, int second, TimeZone tz)
          グレゴリオ暦の日時とタイムゾーンからユリウス日を返す。
static Double get(String era, String sqlDate, String sqlTime, String tzid, String defaultTime)
          文字列での日時表現からユリウス日を返す。
static void getCalendar(double jday, Calendar cal)
          ユリウス日をカレンダーにセットする。
static GregorianCalendar getCalendar(double jday, TimeZone tz)
          ユリウス日をグレゴリオ暦に変換する。
static Calendar getJSTCalendar(int year, int month, int day)
          夏時間のない日本時間のカレンダーを返す。
static Calendar getJSTCalendar(int year, int month, int day, int hour, int minute, int second)
          夏時間のない日本時間のカレンダーを返す。
static TimeZone getJSTZone()
          夏時間判定をしない日本のTimeZoneオブジェクトを返す。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

メソッドの詳細

get

public static double get(int year,
                         int month,
                         int day)
グレゴリオ暦年月日からユリウス日を求めて返す。これはユリウス日を求める 公式を使ったメソッドで、紀元前の値を求めるときは、他のget()メソッドとは 仕様が異なるので注意。ただし多少、パフォーマンスが良いという利点もある。
紀元前1年はyear=0を指定。紀元前2年はyear=-1を指定。GregorianCalendarは 紀元前の年は1年からでERAで紀元前を判定するため、その値をこのメソッドに 渡すときは負数方式の値に変換してから入れなければならない。 時刻の指定はできず、UTCの正午つまり、xx.5の値が返る。

パラメータ:
year - グレゴリオ年
month - 1-12を指定。
day - 1-31を指定。

get

public static Double get(String era,
                         String sqlDate,
                         String sqlTime,
                         String tzid,
                         String defaultTime)
文字列での日時表現からユリウス日を返す。
to.tetramorph.starbase.Functionがこのメソッドを使用している。
HSQLDBのストアドプロシージャから引数を文字列で引き渡され、それをユリウス日 にして返す。そのため場合によっては空白もしくはnullが引き渡される事があり、 そのときはnullを返す仕組みになっている。

ただこのメソッドをこのパッケージに置くのはいかがなものか?
別パッケージに移動したほうがよくないか?

パラメータ:
era - "AD"または"BC"を指定する。
sqlDate - "2008-02-22"といったSQLでの日付文字列を指定。
sqlTime - "12:00:00"といったSQLでの時刻文字列を指定。
tzid - "UTC"や"JST"といったTimeZoneクラスがサポートするIDを指定。
defaultTime - 時刻がnullの場合に採用する地方時("hh:mm:dd")

get

public static double get(Calendar cal)
カレンダーのユリウス日を返す。 これは一般的なユリウス日の計算アルゴリズムを使わず、システムのシリアル タイムの規約に従って求める。つまり1970年1月1日UTCを基点に0として、 ミリ秒の単位で未来にインクリメント、過去にデクリメントしていく時刻系を ユリウス日に変換する。非常にシンプルにユリウス日を求める事ができる。 スイスエフェメリスのユリウス日取得メソッドとBC5400〜AD5400まで値を比較 したが、ほとんどの場合、同じ値を取得できる。 (1)注意すべきことは、カレンダーはミリ秒の精度をもっている。 Calendar.getInstance()で現在時刻を取得したとき、ミリ秒の桁にも値がはいって いて、年月日時分秒までセットしてこのメソッドでユリウス日に変換したとき、 ミリ秒の桁の値もユリウス日に反映される。 普通のユリウス日変換は、たいがい秒の桁までしか引数を取らないから、その値と 比べると、わずかにずれていると感じるかもしれない。しかしそれはミリ秒桁を リセットしていないのが原因。 (2)カレンダークラスは日本が1948年から1951年まで実施していた、 サマータイムを認識している。次の例ではきっかり1時間遅れている。
 AD 1948-05-02(日) 23:32:09
    millis = -683720871000
    sd = 2432674.1056597224
    md = 2432674.0639930554,  sd - md = 0.041666666977107525
 
ところが、Calendarクラスには、それを判定するメソッドが用意されていないのと、 TimeZone.useDaylightTimeは、この古い夏時間を認識しない。暗黙のうちに、 サマータイムの期間は1時間ずらして日時が求まる仕組みになっている。 今いちよくわかっていないのだが、これは天体位置計算では要注意である。 (3)ミリ秒桁がゼロになっている場合、ほとんどの場合はSweDate.getJulDayと 一致するが、一致しない場合のもう一つの例は次のようなもの。
 BC 4669-11-03(土) 06:53:34
    millis = -209451751586000
    sd = 16377.412199074075
    md = 16377.412199074073
 
このメソッドで夏時間に切り替わる期間を狙って、ユリウス日を求めてみると、 同じ0時でもユリウス日の値が変わる事がわかる。
 JST0時におけるユリウス日
 1948-05-01 00:00:00,2432672.125000
 1948-05-02 00:00:00,2432673.125000 (01:00から夏時間に切り替わる)
 1948-05-03 00:00:00,2432674.083333 (夏時間になった次の日、jdはずれる)
 1948-05-04 00:00:00,2432675.083333
 
末尾の桁でわずかに値が異なる。これは計算誤差によるものだが、この桁だと ピコ秒単位での違いでしかなくまったく問題にならない。
 日本でのサマータイム実施は1949-1951年でCalendar.getInstance()などで取得した
 デフォルトのタイムゾーンのカレンダーに、この期間の日付をセットしてを渡すと、
 このメソッドは1時間の時差を考慮した値をこのメソッドは返す。
 1948-05-02(日) 01:00   1948-09-12 00:00(日)
 1949-04-03(日) 01:00   1949-09-11 00:00(日)
 1950-05-07(日) 01:00   1950-09-10 00:00(日)
 1951-05-06(日) 01:00   1951-09-09 00:00(日)
  
日本における天体計算では、このような夏時間は邪魔になることが多い。これを回避 するためにはTimeZoneをUTCで取得後、setRawOffsetで32400000をセットし、 そのオブジェクトをCalendarにセットすればいい。


get

public static double get(int era,
                         int year,
                         int month,
                         int day,
                         int hour,
                         int minute,
                         int second,
                         TimeZone tz)
グレゴリオ暦の日時とタイムゾーンからユリウス日を返す。

パラメータ:
era - GregorianCalendar.ADまたはBC。
year - 年
month - 月(0-11)
day - 日
hour - 時
minute - 分
second - 秒
tz - TimeZoneオブジェクト

getCalendar

public static GregorianCalendar getCalendar(double jday,
                                            TimeZone tz)
ユリウス日をグレゴリオ暦に変換する。年月日の月は1〜12。

パラメータ:
jday - ユリウス日
tz - タイムゾーン

getCalendar

public static void getCalendar(double jday,
                               Calendar cal)
ユリウス日をカレンダーにセットする。 カレンダーのインスタンスに、ユリウス日を与えて時刻を変更したい場合に使用する。

パラメータ:
jday - セットするユリウス日
cal - セットされるカレンダー

getJSTZone

public static TimeZone getJSTZone()
夏時間判定をしない日本のTimeZoneオブジェクトを返す。


getJSTCalendar

public static Calendar getJSTCalendar(int year,
                                      int month,
                                      int day,
                                      int hour,
                                      int minute,
                                      int second)
夏時間のない日本時間のカレンダーを返す。返却されるカレンダーのタイムゾーンは 内部的に作成されたものがセットされ、ゾーンIDは"JST/UTC-9"である。 ロケールはデフォルトの設定にまかせる。

戻り値:
夏時間の補正のない、日本時間とロケールをもったカレンダー。

getJSTCalendar

public static Calendar getJSTCalendar(int year,
                                      int month,
                                      int day)
夏時間のない日本時間のカレンダーを返す。返却されるカレンダーのタイムゾーンは 内部的に作成されたものがセットされ、ゾーンIDは"JST/UTC-9"である。 ロケールはnew Locale("ja","JP")で作成されたものがセットされている。

戻り値:
夏時間の補正のない、日本時間とロケールをもったカレンダー。