Заблуждения большинства программистов относительно «времени»

в 18:45, , рубрики: Анализ и проектирование систем, високосный, время в программах, время по Гринвичу, летнее время, Программирование, системное время, системное программирование, часовой пояс, Часы

Много дней назад я решил записать некоторые наблюдения, сформировавшиеся пока, в последние годы, я занимался тестированием. Рассматривая области, которые получают наибольшую отдачу от тестирования я понял, что у меня накопилось много конкретных мыслей о том, как мы — программисты — склонны небрежно обращаться с понятием «время» в программировании.

Тогда я написал пост «Заблуждения программистов относительно „времени“», в котором указал 34 ошибочных представления и заблуждения, относящихся как к календарному, так и к системному времени. С большинством из них я столкнулся сам, занимаясь дебаггингом программ (как рабочих, так и тестовых).

Заблуждения большинства программистов относительно «времени» - 1


Многие из указанных ошибочных представлений были моими собственными. В частности, «метки времени всегда в секундах с начала эпохи» и «продолжительность одной минуты на системных часах всегда близка к продолжительности одной минуты физического времени». Я всю жизнь буду с болью вспоминать о своём заблуждении в этих двух случаях! Но, конечно, несомненно — я не единственный, кто столкнулся с такими проблемами (или непреднамеренно создал их). Многие люди откликнулись и поделились аналогичным опытом.

ОБНОВЛЕНО: хотел бы искренне поблагодарить всех, кто участвовал в обсуждении этого поста. Я прочитал каждый комментарий и узнал о разных забавных штуках, таких как, например, годовой нуль и международное атомное время.

Хотел бы выразить громадную благодарность всем, кто внёс свой вклад в обсуждение на BoingBoing, Hacker News, Reddit, MetaFilter и Twitter, и поделился своим необычным опытом со «временем» в программировании. В этой примерно тысяче ответов было много предложений продолжить список «заблуждений».

Прежде всего, было отмечено отсутствие ложного предположения, что «время всегда движется вперёд», как отметил Technomancy и многие другие. Я получил удовольствие, читая все предложения в список. Когда я закончил читать, то понял, что, в общем и целом, они представляют собой просто другой пост в блоге. Поэтому я собрал все ваши предложения в один пост и ниже представляю его.

Заблуждения большинства программистов относительно «времени» - 2

Все эти допущения — неверные

Все приведённые ниже допущения «по времени» были предложены участниками обсуждения первоначального поста. Каждый участник указан в конце статьи.

