区域偏移为Date的Android毫秒

时间:2013-04-16 17:40:59

标签: android datetime

我目前(从服务器)有一个日期戳作为刻度返回(.NET日期)。

一般情况下,我设法通过减去10000来生成秒数并相应地偏移以获得EPOC ms。

现在,问题是从服务器传递的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; 
}

1 个答案:

答案 0 :(得分:1)

这里有一些代码在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);
}

此处无需使用Calendar

可以让它在DST过渡期间保持准确,除非它实际上是不明确的,在这种情况下你可以使它总是返回早期版本或总是返回更高版本。这样做非常繁琐,但可以做到。

通过减去标准时间的偏移量,我们已经减少了不正确的时间。基本上这段代码现在说,“减去当地时间的标准时间(没有夏令时)偏移量,得到UTC时间的近似值。现在算出那个UTC时间的偏移量。”