2015年4月16日木曜日

[C#]DateTimeから恒星時を計算する

DateTimeOffset型から恒星時を計算します
DateTimeOffset型を与えることにより、現地時と協定時を区別することができ、タイムゾーンに紛らわされることがありません
もっとも、戻り値のTime型はタイムゾーンを考慮していないので、経度0度(グリニッジ)以外の場合は引数を受け取った後で適切に処理する必要があります

一応それらしい数字が出てきますが、本当にこの処理で正しいのかは不明です

class Time {
    public int Hour;
    public int Minute;
    public float Second;

    public Time() {
        Hour = 0;
        Minute = 0;
        Second = 0;
    }

    public Time(int Hour, int Minute, float Second) {
        this.Hour = Hour;
        this.Minute = Minute;
        this.Second = Second;
    }

    public override string ToString() {
        return (Hour.ToString() + "h " + Minute.ToString() + "m " + Second.ToString("0.0") + "s");
    }
}

Time Date2GST(DateTimeOffset Date) {
    DateTime dt = Date.UtcDateTime;
    int Year = dt.Year;
    int Month = dt.Month;
    int Day = dt.Day;
    int Hour = dt.Hour;
    int Minute = dt.Minute;

    if (Month <= 2) {
        Month += 12;
        Year--;
    }

    double MJD;
    MJD = (Math.Floor(365.25 * Year) + Math.Floor(Year / 400.0) - Math.Floor(Year / 100.0)) + Math.Floor(30.59 * (Month - 2)) + Day - 678912;
    MJD += (Hour / 24.0) + (Minute / 1440.0) - 0.375;

    double LST = (0.671262 + 1.0027379094 * (MJD - 40000));
    LST = (LST - Math.Floor(LST)) * 24;

    Time ret = new Time();
    ret.Hour = (int)LST;
    LST -= (int)LST;
    LST *= 60;
    ret.Minute = (int)LST;
    LST -= (int)LST;
    LST *= 60;
    ret.Second = (float)LST;

    return (ret);
}

0 件のコメント:

コメントを投稿