Использование другой начальной даты для эпохи - PullRequest
3 голосов
/ 05 апреля 2011

Все,

Я работаю с двоичной спецификацией, поля TimeStamp которой определены как «Миллисекунды с 1 января 2000 года по UTC времени».Я делаю следующее вычисление:

public static final TimeZone UTC = TimeZone.getTimeZone("UTC") ;
public static final Calendar Y2K_EPOCH = Calendar.getInstance(UTC);
static {
    Y2K_EPOCH.clear();
    // Month is 0 based; day is 1 based.  Reset time to be first second of January 1, 2000
    Y2K_EPOCH.set(2000, 0, 1, 0, 0, 0);
}
public static final long MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH = Y2K_EPOCH.getTimeInMillis();

public static long getMillisecondsSinceY2K(Date date) {
    long time = date.getTime();
    if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH) {
        throw new IllegalArgumentException("Date must occur after January 1, 2000");
    }
    return time - MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH;
}

Мой вопрос: правильный ли это способ преобразования между стандартными объектами Java Date и этим типом данных?Есть ли лучший способ сделать это?Я знаю о времени Joda, но я бы не стал вносить эту внешнюю зависимость, если смогу помочь.

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Хорошо выглядит для меня.

Обратите внимание, что вы можете изменить

long time = date.getTime();
if (time < MS_BETWEEN_ORIGINAL_EPOCH_AND_Y2K_EPOCH)
    ...

на

if (date.before(Y2K_EPOCH))
    ...

Что касается вашего беспокойства о високосных секундах, вот выдержкаДокументы:

Хотя класс Date предназначен для отражения универсального координированного времени (UTC), он может делать это не совсем точно, в зависимости от среды хоста виртуальной машины Java.Почти все современные операционные системы предполагают, что 1 день = 24 × 60 × 60 = 86400 секунд во всех случаях.В UTC, однако, примерно раз в год или два появляется дополнительная секунда, называемая «високосной секундой».Дополнительная секунда дня всегда добавляется как последняя секунда дня и всегда 31 декабря или 30 июня. Например, последняя минута 1995 года была длиной 61 секунда, благодаря добавленной дополнительной секунде.Большинство компьютерных часов недостаточно точны, чтобы отражать разницу в секунду.

0 голосов
/ 05 апреля 2011

Время - сложный беспорядок, особенно время UTC.Предполагая, что вы хотите довольно хорошее время, основанное на произвольной эпохе, простое вычитание, подобное тому, что вы делаете, должно быть хорошо.Если вы беспокоитесь о точности високосных секунд, я настоятельно рекомендую вам использовать Joda или какую-нибудь надежную внешнюю библиотеку.

...