1

LDAP 経由でアクセスしている Active Directory から返された結果を処理するときの日付と時刻の計算のさまざまな結果を理解しようとしています。違いのいくつかは夏時間によって引き起こされる可能性があるとどこかで読みましたか? 1601 年 1 月 1 日のカレンダーを使用して時刻を修正すると 4 時間の差が生じる理由や、Java で日を追加すると 1 時間の差が生じる理由がわかりません。答えは、生の値を変換する前にすべての計算を行う必要があるということだと思いますが、カレンダーで時刻を修正すると4時間の差がある理由はわかりません。

ここに私の例があります:

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.time.DateUtils;

public class Test {
    public static void main(String[] args) {
        Long millisecondCorrector = 10000L;
        Long epochCorrector = 11644473600000L;
        GregorianCalendar win32Epoch = new GregorianCalendar(1601, Calendar.JANUARY, 1, 0, 0, 0);

        Long maxPwdAge = -78624000000000L;
        Long pwdLastSet = 130256481664603612L;

        System.out.println("Max Password Age in milliseconds                               : " + (Math.abs(maxPwdAge) / millisecondCorrector));
        System.out.println("Max Password Age in days                                       : " + (Math.abs(maxPwdAge) / millisecondCorrector / DateUtils.MILLIS_PER_DAY));
        System.out.println("***********************************************************************************************************");
        System.out.println("Password Last Set (Static corrector)                           : " + new Date(pwdLastSet / millisecondCorrector - epochCorrector));
        System.out.println("Password Last Set (Calendar corrector)                         : " + new Date(pwdLastSet / millisecondCorrector + win32Epoch.getTimeInMillis()));
        System.out.println("***********************************************************************************************************");
        System.out.println("Password Expiration (Static corrector)                         : " + new Date((pwdLastSet + Math.abs(maxPwdAge)) / millisecondCorrector - epochCorrector));
        System.out.println("Password Expiration (Day arithmetic w/ static corrector)       : " + DateUtils.addDays(new Date(pwdLastSet / millisecondCorrector - epochCorrector), (int) (Math.abs(maxPwdAge) / millisecondCorrector / DateUtils.MILLIS_PER_DAY)));
        System.out.println("Password Expiration (Calendar corrector)                       : " + new Date((pwdLastSet + Math.abs(maxPwdAge)) / millisecondCorrector + win32Epoch.getTimeInMillis()));
        System.out.println("Password Expiration (Day arithmetic w/ calendar corrector)     : " + DateUtils.addDays(new Date(pwdLastSet / millisecondCorrector + win32Epoch.getTimeInMillis()), (int) (Math.abs(maxPwdAge) / millisecondCorrector / DateUtils.MILLIS_PER_DAY)));
    }

}

そして、ここに結果があります:

Max Password Age in milliseconds                               : 7862400000
Max Password Age in days                                       : 91
***********************************************************************************************************
Password Last Set (Static corrector)                           : Mon Oct 07 15:36:06 EDT 2013
Password Last Set (Calendar corrector)                         : Mon Oct 07 20:36:06 EDT 2013
***********************************************************************************************************
Password Expiration (Static corrector)                         : Mon Jan 06 14:36:06 EST 2014
Password Expiration (Day arithmetic w/ static corrector)       : Mon Jan 06 15:36:06 EST 2014
Password Expiration (Calendar corrector)                       : Mon Jan 06 19:36:06 EST 2014
Password Expiration (Day arithmetic w/ calendar corrector)     : Mon Jan 06 20:36:06 EST 2014

フォローアップとして、この種の計算を処理する優れたライブラリはありますか? このコードは何度も書かれているようです。

4

1 に答える 1