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

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


Многие из указанных ошибочных представлений были моими собственными. В частности, «метки времени всегда в секундах с начала эпохи» и «продолжительность одной минуты на системных часах всегда близка к продолжительности одной минуты физического времени». Я всю жизнь буду с болью вспоминать о своём заблуждении в этих двух случаях! Но, конечно, несомненно — я не единственный, кто столкнулся с такими проблемами (или непреднамеренно создал их). Многие люди откликнулись и поделились аналогичным опытом.
ОБНОВЛЕНО: хотел бы искренне поблагодарить всех, кто участвовал в обсуждении этого поста. Я прочитал каждый комментарий и узнал о разных забавных штуках, таких как, например, годовой нуль и международное атомное время.
Хотел бы выразить громадную благодарность всем, кто внёс свой вклад в обсуждение на BoingBoing, Hacker News, Reddit, MetaFilter и Twitter, и поделился своим необычным опытом со «временем» в программировании. В этой примерно тысяче ответов было много предложений продолжить список «заблуждений».

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



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


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

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. Данное программное обеспечение никогда не будет работать на космическом корабле, облетающем чёрную дыру.

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


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

Комментарии (92)


  1. vintage
    25.10.2016 22:02
    +32

    А где контрпримеры по каждому пункту?


    1. Smi1e
      25.10.2016 22:24
      +16

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


      1. Pilat
        25.10.2016 23:15
        +1

        В оригинале есть ссылки на объяснения. Но там переводить-ненапереводить.
        Материал, судя по всему, собран из нескольких источников, поэтому много почти точных повторов.


    1. izuware
      25.10.2016 23:41
      +1

      Год за годом в процессе роста сеточки с добавлением железочек, программочек и др. так наплясался со временем, что безоговорочно верю каждому пункту.


    1. chieftain_yu
      26.10.2016 10:37
      +40

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


      1. rayz_razko
        26.10.2016 10:55
        +2

        Израиль отличный пример с выходными. они в Пт и Сб. Вс нормальный рабочий день.


        1. alix_ginger
          26.10.2016 11:30
          +1

          И с праздниками, длящимися нецелое число суток — с появления первой звезды до восхода Солнца, или что-то подобное.


          1. chieftain_yu
            26.10.2016 15:57

            И соответствующий день считается праздничным на таком вот интервале времени и обычным рабочим — на остальном?


      1. marcor
        26.10.2016 11:16
        +3

        > 36. Время всегда идёт вперёд.

        Думаю, имеются в виду прыжки времени из-за шаловливых ручек пользователя. Помню, болтал по Skype и одновременно настраивал ntpd. Я отмотал время назад, и в итоге Skype показывал, что я разговариваю 1 000 000 часов. Всё остальное работало, что очень мне понравилось)
        Или всем знакомые проблемы с SSL сертификатами, когда из-за кривого локального времени сертификат недействителен.
        А, а ещё в *nix может возникнуть time paradox, при попытке удаления файла раньше, чем он был создан. (не проверял, кто сталкивался — буду рад узнать больше)


        1. MacIn
          26.10.2016 18:26
          +1

          Нет, это не шаловливые ручки пользователей, а шаловливая виртуализация.


      1. red_led
        26.10.2016 11:30
        +4

        11. Невисокосный год никогда не имеет 29 февраля.
        С этим сложности. Я не знаю контрпримеров

        Та же Швеция. Из вики:
        В Швеции решили отменять високосные дни с 1700 по 1740 годы. В 1700 году был отменён первый високосный день. Потом началась война и про перевод забыли. Таким образом, страна жила по своему собственному шведскому календарю. В 1711 году Карл XII признал это непрактичным и решил вернуться к старому стилю и добавить в феврале 2 дня. Поэтому в Швеции было 30 февраля 1712 года. Лишь в 1753 году был введён новый стиль. При этом после 17 февраля последовало сразу 1 марта.


        1. red_led
          26.10.2016 11:57
          +1

          Прошу прощения, поторопился, 1712 всё таки высокосный. Но 30е февраля тоже интересный пример: )

          31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000 миллисекунд.
          Не знаю контрпримера.
          Вики:
          Теоретически возможно объявление отрицательной секунды координации, если средние солнечные сутки окажутся короче календарных

          36. Время всегда идёт вперёд.
          Физически — не знаю контрпримера. Но местное при пересечении ЛПД может идти и вспять…
          Достаточно перехода с летнего времени на обычное?


      1. m08pvv
        26.10.2016 11:58
        +1

        31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000 миллисекунд.
        Не знаю контрпримера.

        Возможно, речь идёт о том, что системное время изменится на >= 1000 миллисекунд за время Thread.Sleep(1000), однако в этот момент может быть, например, переведено время на час назад…


        1. powerman
          28.10.2016 09:17

          Всё ещё смешнее: sleep(n) действительно может отработать чуть-чуть меньше, чем за n. С чем связано — не разбирался, но видел своими глазами неоднократно.


          1. m08pvv
            28.10.2016 11:09

            Почему-то сразу вспоминается, что в Stopwatch, например, есть проверка на то, что результирующее время может оказаться отрицательным — тогда принудительно возвращается 0.


          1. SVlad
            03.11.2016 16:05

            Системный менеджер процессов может работать с некоторыми интервалами. И может разбудить поток и немного раньше.


      1. Fil
        26.10.2016 12:11
        +1

        22. Можно подождать, когда часы покажут точно ЧЧ: ММ: СС с дискретизацией один раз в секунду.
        Мне кажется, причина в том, что выдержать точный шаг дискретизации невозможно. Т.е, если нам нужно засечь время 00:00:01, то велика вероятность перепрыгнуть: 00:00:00.999, а следующий отсчет 00:00:02.000


      1. Akon32
        26.10.2016 12:18
        +2

        36. Время всегда идёт вперёд.
        77. Два последовательных вызова функции getCurrentTime() вернут различающиеся результаты.
        78. Второй из двух последовательных вызовов функции getCurrentTime() вернёт большее значение.

        Перевод времени назад.
        76. Точность типа данных, возвращаемых функцией getCurrentTime(), является той же, что и точность этой функции.
        Системные часы могут не иметь миллисекундной точности.
        30. Thread.sleep(1000) приостанавливает выполнение на 1000 миллисекунд.
        31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000 миллисекунд.

        sleep() может быть прерван через thread.interrupt() или по другим причинам, и поток проснётся раньше. Потоку может не достаться процессорного времени, и он проснётся позже.
        34. Среднее время по Гринвичу (GMT) и универсальное синхронизированное время (UTC) представляют один и тот же часовой пояс.
        GMT это с летним временем, хотя могу ошибаться.

        Наверняка это не всё. Также отмечу, что часовые пояса меняются не только в России. Каждые 2-3 месяца в мире какой-нибудь пояс меняется. см. tzdata.

        Вообще, большая часть пунктов решается использованием tzdata, и большая часть из того, что не решается tzdata, — знанием особенностей платформы. Остальные действительно удивляют.


      1. Any1
        26.10.2016 14:46

        1. Два разных часовых пояса различаются на целое число получасовок.
          Непал и Индия. Отличие — 15 минут.
        2. Ладно, на целое число четвертей часа.
          Не знаю контрпримера
        3. Ладно, на секунды, но это будет существенная разница, если мы не учитываем переход на летнее время.
          Не знаю контрпримера

        Думаю, имелся в виду UTC?00:25:21, существовавший до 1916 года в Ирландии. Других часовых поясов с точностью до секунд я не нашел (с точностью до минут был еще UTC?00:44 в Либерии до 1972 года).


        1. chieftain_yu
          26.10.2016 16:13

          Ну тогда можно окунуться век в осьмнадцатый, когда времена считались по столицам, там каждый по-своему отличался от Гринвича.


      1. ZyXI
        26.10.2016 15:28
        +1

        22. Можно подождать, когда часы покажут точно ЧЧ: ММ: СС с дискретизацией один раз в секунду.

        Я полагаю, проблема в том, что во?первых, секунда «часов» по разным причинам
        может быть короче секунды — к примеру, ntpd синхронизирует системное время,
        укорачивая/удлиняя секунду. Либо это отсылка к тому факту, что на не?realtime
        системах подождать в точности одну секунду у вас не выйдет никак, а на realtime
        вы всё равно ограничены точностью генератора.


        30. Thread.sleep(1000) приостанавливает выполнение на 1000 миллисекунд.
        Високосная секунда.

        При чём тут она? Нормальный sleep использует другие часы. Дело в том, что
        Thread.sleep(1000) на не?realtime системах (т.е. в абсолютном большинстве
        систем) передаст управление ядру, которое радостно загрузит следующий процесс.
        И не отдаст управление обратно, пока опять не будет вызван планировщик задач,
        и то вам может помешать более приоритетный процесс. При этом планировщику нужно
        убедиться, что поток подождал достаточно (т.е. управление ваш поток, скорее
        всего, получит только на следующий после 1 000 мс вызов).


        31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000
        миллисекунд.
        Не знаю контрпримера.

        В linux NTP использует adjtime(), который влияет, в том числе, и на
        CLOCK_MONOTONIC. Обычно когда нужны монотонно возрастающие часы используют
        именно их, а не CLOCK_MONOTONIC_RAW. Сильных изменений adjtime не сделает, но
        вполне может замедлить часы достатачно, чтобы время было меньше.


        Кроме того, я не знаю, как планировщик определяет «достаточно подождал»: одним
        из возможных вариантов будет «в результате работы планировщика мат. ожидание
        времени в sleep должно быть равно 1 000 мс», что автоматически означает, что
        часть процессов должна ждать меньше.


        Правда мне не понятно, что здесь делают эти пункты: совершенно определённо, что
        Thread.sleep() не имеет отношения к «внешнему» времени.


        36. Время всегда идёт вперёд.
        Физически — не знаю контрпримера. Но местное при пересечении ЛПД может идти
        и вспять…

        Учитывая, что Thread.sleep() — это уже детали реализации, предполагаю что
        имеется ввиду просто то, что пользователь может внезапно перевести часы.


        58. Переход на летнее время везде начинается/заканчивается в один и тот же
        день.
        Не знаю контрпримеров.

        Вы говорили, что «СССР переводился, вроде, с воскресенья на понедельник. Сейчас
        — на выходных.» А другие страны с летним временем в тот же период?


        60. Считывание часов клиента и сравнение с UTC является хорошим способом
        определить часовой пояс клиента.
        Не учитывает летнее-зимнее время, да к тому же клиент может иметь
        непереведенные часы (например, пребывать в командировке в другом часовом
        поясе).

        Ещё есть вопрос про «считывание часов»: в linux время хранится в виде UNIX
        timestamp и отдельно часовой пояс. Таким образом, в зависимости от способа
        считывания, может оказаться, что сравнение с UTC всегда будет укладываться
        в пределы погрешности синхронизации часов.


        77. Два последовательных вызова функции getCurrentTime() вернут различающиеся
        результаты.
        Високосная секунда?

        Нет. getCurrentTime() может отработать до того, как время изменится.


        1. chieftain_yu
          26.10.2016 15:50

          Вы говорили, что «СССР переводился, вроде, с воскресенья на понедельник. Сейчас
          — на выходных.» А другие страны с летним временем в тот же период?

          Поискал данные, выяснил — ошибся.
          В 1981-1983 годах переводы времени были 1 апреля и 1 октября. Так что да — бывали и времена различия.


      1. saboteur_kiev
        26.10.2016 16:14

        Время может идти не в перед, если в процессе выполнения приложения, кто-то изменил время.
        Например тот же часовой пояс назад на час уехал, или просто запустилась синхронизация с атомными часами в инете и локальное время поправилось на +-несколько секунд


      1. igrishaev
        26.10.2016 17:13

        Спасибо, и еще тайский календарь со смещением в 543 лет вперед.


      1. Bellicus
        26.10.2016 17:49

        29 февраля 1931 года


        1. chieftain_yu
          27.10.2016 08:37

          Если вы про советский революционный календарь, то в табель-календаре на 1931 год 29 февраля отсутствует:
          image
          Он же в более читаемом виде:
          image

          Источник — Википедия.


          1. Bellicus
            27.10.2016 09:38
            +1

            Внимательно читали?)

            | На самом деле указанные дни существовали, но не являлись «днями пятидневок». Календарь являлся табелем в прямом смысле слова, в нём содержались только рабочие дни без праздников/

            | Если бы было принято решение, 29 февраля могло бы также не входить в число дней табеля-календаря, тогда табель-календарь остался бы совершенно неизменным для любого года.


            1. chieftain_yu
              27.10.2016 14:02

              Тогда поясните, пожалуйста, такую вещь — я насчитал в табель-календаре 72*5=360 дней.
              При этом в табель-календаре не обозначены 22 января, 1 и 2 мая, 7 и 8 ноября. Еще пять.
              В сумме — 365.
              Вы уверены, что заради 29 февраля сам 1931 год было решено удлиннить на один день, и при этом вообще не упоминать, хотя пять праздничных дней заявлены явно?


              1. Bellicus
                27.10.2016 17:21

                Но вот почему то казусы с рожденными 29 февраля 30 и 31 годов имеют место быть)


                1. chieftain_yu
                  28.10.2016 10:50

                  Имеют место рассказы о казусах, а сами казусы — а) могут существовать, но объясняться ошибками паспортисток, б) могут не существовать, в) могут существовать и объясняться тем, что 29 февраля в 1930/31-м году было, но не обнаружено документальных подтверждений их существования, г) могут существуют, просто я не смог найти их документированными.
                  Как по мне, бритва Оккама оставляет варианты а и б.
                  Если вы можете показать документы с такой датой — с удовольствием ознакомлюсь.


                  1. Bellicus
                    28.10.2016 11:41

                    http://lists.memo.ru/index16.htm (ищи Попов Сергей Александрович 1881)
                    https://people.onliner.by/2013/09/17/belorus-rodilsya-30-fevralya (возможно утка)
                    ну и про Камчатский УФМС где-то ниже написано.


                    1. chieftain_yu
                      28.10.2016 13:37

                      1) Я не вижу документов.
                      На сайте записано со слов воронежского «Мемориала». Варианты фактического источника записи: а) ошибка в бумажном документе, б) ошибка сканирования, в) ошибка распознавания, г) ошибка программиста, писавшего скрипт генерации жертв политических репрессий, д) ошибка при переносе на lists.memo.ru.
                      2) ситуация еще краше:

                      В сельсовете кумекали, спрашивали у соседей. В итоге решили записать: 30 февраля. Так и живет Максим Сойко с несуществующей датой в паспорте.

                      Вообще не понимаю, почему этот курьез может служить доказательством.

                      Вот вам еще несколько табель-календарей. Покажите, пожалуйста, 29 или тем паче 30 февраля.

                      image
                      image
                      image
                      image
                      image


                      1. Bellicus
                        28.10.2016 16:18

                        Ну а кто даст гарантию, что все ваши календари тоже подлинные?)


                        1. zelenin
                          28.10.2016 17:22

                          а нужно? это докажет что было 30 февраля?


                        1. chieftain_yu
                          28.10.2016 17:22

                          Никто. :)

                          Но из двух версий для меня более обоснованной кажется именно версия, что в 1930-31 годах ни 29-го, ни 30-го февраля не было.


                  1. duger
                    28.10.2016 15:45
                    +1

                    Если вы можете показать документы с такой датой — с удовольствием ознакомлюсь.


                    Вот, например: (найдено здесь)
                    image


                    1. chieftain_yu
                      28.10.2016 16:01

                      Идем по ссылке.
                      Там идем и внимательно читаем:

                      История с необычной датой рождения для тех лет вполне типична: 6-летний мальчик, он пришел к старшине и не мог точно сказать, когда родился. В сельсовете кумекали, спрашивали у соседей. В итоге решили записать: 30 февраля. Так и живет Максим Сойко с несуществующей датой в паспорте. Сколько раз во всяких документах спотыкались о необычную запись.


                      1. duger
                        28.10.2016 16:24

                        Во-первых — по-вашему в сельсовете не знали что 30-го февраля не бывает? Потроллить пацана решили?

                        Во-вторых — есть как минимум еще один подобный случай (ниже мой коментарий о судебном решении по поводу пенсионерки с датой рождения 29-го февраля 1930). Суд признал, что ее свидетельство о рождении с такой датой действительно, и предписал УФМС внести изменения в свое ПО, чтобы оно считало дату 29.02.1930 валидной. Что, в контест статьи — о том что программы должны быть готовы к таким неожиданностям — вполне укладывается.


                        1. chieftain_yu
                          28.10.2016 17:20

                          Судебное решение означает, что свидетельство действительно, а не что такая дата была.
                          И обязало УФМС мочь выдать пенсионерке госуслуг даже с такой датой, внесенной в документы.

                          Это не доказательство существования даты, а именно показ необходимости иметь возможность ее обработать.


            1. chieftain_yu
              28.10.2016 13:45

              Внимательно почитал статью Вики:

              Фактический вариант месяца с пятидневной неделей
              Все месяцы сохраняли привычное число дней

              А вариант с февральскими извращениями — это теоретический вариант:
              Теоретический вариант месяца с пятидневной неделей
              Во многих источниках указывается, что каждый месяц состоял из тридцати дней и, таким образом, в Советском Союзе в 1930 и 1931 годах существовало 30 февраля. В действительности это предложение было отвергнуто.

              Оставшиеся пять или шесть дней предлагалось объявить так называемыми «безмесячными каникулами», они не входили ни в один месяц и ни в одну неделю, зато имели собственные имена:

              День Ленина, следовавший за 30 января (по другим источникам — после 22 января)
              Дни труда, 2 дня, следовавшие за 30 апреля
              Индустриальные дни, 2 дня, следовавшие за 7 ноября
              в високосные годы добавочный високосный день; следовал за 30 февраля
              Этот не воплотившийся в жизнь проект очень похож на подобный же проект постоянного (стабильного) календаря.


      1. Bellicus
        26.10.2016 18:04

        25. Если имеется ввиду световой день, то полярная ночь.
        26. Час Земли считается праздником?
        34. разница между UTC и GMT может доходить до 0,9с


      1. Mingun
        26.10.2016 19:36

        7. Количество дней в месяце составляет 28, 29, 30 или 31.

        1582 год. У католиков в октябре после 4-го числа сразу настало 15-е.


        Поменялся календарь? Вы считаете нормальным измерять начало интервала по одной системе а конец по другой?

        9. В каждый момент времени используется только одна календарная система.

        Мусульмане и ряд восточных стран одновременно могут пользоваться несколькими календарями.


        Аналогично

        11. Невисокосный год никогда не имеет 29 февраля.

        С этим сложности. Я не знаю контрпримеров.


        Очевидно, опять намекают на другие календари. С учетом того, что предыдущее заблуждение явно про григорианский календарь (общепризнанный современный то бишь), то 0 заблуждением во всем этом списке следует назвать «при обсуждении темы времени все участники говорят об одном и том же и только об одном календаре». В противном случае вся эта дискуссия похоже на беседу шизофреников.

        44. Если данные находятся в правильном формате ГГГГ-ММ-ДД, то год содержит четыре цифры.

        382-12-01 — первое декабря 382-го года, очевидно, либо должно иметь фильтр на ввод, требующий вбивать 0382, либо обрабатывать и такие варианты.


        Похоже, имеется ввиду наоборот, если приходит 0382-12-01, то после преобразования Str->Int->Str без паддингов для года получим 3-хзначное число. Формат ГГГГ-ММ-ДД уже предполагает, что для года требуют ввести 4 цифры.

        67. Год содержит 365 или 366 дней.

        Куча календарей, где это может быть не так. Мусульманский, например.


        Все-таки пора определиться, один календарь мы рассматриваем или все, в том числе и те, которые придумают в будущем.


      1. Atilla
        27.10.2016 12:30

        25. День начинается утром.
        Возможно имеется в виду астрономический день — он начинается в полдень.
        https://en.wikipedia.org/wiki/Astronomical_day


      1. ustin
        27.10.2016 15:55
        +1

        39. 24:12:34 — неправильное время

        В оригинальной статье на реддите приводили пример: ТВ-расписание в японии. Поздние программы считаются частью прошлого дня. Вот расписание, где встречаются времена вида 27:04.


      1. nektotrishin
        27.10.2016 15:55
        +1

        26. Праздники занимают целое число полных суток.
        антипример: Рамандан начинается с восхода солнца + месяц и до заката крайнего дня.
        Пасха с вечерней службы (примерно в 16-17часов) и +39 дней


      1. duger
        27.10.2016 15:56
        +1

        11. Невисокосный год никогда не имеет 29 февраля.
        С этим сложности. Я не знаю контрпримеров.

        Например: (источник)
        В Камчатском крае суд обязал миграционную службу заменить паспорт женщине, в котором из-за сбоя программы ФМС, не обнаруживший в 1930 году день 29 февраля, датой рождения было указано «00.00.1930»

        Как пояснили в суде, 1930 год не был високосным, но, несмотря на это, 29 февраля тогда в календаре имелось, отмечает «Интерфакс». В этот год СССР жил по Советскому революционному календарю, который просуществовал лишь несколько лет.


      1. RovingStone
        27.10.2016 15:56

        39. 24:12:34 — неправильное время.
        Не знаю контрпримера.

        В солнечных сутках может быть больше 24 часов


      1. artemisia_borealis
        27.10.2016 15:57

        >7. Количество дней в месяце составляет 28, 29, 30 или 31.
        > 1582 год. У католиков в октябре после 4-го числа сразу настало 15-е.

        И сейчас бывает. Например 13-й месяц в Коптском календаре длится 5 или 6 дней.

        9. В каждый момент времени используется только одна календарная система.
        > Мусульмане и ряд восточных стран одновременно могут пользоваться несколькими календарями.

        В Непале вообще 5--6.

        10. Високосный год имеет место в каждый год, который делится на 4.

        В Григорианском каждый год N, при N mod 400 = {100,200,300} невискосный.

        11. Невисокосный год никогда не имеет 29 февраля.

        Напрмер, Календарь Армелина и другие стабильные календари

        19. Ладно, на целое число четвертей часа.

        Сейчас наверное нет таких примеров. Но, например, в процессе перехода к поясным временам, растянувшимся на полвека было:
        В Либерии до 1972 время было UTC +44:30.

        24. Неделя начинается в понедельник.
        >США — в воскресенье.

        В Иране в субботу

        25. День начинается утром.
        > Не знаю контрпримеров.

        Что такое день и что такое утро? Утро — это восход или конец (астрономических, навигационных, гражданских) сумерек?
        А если день Полярный? А если Полярная ночь, то определяется ли день?

        27. Выходные дни состоят из субботы и воскресенья.

        В Иране только пятница

        28. Можно установить общий порядок формирования временных меток, который будет полезен за пределами вашей системы.

        Думаю нельзя. В Иранском календаре циклы по 33 года, но иногда назначаются по 29 или 37 лет.

        30. Thread.sleep(1000) приостанавливает выполнение на 1000 миллисекунд.
        Високосная секунда.

        Вероятно не в этом дело. О ВС системные часы не знают. Скорее точность «тиков» процессора.

        31. Thread.sleep(1000) приостанавливает выполнение на время >= 1000 миллисекунд.

        Наверное 999.51 вполне возможно.

        36. Время всегда идёт вперёд.
        > Физически — не знаю контрпримера. Но местное при пересечении ЛПД может идти и вспять…

        И не только ЛДП. Просто большинство скачков на запад из пояса в пояс.
        Аналогично, астрономическое время при достаточно быстром перемещении на запад. А у полюсов и при небыстром.

        39. 24:12:34 — неправильное время.

        JS так не считает. В консоли, например:

        s = new Date()
        Wed Oct 26 2016 14:58:14 GMT+0300 
        s.setHours(0,0,0); s
        Wed Oct 26 2016 00:00:00 GMT+0300 
        s.setHours(0,0,90); s
        Wed Oct 26 2016 00:01:30 GMT+0300 
        s.setHours(0,0,90); s
        Wed Oct 26 2016 00:01:30 GMT+0300 
        s.setHours(0,70,90); s
        Wed Oct 26 2016 01:11:30 GMT+0300 
        s.setHours(0,70,90); s
        Wed Oct 26 2016 01:11:30 GMT+0300 
        s.setHours(0,70,90); s
        Wed Oct 26 2016 01:11:30 GMT+0300 
        s.setHours(23,70,90); s
        Thu Oct 27 2016 00:11:30 GMT+0300 
        s.setHours(25,70,90); s
        Fri Oct 28 2016 02:11:30 GMT+0300 
        s.setHours(25,70,90); s
        Sat Oct 29 2016 02:11:30 GMT+0300 
        


        Недаром тут некоторые вводы повторены два раза. Дело в том, что если 3600*h + 60*m + s не прывышает 86400, то мы получем «корректную» установку даты с учётом переполенния
        минут и секунд, а в ином случае при повторном введении значений у нас щёлкает и день.
        О том какой качественный это багогенератор, можно долго рассуждать.

        50. При преобразовании метки времени, имеющей точность в миллисекундах, во время, имеющее точность в секундах, можно спокойно не учитывать составляющие в миллисекундах.

        не учитвать, это просто отбрасывать (floor), но лучеше всё-таки округлять иначе целевое время будет иметь ощику выше 0.5 сек.

        51. Можно не учитывать составляющую в миллисекундах, если она менее 0,5.

        Если не учесть (особенно отбросив как выше), то при переходе в Новый Год (месяц, час) можно получить казус (скрыть различия или выявить его при отсутсвии).

        58. Переход на летнее время везде начинается/заканчивается в один и тот же день.

        Теоретически, если в одной стране есть пояса отличающиеся не на целое число часoв, то можно скакнуть пр переходе.
        Хороший пример Австалия с поясами: +8:45, +9:3о, +1о: оо (и ещё там острова есть +5: оо, +6:3o, +1о:3о)

        70. Високосные годы имеют место каждые 4 года.

        В Григорианском каждый год N, при N mod 400 = {100,200,300} невискосный.
        В Иране обычно циклы по 33 года (вискосные там N mod 33 = {1, 5, 9, 13, 17, 22, 26 или 30} )

        71. Зная область/район, можно определить их часовой пояс.

        Антарктида. Китай. Гренландия.

        73. Время идёт с одинаковой скоростью на вершине горы и в самой нижней части долины.
        > Ну в общем — наверное, синхронизированные атомные часы могут показать разницу.

        Это уже какая-то софистика. Что такое скорость времени? dt/dt? В принципе астрономическое время можно сказать что идёт по разному, если скорость определить как dt/dx [c/м].
        Тогда это ещё и от широты зависит.

        79. Данное программное обеспечение никогда не будет работать на космическом корабле, облетающем чёрную дыру.

        >А вот это можно запихать в лицензионное соглашение!
        В целом ПО, вращаясь вместе с солнечной системой вокруг центра галактики, вращается вокруг ЧД.


      1. ga-to
        27.10.2016 15:58

        То же самое по п. 7 в Советской России было в 1918: после 31 января сразу наступило 14 февраля (перешли на григорианский календарь), вследствие чего есть даже шутка, что «с 1 по 13 февраля на территории РСФСР никто не рождался, не умирал и вообще не произошло никаких событий»


      1. DrGluck
        27.10.2016 15:58

        41. При выводе на дисплей даты и времени показываемое время имеет ту же самую вторую часть, что и время, хранимое в памяти.
        Например можно встретить на 8-битном контроллере при чтении значения 16-битного таймера (если не читать документацию). Обычно в документации указан порядок чтения, гарантирующий, что будет прочитано одно 16-битное значение.
        Правда тут можно нарваться на то, что после чтения первого байта, придёт прерывание и второй байт будет прочитан немного позднее, например на пару миллисекунд.


  1. masai
    25.10.2016 22:22

    Перевод первого поста, если кто не видел.


    1. samodum
      25.10.2016 23:13

      В начале поста написано. Не читаем?


      1. masai
        27.10.2016 09:35

        Возможно, я что-то путаю, конечно, но когда я оставлял комментарий, там была ссылка на оригинал.


  1. Scf
    26.10.2016 00:00
    +1

    Навевает ностальгию. Тот самый момент, когда ты узнал, что в сутках не всегда 24 часа.


  1. vinograd19
    26.10.2016 01:28
    +2

    Для понимания многих пунктов рекомендую запустить в терминале

    cal 09 1752
    


    1. vlreshet
      26.10.2016 09:27
      +1

      А куда там полторы недели пропало? О_о

      Для тех кому лень открывать терминал
      image


      1. MaximChistov
        26.10.2016 10:01
        +2

        Они в этом году приняли григорианский календарь, а две недели — смещение от предыдущего календаря


        1. Mingun
          27.10.2016 19:54

          Т.е. первые 2 дня — от одного календаря, а последующие дни — от другого. И общего между календарями только название месяцев и похожее количество дней в каждом из них. Неужели никто не находит это странным?


          1. masai
            28.10.2016 10:02

            Это неудобно и не добавляет изящества в систему измерения времени, но что в этом странного?


            1. Mingun
              28.10.2016 18:09

              Ну… это как если бы, например, чертили вы в какой-нибудь CAD системе дом, и вдруг посередине документа перешли с дюймов на миллиметры. Хотите, пожалуйста — используйте и дюймы и миллиметры, но на разных чертежах. Зачем их смешивать на одном?


              Также и с датой. Зачем извращаться и пытаться в одной системе слепить два разных календаря? Вот, например, до 14 сентября 1752 года григорианского календаря было 13 сентября 1752 григорианского календаря. Ну и что, что в тот день этим календарем не пользовались? Это должно на него влиять как-то что ли?


              Вообще, при близости таких дат нельзя говорить "1752 год", нужно уточнять, в каком календаре. Просто по умолчанию предполагается какой-то (например, григорианский). Аналогично, когда вы говорите "в 90-х", предполагается 20-й век (т.е. 1990). Если вы имеете ввиду 1890 или 2090, вы же не будите говорить "в 90-х", если конечно хотите, что вас поняли? Почему с календарем иначе?


              1. masai
                29.10.2016 01:01

                Ну, время одно, тут не получится не смешивать. Говорят, бог создал мир за шесть дней всего, так как у него не было проблемы обратной совместимости. :)


                Что мы будем прошлое по-новому считать, что по-старому, нужно будет уточнять календарь, иначе даты в текстах того времени не перевести.


                Да, некрасиво с календарями вышло. Дни по-дурацки распределены. В году нецелое число дней. И високосная секунда эта. И неравномерность вращения Земли, когда любой просто подняв камень замедляет ее обращение вокруг оси. Но вот как-то привыкли.


                1. Mingun
                  29.10.2016 15:42

                  Ну, время одно, тут не получится не смешивать.

                  Что значит не получится? В коде программ очень даже получится. Просто нужно четко помнить, что у нас есть несколько календарей и не пытаться создать один GOD-календарь, который будет покрывать все возможные случаи. Получаете странную дату от оператора при вводе в программу? Уточните, что за календарь.


                  Что мы будем прошлое по-новому считать, что по-старому, нужно будет уточнять календарь, иначе даты в текстах того времени не перевести.

                  Зачем подгонять календарь под даты? Календарь — по определению система счета дней в какими-то правилами. Разные календари — разные правила. Не проще ли использовать правильный календарь для дат "того времени"? Зачем тащить это легаси в современность, делая его еще более хрупким?


                  1. synedra
                    02.11.2016 07:16

                    Получаете странную дату от оператора


                    Это здорово, когда у вас 27 кислева 5750 года, которое есть только у евреев. Но многие календари мало того что используют одинаковые названия, так ещё и использовались одновременно друг с другом и/или в одной и той же стране. Скажем, 4 февраля 1900 года — это по юлианскому или грегорианскому календарю? Или упоминавшееся выше 2 февраля 1931 — по одному из этих двух или советскому революционному?


                    1. Mingun
                      02.11.2016 19:17

                      Скажем, 4 февраля 1900 года — это по юлианскому или грегорианскому календарю? Или упоминавшееся выше 2 февраля 1931 — по одному из этих двух или советскому революционному?

                      По тому календарю, который выбрал пользователь во время ввода этих дат.


      1. Nimtar
        26.10.2016 11:30

        Переход на григорианский календарь съел.


      1. dmpas
        26.10.2016 11:30

        В этот год «В Великобритании и её североамериканских колониях принят Григорианский календарь.»
        Википедия(с)


      1. zomby
        26.10.2016 15:31

        Бог напевал песню про третье сентября, и пропел припев «я календарь переверну...» 11 раз.


    1. BasilioCat
      26.10.2016 09:29

      И что самое интересное, вывод этого календаря верен лишь для Британской Империи


    1. talbot
      26.10.2016 15:46

      ncal 02 1918
      
      тоже ОК

      Переход на Григорианский календарь


      1. BasilioCat
        26.10.2016 16:30

        Сравните вывод ncal 02 1918 и cal 02 1918 при локале ru_RU и ncal 09 1752 и cal 09 1752 при en_US. Вполне можно дополнить список из статьи


  1. HurrTheDurr
    26.10.2016 02:14
    +10

    Четверть проблем — из-за существования часовых поясов. Я убежден, что заблуждением является сама необходимость их существования. Кто-то может внятно объяснить, зачем нужны часовые пояса? Какая разница, во сколько у меня восходит солнце — в 07:00, в 01:00 или в 19:00, если это просто цифра?
    Лично я перешел на UTC еще в феврале и с тех пор не заметил ни одной сложности, разве что пришлось научиться мгновенно прибавлять местный часовой пояс, чтобы отвечать на вопрос «который час». Назначать межконтинентальные звонки проще — сразу понятно, через сколько часов он будет проведен. Путешествовать проще — сразу понятно, сколько времени ты провел в пути.
    Тогда в чем смысл-то, кроме «тут так принято»? Проще определять время суток на другом конце земного шара, что можно сделать и живя по UTC, примерно запомнив часовые пояса? 20 заблуждений из 79 — великоватая цена за такое ничтожное преимущество.


    1. webmasterx
      26.10.2016 07:16

      а как быть с летним временем? Переклеивать каждые полгода наклейки с надпись работаю с ХХ до YY?


      1. dipsy
        26.10.2016 10:07

        А в чем проблема с переклеиванием? Да хоть каждый день в разное время, особенно если в календарь забить в телефон, я бы видел сразу во сколько завтра надо быть на работе.


      1. 4ebriking
        26.10.2016 10:45
        +1

        вообще идея — вместо того, что бы сделать адаптивным КЗОТ и т.п законодательство к смене сезонов — начать играться с «системным временем государства» — глубоко порочна. Но законотворцы во всех временах и странах похоже чем-то схожи (с нашими)


      1. nektotrishin
        27.10.2016 16:39

        Объявление на магазине вместо режимки:
        Свет горит — работаем
        Свет не горит — не работаем


    1. synedra
      26.10.2016 08:19
      +3

      Во-первых, потому что подавляющее большинство взаимодействий у подавляющего большинства людей происходят в пределах одного часового пояса и их проблемы перевода времени не волнуют. Некоторые организации (РЖД, например) используют московское время по всей стране, но таких меньшинство.
      Во-вторых, при использовании единого времени по всей планете теряется связь между календарным и астрономическим временем. В текущей системе в умеренных широтах в 12:00 Солнце не обязательно в высшей точке, но оно хотя бы точно выше горизонта, а рассвет всегда где-то между диапазоне 3 и 10 часами. ИМХО, запоминать, что в Москве световой день летом с 9 до 2 UTC, а в Иркутске примерно с 13 до 8 — было бы куда большим геммороем.


      1. knotri
        26.10.2016 11:30

        ну как бы близь серевного пояса, рассветы и закаты чертовски сильно зависят от времени года, и люди же как-то там живут. (в скандинавии например).


      1. HurrTheDurr
        26.10.2016 12:04

        Ну, чаще всего нужно знать, какое время суток «там» или сейчас, или в будущем, но относительно текущего часового пояса. А для этого нужно знать или удаленное местное время или их часовой пояс. Если нужно гуглить местное время — можно и погуглить, какое там астрономическое время. Если знать какой часовой пояс — живя по UTC будет еще проще прикинуть относительное астрономическое время, потому что не придется отнимать свой часовой пояс. То есть, часовые пояса должны существовать, но лишь для таких вот калькуляций и не более, автоматическое их применение и бессмысленно, и приводит к ошибкам. Если у организаций нет проблем с жизнью в пределах одного часового пояса — может и у всего мира не будет? :)


    1. ElijahCapricorn
      27.10.2016 16:00
      +1

      Это внесет другие проблемы. Есть законы, которые привязываются к локальному времени. Например, в одной из статей КОАП сказанно, что нельзя шуметь в период с 22:00 до 06:00. То же самое с ограничением на продажу алкоголя после 23:00. Что бы поддерживать такие законы при едином времени, то придется для каждого субъекта указывать свое временное смещение, которым сейчас, и является часовой пояс.


  1. Saffron
    26.10.2016 02:50
    +4

    Я, конечно, придираюсь, но все эти мифы касаются календаря, а не времени. Того, как мы выражаем ход времени, а не как оно идёт. Эти вопросы периодически поднимаются и уже не обладают новизной.

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


  1. iridiumhawk
    26.10.2016 08:16
    +3

    Очень интересно, но хотелось бы по каждому пункту почитать кейс.


  1. Piter_Y
    26.10.2016 08:18
    -1

    79. Данное программное обеспечение никогда НЕ будет работать на космическом корабле, облетающем чёрную дыру.


  1. Oxoron
    26.10.2016 10:25
    +4

    24. Неделя начинается в понедельник.

    Который начинается в субботу.


  1. Alexeyslav
    26.10.2016 11:38
    -1

    Для большей половины заблуждений, моя фантазия упорно отказывается представит ситуацию при которой заблуждение проявилось и была выявлена проблема…


    1. Bagobor
      26.10.2016 15:45
      +1

      Именно в этом ведь и полезность данных утверждений — понять ограниченность собственной фантазии. ))


  1. cybernomix
    26.10.2016 12:22

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

    Поэтому, в общем случае «таблеткой» будет использовать всегда и везде внутри системы использовать UTC0, а при отдаче времени — преобразовывать его автоматическки через TZ, в TZ хрянится не только отклонение часового пояса, но и история изменения этих поясов, поэтому конвертация прошлого времени из UTC -> в LocalTZ — должна быть корректной (если вы используете современные либы/средства системы).

    И наоборот, когда забираете локальные данные времени от пользователя преобразуете обратно в UTC, вот и всё. Операции между двумя временными параметрами соответственно только UTC<->UTC


    1. ToSHiC
      26.10.2016 15:47

      И, пользуясь этой схемой, попробуйте запланировать событие, которое должно произойти в 5 часов по местному времени через полгода (а лучше — в период лага принятия решения о переводе часов).


  1. Durimar123
    26.10.2016 15:19

    Во время переходов на летнее зимнее нужно хитро просчитывать тарификацию.
    А то получается, что раз в году в одном дне 23 часа, а во втором 25.
    И если считать в лоб EndDatatTime- StartDataTime, то легко можно добавить 1 час разговора, или на оборот, получить, что абонент наговорил -50 минут.


    1. firegurafiku
      26.10.2016 18:39

      Тарификация телефонных разговоров — это как раз тот случай, где не следует использовать местное время: если не требуется делать дневных/ночных тарифов, то биллинг вообще может целиком и полностью работать в UTC, ничего не зная о существовании местного времени.


      1. Durimar123
        26.10.2016 18:46

        Согласен, но в тогда, на начальный момент внедрения, были только логи с локальным временем. По которым и делался дальнейший расчет.


  1. michael_vostrikov
    29.10.2016 20:37
    +1

    Имхо, многие проблемы происходят от того, что представление данных используется как модель. Календарная система или часовой пояс это параметры представления некоторого момента во времени. При работе с разными представлениями нужно приводить их к какому-то общему виду. Unixtime это хорошая идея, но високосные секунды немного ломают картину.
    Мне кажется, было бы неплохо сделать более глобальную систему отсчета, например SST (Solar System Time), в которой значение будет увеличиваться на 1 каждую атомную секунду независимо от вращения Земли. Начальное значение установить в примерный возраст Солнечной системы. Все электронные системы могли бы вести отсчет именно в ней. Для всех событий прошлого или будущего можно задать точный момент на этой шкале. Для конвертации в земное время и обратно необходима таблица високосных секунд и часовой пояс, ну и григорианский календарь по умолчанию. Таким образом, будет универсальная однозначная неубывающая система отсчета времени.


    1. sumanai
      29.10.2016 22:48

      возраст Солнечной системы

      Довольно-таки неизвестная величина, разброс идёт на сотни миллионов лет.
      Ещё логичнее было бы взять за точку отсчёта возраст Вселенной, но тут разброс ещё больше.