Как компьютеры вычисляют информацию о дате?
В большинстве языков есть своего рода функция даты, где вам действительно не нужно ничего программировать, чтобы получить любую информацию о дате, вы просто получаете ее из функции/объекта даты. Мне любопытно, что происходит за кулисами, чтобы это произошло?
11 ответов:
Каждый компьютер имеет системные часы, которые отслеживают дату и время. На самом нижнем уровне информация о дате и времени, которую он извлек оттуда. Над этим добавьте информацию о часовом поясе и т. д. из операционной системы вы и получили объект даты или что-то подобное.
В зависимости от языка/окружения объекты Date могут либо выполнять вычисление даты сами, либо для этого необходимо использовать другие функции. Они гарантируют, что високосные годы обрабатываются правильно и нет недопустимой даты может быть создан.
Но, возможно, я неправильно понял ваш вопрос.
Обычно компьютер хранит подсчет того, сколько из определенной единицы времени прошло с определенного времени и даты в прошлом. В системах Unix, например, это может быть число секунд с момента начала эпохи Unix, которое равно полуночи 1 января 1970 года по Гринвичу. В Windows это число интервалов 100 нс начиная с 1601-01-0 (СпасибоJohannes Rössel ). Или это может быть что-то вроде числа секунд, прошедших с момента включения компьютера.
Итак, из числа единиц что прошло с этого времени/даты, ОС может вычислить количество лет, месяцев, дней и т. д.,которые прошли. Конечно, для того, чтобы это произошло, нужно учитывать все виды забавных вещей, таких как високосные годы и високосные секунды.
Такие системы, какNTP (Network Time Protocol) , могут использоваться для синхронизации внутреннего счета компьютера с атомными часами через сервер NTP по сети. Для этого они в НТП учитывают время поездки туда и обратно и изучают виды ошибок, которые ссылка на сервер NTP.
Информация о дате и времени обычно предоставляется операционной системой, поэтому это системный вызов. Операционная система имеет дело с часами реального времени, установленными на материнской плате компьютера и питающимися от небольшой батареи (которая длится годами).
Хорошо ... Большинство компьютеров содержат" часы реального времени ", которые отсчитывают время по человеческой шкале секунд, минут и т. д. Традиционно на материнской плате имеется небольшая батарея, которая позволяет чипу либо запоминать время, либо даже считать его, даже когда остальная часть компьютера выключена.
Многие компьютеры сегодня используют такие службы, какпротокол сетевого времени , чтобы периодически запрашивать централизованные высокоточные часы для установки текущего времени. Таким образом, даже если аккумулятор вынут (или просто выйдет из строя), компьютер все равно будет знать, какое время и дата это, и сможет обновлять (исправлять ошибки в реальном времени чипа учета времени) эту информацию так часто, как это необходимо.
Помимо часов реального времени, вычисления дат в основном являются функцией библиотеки программного обеспечения.
Даты довольно нерегулярны, и поэтому за кулисами используется смесь аппроксимаций, поправок и таблиц поиска.
Представление даты также может варьироваться, обычно используется некоторая (произвольная) дата начала. Общей системой, также используемой астрономами, являютсячисла Юлианских дней (Не путать сЮлианским календарем ). Даты могут храниться в виде секунды-с-начала или как дни-с-начала (последнее обычно является плавающей точкой). Вот несколько еще несколько алгоритмов.
Для разбора даты, вычисления, создания и т. д. требуется удивительное количество удивительно сложного кода.
Например, в Java даты вычисляются, изменяются, сохраняются и т. д. Через дату, Календарь , а конкретно и типично, реализация календаря григорианского календаря. (Вы можете скачать SDK / JDK и посмотреть на источник самостоятельно.)
Короче говоря, то, что я взял из быстрого прочтения источника, это: обработка даты это нетривиально и не то, что вы хотите попробовать самостоятельно. Найдите хорошую библиотеку, если это вообще возможно, иначе вы почти наверняка будете изобретатьквадрат колесо .
Ваш компьютер имеет системные часы, а BIOS имеет функцию таймера, которая может быть обновлена из вашей операционной системы. Языки только берут информацию оттуда, и некоторые могут обновить ее тоже.
Купите любую из этих книг покалендарным расчетам . Они расскажут вам, как работают библиотеки дат под капотом.
Дата / время часто хранится в терминах времени, прошедшего с определенной даты. Например, тики (100 наносекундных интервалов) с 1 января 0001 года. Он также обычно хранится в привязке к UTC. Базовые методы в ОС, базе данных, фреймворке, приложении и т. д. затем можно преобразовать их в более удобное представление. Раньше системы хранили составные части даты, дня, месяца, года и т. д. как часть структуры данных, но мы усвоили наш урок с беспорядком Y2K, который это, вероятно, не лучший подход.
Большинство ответов касалось способа получения текущей даты. то есть от системных часов и так далее.
Если вы хотите знать, как он хранится и используется, есть много различных реализаций, и это зависит от системы.
Я считаю, что распространенным является использование 64-битного целого числа со знаком в T-sql 01/01/1970 равно 0, поэтому отрицательные числа являются до 1970 и положительными, начиная с того, что каждое приращение добавляет 100-ю долю секунды (думаю, что это 100-я должна была бы проверить).
Почему 01.01.1970 вы можете спросить, это потому, что григорианский календарь находится на 400-летнем цикле. 01/01/1970 - это завершающее начало цикла до текущей даты.
Это происходит потому, что " каждый год, который точно делится на четыре, является високосным годом, за исключением лет, которые точно делятся на 100; столетние годы, которые точно делятся на 400, все еще високосные годы. Например, 1900 год-это не високосный год; 2000 год-это високосный год."Это очень усложняет, я думаю, 400-й год цикл совпадает с днями недели, повторяясь также, но ни ДТО не проверить. В принципе, это очень сложно.Внутренне невероятно трудно написать библиотеку datetime, учитывающую все эти вариации, такие как високосные годы, факт отсутствия нулевого года..... Не говоря уже о UTC, GMT UT1 раз.
У нас была возможность при отладке проблемы клиента посмотреть, как SQL хранит время выполнения... довольно интересно и имеет довольно хороший смысл, как только вы его видите.
SQL использует 2 4 байта целых чисел... Первые 4 байта - это дата в днях, начиная с января. 1 января 1753 года. Я считаю, что максимальный год должен быть 9999, что не совсем соответствует количеству доступных целых чисел в 4 байтах, но вы идете. Вторые 4 байта - это время в миллисекундах с полуночи.
Comments