0

我目前(从服务器)有一个以刻度(.NET 日期)形式返回的日期戳。

一般来说,我设法通过减去 10000 来转换上述内容以产生秒并相应地偏移以获得 EPOC 毫秒。

现在,问题是从服务器传递的 ms 包括区域偏移量,我需要做的是获取区域的 TimeZone 对象(始终相同)并从原始值中减去 ms 偏移量(取决于 DST)以产生正确获取日期的新对象。

没有这么多转换的任何更好的方法?

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 回答