0

現在、(サーバーから) ティック (.NET 日付) として返される日付スタンプがあります。

一般に、10000 を減算して秒を生成し、それに応じてオフセットして EPOC ミリ秒を取得することで、上記を変換することができました。

ここでの問題は、サーバーから渡されたミリ秒にゾーン オフセットが含まれていることです。私がする必要があるのは、ゾーンの TimeZone オブジェクトを取得し (常に同じ)、元の値からミリ秒オフセット (DST に応じて) を減算して生成することです。 Date を適切に取得するための新しいオブジェクト。

多くの変換なしでこれを行うより良い方法はありますか?

private static long netEpocTicksConv = 621355968000000000L;
public static Date dateTimeLongToDate(long ticks) {
    TimeZone greeceTz = TimeZone.getTimeZone("Europe/Athens");
    Calendar cal0 = new GregorianCalendar(greeceTz); 

    long time = (ticks - netEpocTicksConv)/ 10000;
    time -= greeceTz.getOffset(time);
    cal0.setTimeInMillis(time);

    Date res = cal0.getTime();

    return res; 
}
4

1 に答える 1

2

DST トランジションの近くで正しく動作しないコードを次に示します。

private static final long DOTNET_TICKS_AT_UNIX_EPOCH = 621355968000000000L;
private static final TimeZone GREECE = TimeZone.getTimeZone("Europe/Athens");

public static Date dateTimeLongToDate(long ticks) {

    long localMillis = (ticks - DOTNET_TICKS_AT_UNIX_EPOCH) / 10000L;

    // Note: this does the wrong thing near DST transitions
    long offset = GREECE.getOffset(localMillis - GREECE.getRawOffset());
    long utcMillis = localMillis - offset;
    return new Date(utcMillis);
}

ここでa を使用する必要はありませんCalendar

実際にあいまいでない限り、DST 移行の前後で正確にすることができます。あいまいな場合は、常に以前のバージョンを返すか、常に新しいバージョンを返すようにすることができます。それを行うのは面倒ですが、それは可能です。

標準時間のオフセットを差し引くことで、すでに不正確になる時間を短縮しています。基本的に、このコードは、「現地時間から標準時間 (夏時間なし) のオフセットを差し引いて、UTC 時間の近似値を取得します。次に、その UTC 時間でのオフセットを計算します。」と述べています。

于 2013-04-16T18:21:03.867 に答える