1. Разность между двумя часовыми поясами будет оставаться постоянной.
2. Хорошо, отставляя в сторону исторические курьёзы, разность между двумя часовыми поясами не изменится в будущем.
3. Изменение разности между часовыми поясами будет происходить с выдачей множества предварительных оповещений.
4. Переход на летнее время происходит каждый год в одно и то же время.
5. Переход на летнее время происходит в каждом часовом поясе в одно и то же время.
6. При переходе на летнее время всегда происходит сдвиг на один час.
7. Количество дней в месяце составляет 28, 29, 30 или 31.
8. День месяца всегда изменяется последовательно с N на N+1 или на 1 без какого-либо разрыва.
9. В каждый момент времени используется только одна календарная система.
10. Високосный год имеет место в каждый год, который делится на 4.
11. Невисокосный год никогда не имеет 29 февраля.
12. Легко сосчитать количество часов и минут, прошедших с какого-то определённого момента времени.
13. Один и тот же месяц содержит одно и то же число дней везде!
14. Время в Unix измеряется только в секундах.
15. Время в Unix представляет собой количество секунд, начиная с 01 января 1970 года.
16. Субботе всегда предшествует пятница.
17. Соседние часовые пояса различаются не более чем на один час (другими словами: мы не должны проверять, что происходит с авиационной электроникой при пролёте над линией перемены даты).
18. Два разных часовых пояса различаются на целое число получасовок.
19. Ладно, на целое число четвертей часа.
20. Ладно, на секунды, но это будет существенная разница, если мы не учитываем переход на летнее время.
21. Если вы создаёте два объекта даты прямо рядом друг с другом, то они будут представлять одно и то же время (фантастический генератор Гейзенберга).
22. Можно подождать, когда часы покажут точно ЧЧ: ММ: СС с дискретизацией один раз в секунду.
23. Если процесс идёт «n» секунд, а затем завершается, то приблизительно «n» секунд прошло на системных часах к моменту завершения.
24. Неделя начинается в понедельник.
25. День начинается утром.
26. Праздники занимают целое число полных суток.
27. Выходные дни состоят из субботы и воскресенья.
28. Можно установить общий порядок формирования временных меток, который будет полезен за пределами вашей системы.
29. Смещение местного времени (относительно универсального синхронизированного времени (UTC)) не изменится в течение рабочего дня.
30. Thread.sleep(1000) приостанавливает выполнение на 1000 миллисекунд.
31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000 миллисекунд.
32. Каждая минута содержит 60 секунд.
33. Метки времени всегда продвигаются монотонно.
34. Среднее время по Гринвичу (GMT) и универсальное синхронизированное время (UTC) представляют один и тот же часовой пояс.
35. Великобритания использует среднее время по Гринвичу (GMT).
36. Время всегда идёт вперёд.
37. Разность между текущим моментом времени и моментом времени, отстоящим на одну неделю, всегда равна 7 * 86400 секунд.
38. Разность двух меток времени является точной мерой времени, прошедшего между ними.
39. 24:12:34 — неправильное время.
40. Каждое целое число теоретически может означать год.
41. При выводе на дисплей даты и времени показываемое время имеет ту же самую вторую часть, что и время, хранимое в памяти.
42. Или тот же год.
43. Но, по-крайней мере, разность между показываемым и хранимым годом не превышает 2.
44. Если данные находятся в правильном формате ГГГГ-ММ-ДД, то год содержит четыре цифры.
45. Если происходит слияние двух дат путём заимствования месяца из первой, а дня и/или года — из второй, то дата получается правильной.
46. Но это будет работать, только если оба года — високосные.
47. Если взять опубликованный алгоритм, описанный спецификацией W3C, для добавления некоторой продолжительности к датам, то он будет работать во всех случаях.
48. Стандартная библиотека поддерживает отрицательные годы и годы, превышающие 10000.
49. Часовые пояса всегда различаются на целый час.
50. При преобразовании метки времени, имеющей точность в миллисекундах, во время, имеющее точность в секундах, можно спокойно не учитывать составляющие в миллисекундах.
51. Можно не учитывать составляющую в миллисекундах, если она менее 0,5.
52. Год, представленный в виде двух цифр, должен быть в диапазоне 1900-2099.
53. При синтаксическом анализе времени, даты можно читать числа последовательно (символ за символом) без необходимости возвращаться назад.
54. При распечатке времени, даты можно писать числа последовательно (символ за символом) без необходимости возвращаться назад.
55. У вас никогда не будет необходимости выполнять синтаксический анализ примерно такого формата ---12Z или P12Y34M56DT78H90M12.345S.
56. Имеется только 24 часовых пояса.
57. Часовые пояса всегда различаются на целое число часов относительно универсального синхронизированного времени (UTC).
58. Переход на летнее время везде начинается/заканчивается в один и тот же день.
59. Переход на летнее время всегда представляет собой сдвиг на 1 час вперёд.
60. Считывание часов клиента и сравнение с UTC является хорошим способом определить часовой пояс клиента.
61. Программно-реализованный стек будет / не будет пытаться автоматически настроиться на часовой пояс / переход на летнее время.
62. Моя программа используется только внутри предприятия / локально, поэтому мне не надо беспокоиться о часовых поясах.
63. Мой программно-реализованный стек будет обрабатывать это без необходимости какого-либо моего вмешательства.
64. Я могу легко сохранить список часовых поясов сам.
65. Все измерения времени на данных часах будут происходить в одной и той же системе отсчёта.
66. Тот факт, что основанная на дате функция сейчас работает, означает, что она будет работать при любой дате.
67. Год содержит 365 или 366 дней.
68. За каждой календарной датой располагается последовательно дальнейшая без пропуска.
69. Приведённая дата и/или показание часов однозначно идентифицируют уникальный момент времени.
70. Високосные годы имеют место каждые 4 года.
71. Зная область/район, можно определить их часовой пояс.
72. Зная населённый пункт, можно определить его часовой пояс.
73. Время идёт с одинаковой скоростью на вершине горы и в самой нижней части долины.
74. Один час равен следующему во всех системах отсчёта времени.
75. Можно рассчитать, когда будут добавлены високосные секунды.
76. Точность типа данных, возвращаемых функцией getCurrentTime(), является той же, что и точность этой функции.
77. Два последовательных вызова функции getCurrentTime() вернут различающиеся результаты.
78. Второй из двух последовательных вызовов функции getCurrentTime() вернёт большее значение.
79. Данное программное обеспечение никогда будет работать на космическом корабле, облетающем чёрную дыру.

Серьёзно? Чёрную дыру?

Ну, если Брюс Стерлинг говорит, что моё ПО должно быть устойчиво против временных искажений вблизи чёрной дыры — поймаю его на слове.

Автор: LukinB

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js