Структура окон FILETIME включает секунды прыжка?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

18
задан Matt Johnson-Pint 30 October 2018 в 20:17
поделиться

6 ответов

Вопроса не должно быть, если FILETIME включает дополнительные секунды.

Это должно быть:

Включают ли люди, функции и библиотеки, которые интерпретируют FILETIME (т. е. FileTimeToSystemTime) дополнительные секунды при подсчете длительности?

Простой ответ: "нет". FileTimeToSystemTime возвращает секунды как 0..59.


Более простой ответ: «конечно нет, как же так?».

Моя машина с Windows 2000 не знает, что за десятилетие, прошедшее с момента ее выпуска, было добавлено 2 високосных секунды. Любая интерпретация FILETIME неверна.


Наконец, вместо того, чтобы полагаться на логику, мы можем путем прямого экспериментального наблюдения определить ответ на вопрос плаката:

var
    systemTime: TSystemTime;
    fileTime: TFileTime;
begin
    //Construct a system-time for the 12/31/2008 11:59:59 pm
    ZeroMemory(@systemTime, SizeOf(systemTime));
    systemtime.wYear := 2008;
    systemTime.wMonth := 12;
    systemTime.wDay := 31;
    systemTime.wHour := 23;
    systemtime.wMinute := 59;
    systemtime.wSecond := 59;

    //Convert it to a file time
    SystemTimeToFileTime(systemTime, {var}fileTime);

    //There was a leap second 12/31/2008 11:59:60 pm
    //Add one second to our filetime to reach the leap second
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s

    //Convert the filetime, sitting on a leap second, to a displayable system time
    FileTimeToSystemTime(fileTime, {var}systemTime);

    //And now print the system time
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime)));

Добавление одной секунды к

12/31/2008 11:59:59pm

дает

1/1/2009 12:00:00am

, а не

1/1/2009 11:59:60pm

Q.E.D.

Оригинальному плакату это могло не понравиться, но бог намеренно подстроил его так, чтобы год не делился без остатка на день. Он сделал это только для того, чтобы напортачить программистам.

15
ответ дан 30 November 2019 в 07:34
поделиться

Секунды прыжка добавляются непредсказуемо IERS. 23 секунды были добавлены с 1972, когда UTC и секунды прыжка был определен. Википедия говорит, "потому что скорость вращения Земли непредсказуема в долгосрочной перспективе, не возможно предсказать потребность в них больше чем шесть месяцев заранее".

, Так как необходимо было бы сохранить историю того, когда секунды прыжка были вставлены, и продолжают обновлять ОС для хранения ссылки того, когда они были вставлены, и разница является настолько небольшой, справедливо не ожидать, что ОС общего назначения будет компенсировать в течение секунд прыжка.

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

2
ответ дан 30 November 2019 в 07:34
поделиться

Очень сырая сводка:

UTC = (Атомное время) + (Секунды Прыжка) ~~ (Означают Солнечное Время)

документация MS говорит, а именно, "UTC", и так должна включать секунды прыжка. Как всегда с MS, Ваш пробег может варьироваться.

0
ответ дан 30 November 2019 в 07:34
поделиться

Согласно этому окна комментария полностью не знает о секундах прыжка. Если Вы добавляете 24 * 60 * 60 секунд к FILETIME, который представляет 1:39:45 сегодня, Вы получаете FILETIME, который представляет 1:39:45 завтра, несмотря ни на что.

0
ответ дан 30 November 2019 в 07:34
поделиться

Здесь есть дополнительная информация о том, почему была выбрана именно эта дата.

Структура FILETIME записывает время в вид 100-наносекундных интервалов с 1 января 1601 года. Почему это было дата выбрана?

Григорианский календарь основан на 400-летний цикл, а 1601 - первый год цикла, который был активен в когда Windows NT была разработан. Другими словами, это было выбран, чтобы математика вышла хорошо.

Я действительно получил письмо от Дэйва Cutler confirming this.

9
ответ дан 30 November 2019 в 07:34
поделиться

На этот вопрос не может быть однозначного ответа, если сначала не решить: что на самом деле подсчитывает Windows FILETIME? В документации Microsoft говорится, что с 1601 UTC отсчитываются интервалы в 100 наносекунд, но это проблематично.

Никакой формы времени, скоординированного на международном уровне, не существовало до 1960 года. Само название UTC не встречается в какой-либо литературе до 1964 года. UTC как официальное обозначение не существовало до 1970 года. Но становится только хуже. Гринвичская королевская обсерватория не была основана до 1676 года, поэтому даже попытка интерпретировать FILETIME как GMT не имеет ясного значения, и только тогда маятниковые часы с точным спуском начали давать точность в 1 секунду.

Если FILETIME - это время интерпретируется как средние солнечные секунды, то количество дополнительных секунд с момента 1601 равно нулю, так как UT не имеет дополнительных секунд. Если интерпретировать FILETIME так, как если бы существовали атомные хронометры, то количество дополнительных секунд с 1601 года составляет около -60 (это отрицательные 60 секунд прыжка).

Это древняя история, а как насчет эпохи со времен атомных хронометров? Это не лучше, потому что национальные правительства не делали различия между средними солнечными секундами и секундами в системе СИ. В течение десяти лет МСЭ-R обсуждал отказ от дополнительных секунд, но они не достигли международного консенсуса. Частично причину этого можно увидеть в как насчет эпохи атомных хронометров? Это не лучше, потому что национальные правительства не делали различия между средними солнечными секундами и секундами в системе СИ. В течение десяти лет МСЭ-R обсуждал отказ от дополнительных секунд, но они не достигли международного консенсуса. Частично причину этого можно увидеть в а что насчет эпохи атомных хронометров? Это не лучше, потому что национальные правительства не делали различия между средними солнечными секундами и секундами в системе СИ. В течение десяти лет МСЭ-R обсуждал отказ от дополнительных секунд, но они не достигли международного консенсуса. Частично причину этого можно увидеть в javascript на этой странице (также см. Ссылку дельта-T на этой странице, чтобы увидеть сюжеты древней истории). Поскольку национальные правительства не проводят четкого различия, любая попытка определить счетчик секунд с 1972 года может оказаться недействительной в соответствии с законами той или иной юрисдикции. Делегаты в МСЭ-R осознают эту сложность, как и люди из комитета POSIX. Пока не будут решены дипломатические вопросы, пока национальные правительства и международные стандарты не сделают четкое различие и выбор между средними солнечными секундами и секундами в системе СИ, мало надежды на то, что компьютерные стандарты могут последовать их примеру.

8
ответ дан 30 November 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: