Тогда я написал пост «Заблуждения программистов относительно „времени“», в котором указал 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)
Scf
26.10.2016 00:00+1Навевает ностальгию. Тот самый момент, когда ты узнал, что в сутках не всегда 24 часа.
vinograd19
26.10.2016 01:28+2Для понимания многих пунктов рекомендую запустить в терминале
cal 09 1752
vlreshet
26.10.2016 09:27+1А куда там полторы недели пропало? О_о
Для тех кому лень открывать терминалMaximChistov
26.10.2016 10:01+2Они в этом году приняли григорианский календарь, а две недели — смещение от предыдущего календаря
Mingun
27.10.2016 19:54Т.е. первые 2 дня — от одного календаря, а последующие дни — от другого. И общего между календарями только название месяцев и похожее количество дней в каждом из них. Неужели никто не находит это странным?
masai
28.10.2016 10:02Это неудобно и не добавляет изящества в систему измерения времени, но что в этом странного?
Mingun
28.10.2016 18:09Ну… это как если бы, например, чертили вы в какой-нибудь CAD системе дом, и вдруг посередине документа перешли с дюймов на миллиметры. Хотите, пожалуйста — используйте и дюймы и миллиметры, но на разных чертежах. Зачем их смешивать на одном?
Также и с датой. Зачем извращаться и пытаться в одной системе слепить два разных календаря? Вот, например, до 14 сентября 1752 года григорианского календаря было 13 сентября 1752 григорианского календаря. Ну и что, что в тот день этим календарем не пользовались? Это должно на него влиять как-то что ли?
Вообще, при близости таких дат нельзя говорить "1752 год", нужно уточнять, в каком календаре. Просто по умолчанию предполагается какой-то (например, григорианский). Аналогично, когда вы говорите "в 90-х", предполагается 20-й век (т.е. 1990). Если вы имеете ввиду 1890 или 2090, вы же не будите говорить "в 90-х", если конечно хотите, что вас поняли? Почему с календарем иначе?
masai
29.10.2016 01:01Ну, время одно, тут не получится не смешивать. Говорят, бог создал мир за шесть дней всего, так как у него не было проблемы обратной совместимости. :)
Что мы будем прошлое по-новому считать, что по-старому, нужно будет уточнять календарь, иначе даты в текстах того времени не перевести.
Да, некрасиво с календарями вышло. Дни по-дурацки распределены. В году нецелое число дней. И високосная секунда эта. И неравномерность вращения Земли, когда любой просто подняв камень замедляет ее обращение вокруг оси. Но вот как-то привыкли.
Mingun
29.10.2016 15:42Ну, время одно, тут не получится не смешивать.
Что значит не получится? В коде программ очень даже получится. Просто нужно четко помнить, что у нас есть несколько календарей и не пытаться создать один GOD-календарь, который будет покрывать все возможные случаи. Получаете странную дату от оператора при вводе в программу? Уточните, что за календарь.
Что мы будем прошлое по-новому считать, что по-старому, нужно будет уточнять календарь, иначе даты в текстах того времени не перевести.
Зачем подгонять календарь под даты? Календарь — по определению система счета дней в какими-то правилами. Разные календари — разные правила. Не проще ли использовать правильный календарь для дат "того времени"? Зачем тащить это легаси в современность, делая его еще более хрупким?
synedra
02.11.2016 07:16Получаете странную дату от оператора
Это здорово, когда у вас 27 кислева 5750 года, которое есть только у евреев. Но многие календари мало того что используют одинаковые названия, так ещё и использовались одновременно друг с другом и/или в одной и той же стране. Скажем, 4 февраля 1900 года — это по юлианскому или грегорианскому календарю? Или упоминавшееся выше 2 февраля 1931 — по одному из этих двух или советскому революционному?Mingun
02.11.2016 19:17Скажем, 4 февраля 1900 года — это по юлианскому или грегорианскому календарю? Или упоминавшееся выше 2 февраля 1931 — по одному из этих двух или советскому революционному?
По тому календарю, который выбрал пользователь во время ввода этих дат.
dmpas
26.10.2016 11:30В этот год «В Великобритании и её североамериканских колониях принят Григорианский календарь.»
Википедия(с)
zomby
26.10.2016 15:31Бог напевал песню про третье сентября, и пропел припев «я календарь переверну...» 11 раз.
BasilioCat
26.10.2016 09:29И что самое интересное, вывод этого календаря верен лишь для Британской Империи
talbot
26.10.2016 15:46
тоже ОКncal 02 1918
BasilioCat
26.10.2016 16:30Сравните вывод ncal 02 1918 и cal 02 1918 при локале ru_RU и ncal 09 1752 и cal 09 1752 при en_US. Вполне можно дополнить список из статьи
HurrTheDurr
26.10.2016 02:14+10Четверть проблем — из-за существования часовых поясов. Я убежден, что заблуждением является сама необходимость их существования. Кто-то может внятно объяснить, зачем нужны часовые пояса? Какая разница, во сколько у меня восходит солнце — в 07:00, в 01:00 или в 19:00, если это просто цифра?
Лично я перешел на UTC еще в феврале и с тех пор не заметил ни одной сложности, разве что пришлось научиться мгновенно прибавлять местный часовой пояс, чтобы отвечать на вопрос «который час». Назначать межконтинентальные звонки проще — сразу понятно, через сколько часов он будет проведен. Путешествовать проще — сразу понятно, сколько времени ты провел в пути.
Тогда в чем смысл-то, кроме «тут так принято»? Проще определять время суток на другом конце земного шара, что можно сделать и живя по UTC, примерно запомнив часовые пояса? 20 заблуждений из 79 — великоватая цена за такое ничтожное преимущество.webmasterx
26.10.2016 07:16а как быть с летним временем? Переклеивать каждые полгода наклейки с надпись работаю с ХХ до YY?
dipsy
26.10.2016 10:07А в чем проблема с переклеиванием? Да хоть каждый день в разное время, особенно если в календарь забить в телефон, я бы видел сразу во сколько завтра надо быть на работе.
4ebriking
26.10.2016 10:45+1вообще идея — вместо того, что бы сделать адаптивным КЗОТ и т.п законодательство к смене сезонов — начать играться с «системным временем государства» — глубоко порочна. Но законотворцы во всех временах и странах похоже чем-то схожи (с нашими)
nektotrishin
27.10.2016 16:39Объявление на магазине вместо режимки:
Свет горит — работаем
Свет не горит — не работаем
synedra
26.10.2016 08:19+3Во-первых, потому что подавляющее большинство взаимодействий у подавляющего большинства людей происходят в пределах одного часового пояса и их проблемы перевода времени не волнуют. Некоторые организации (РЖД, например) используют московское время по всей стране, но таких меньшинство.
Во-вторых, при использовании единого времени по всей планете теряется связь между календарным и астрономическим временем. В текущей системе в умеренных широтах в 12:00 Солнце не обязательно в высшей точке, но оно хотя бы точно выше горизонта, а рассвет всегда где-то между диапазоне 3 и 10 часами. ИМХО, запоминать, что в Москве световой день летом с 9 до 2 UTC, а в Иркутске примерно с 13 до 8 — было бы куда большим геммороем.knotri
26.10.2016 11:30ну как бы близь серевного пояса, рассветы и закаты чертовски сильно зависят от времени года, и люди же как-то там живут. (в скандинавии например).
HurrTheDurr
26.10.2016 12:04Ну, чаще всего нужно знать, какое время суток «там» или сейчас, или в будущем, но относительно текущего часового пояса. А для этого нужно знать или удаленное местное время или их часовой пояс. Если нужно гуглить местное время — можно и погуглить, какое там астрономическое время. Если знать какой часовой пояс — живя по UTC будет еще проще прикинуть относительное астрономическое время, потому что не придется отнимать свой часовой пояс. То есть, часовые пояса должны существовать, но лишь для таких вот калькуляций и не более, автоматическое их применение и бессмысленно, и приводит к ошибкам. Если у организаций нет проблем с жизнью в пределах одного часового пояса — может и у всего мира не будет? :)
ElijahCapricorn
27.10.2016 16:00+1Это внесет другие проблемы. Есть законы, которые привязываются к локальному времени. Например, в одной из статей КОАП сказанно, что нельзя шуметь в период с 22:00 до 06:00. То же самое с ограничением на продажу алкоголя после 23:00. Что бы поддерживать такие законы при едином времени, то придется для каждого субъекта указывать свое временное смещение, которым сейчас, и является часовой пояс.
Saffron
26.10.2016 02:50+4Я, конечно, придираюсь, но все эти мифы касаются календаря, а не времени. Того, как мы выражаем ход времени, а не как оно идёт. Эти вопросы периодически поднимаются и уже не обладают новизной.
Но вот если бы кто-то собрал материал относительно мифов и действительности самого ВРЕМЕНИ, а не календаря, статья получилась бы чрезвычайно любопытной. Насколько я знаю, специалисты (гео)распределённых систем могут целлое эссе посвятить природе времени. И статей научных уже написано достаточно много на эту тему. Я прям даже не знаю, кто произвёл больший объём исследований природы времени — специалисты информатики, или теоретические физики.
Piter_Y
26.10.2016 08:18-179. Данное программное обеспечение никогда НЕ будет работать на космическом корабле, облетающем чёрную дыру.
Alexeyslav
26.10.2016 11:38-1Для большей половины заблуждений, моя фантазия упорно отказывается представит ситуацию при которой заблуждение проявилось и была выявлена проблема…
Bagobor
26.10.2016 15:45+1Именно в этом ведь и полезность данных утверждений — понять ограниченность собственной фантазии. ))
cybernomix
26.10.2016 12:22Турция, например, иногда совершает переход на летнее время когда пр-во решит, и порой это может быть с лагом неделя туда-сюда.
Поэтому, в общем случае «таблеткой» будет использовать всегда и везде внутри системы использовать UTC0, а при отдаче времени — преобразовывать его автоматическки через TZ, в TZ хрянится не только отклонение часового пояса, но и история изменения этих поясов, поэтому конвертация прошлого времени из UTC -> в LocalTZ — должна быть корректной (если вы используете современные либы/средства системы).
И наоборот, когда забираете локальные данные времени от пользователя преобразуете обратно в UTC, вот и всё. Операции между двумя временными параметрами соответственно только UTC<->UTC
ToSHiC
26.10.2016 15:47И, пользуясь этой схемой, попробуйте запланировать событие, которое должно произойти в 5 часов по местному времени через полгода (а лучше — в период лага принятия решения о переводе часов).
Durimar123
26.10.2016 15:19Во время переходов на летнее зимнее нужно хитро просчитывать тарификацию.
А то получается, что раз в году в одном дне 23 часа, а во втором 25.
И если считать в лоб EndDatatTime- StartDataTime, то легко можно добавить 1 час разговора, или на оборот, получить, что абонент наговорил -50 минут.firegurafiku
26.10.2016 18:39Тарификация телефонных разговоров — это как раз тот случай, где не следует использовать местное время: если не требуется делать дневных/ночных тарифов, то биллинг вообще может целиком и полностью работать в UTC, ничего не зная о существовании местного времени.
Durimar123
26.10.2016 18:46Согласен, но в тогда, на начальный момент внедрения, были только логи с локальным временем. По которым и делался дальнейший расчет.
michael_vostrikov
29.10.2016 20:37+1Имхо, многие проблемы происходят от того, что представление данных используется как модель. Календарная система или часовой пояс это параметры представления некоторого момента во времени. При работе с разными представлениями нужно приводить их к какому-то общему виду. Unixtime это хорошая идея, но високосные секунды немного ломают картину.
Мне кажется, было бы неплохо сделать более глобальную систему отсчета, например SST (Solar System Time), в которой значение будет увеличиваться на 1 каждую атомную секунду независимо от вращения Земли. Начальное значение установить в примерный возраст Солнечной системы. Все электронные системы могли бы вести отсчет именно в ней. Для всех событий прошлого или будущего можно задать точный момент на этой шкале. Для конвертации в земное время и обратно необходима таблица високосных секунд и часовой пояс, ну и григорианский календарь по умолчанию. Таким образом, будет универсальная однозначная неубывающая система отсчета времени.sumanai
29.10.2016 22:48возраст Солнечной системы
Довольно-таки неизвестная величина, разброс идёт на сотни миллионов лет.
Ещё логичнее было бы взять за точку отсчёта возраст Вселенной, но тут разброс ещё больше.
vintage
А где контрпримеры по каждому пункту?
Smi1e
Очень не хватает, ибо многие моменты требуют наглядного пояснения.
Pilat
В оригинале есть ссылки на объяснения. Но там переводить-ненапереводить.
Материал, судя по всему, собран из нескольких источников, поэтому много почти точных повторов.
izuware
Год за годом в процессе роста сеточки с добавлением железочек, программочек и др. так наплясался со временем, что безоговорочно верю каждому пункту.
chieftain_yu
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. Данное программное обеспечение никогда не будет работать на космическом корабле, облетающем чёрную дыру.
А вот это можно запихать в лицензионное соглашение!
rayz_razko
Израиль отличный пример с выходными. они в Пт и Сб. Вс нормальный рабочий день.
alix_ginger
И с праздниками, длящимися нецелое число суток — с появления первой звезды до восхода Солнца, или что-то подобное.
chieftain_yu
И соответствующий день считается праздничным на таком вот интервале времени и обычным рабочим — на остальном?
marcor
> 36. Время всегда идёт вперёд.
Думаю, имеются в виду прыжки времени из-за шаловливых ручек пользователя. Помню, болтал по Skype и одновременно настраивал ntpd. Я отмотал время назад, и в итоге Skype показывал, что я разговариваю 1 000 000 часов. Всё остальное работало, что очень мне понравилось)
Или всем знакомые проблемы с SSL сертификатами, когда из-за кривого локального времени сертификат недействителен.
А, а ещё в *nix может возникнуть time paradox, при попытке удаления файла раньше, чем он был создан. (не проверял, кто сталкивался — буду рад узнать больше)
MacIn
Нет, это не шаловливые ручки пользователей, а шаловливая виртуализация.
red_led
Та же Швеция. Из вики:
red_led
Прошу прощения, поторопился, 1712 всё таки высокосный. Но 30е февраля тоже интересный пример: )
Вики:Достаточно перехода с летнего времени на обычное?
m08pvv
Возможно, речь идёт о том, что системное время изменится на >= 1000 миллисекунд за время Thread.Sleep(1000), однако в этот момент может быть, например, переведено время на час назад…
powerman
Всё ещё смешнее: sleep(n) действительно может отработать чуть-чуть меньше, чем за n. С чем связано — не разбирался, но видел своими глазами неоднократно.
m08pvv
Почему-то сразу вспоминается, что в Stopwatch, например, есть проверка на то, что результирующее время может оказаться отрицательным — тогда принудительно возвращается 0.
SVlad
Системный менеджер процессов может работать с некоторыми интервалами. И может разбудить поток и немного раньше.
Fil
Akon32
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, — знанием особенностей платформы. Остальные действительно удивляют.
Any1
Думаю, имелся в виду UTC?00:25:21, существовавший до 1916 года в Ирландии. Других часовых поясов с точностью до секунд я не нашел (с точностью до минут был еще UTC?00:44 в Либерии до 1972 года).
chieftain_yu
Ну тогда можно окунуться век в осьмнадцатый, когда времена считались по столицам, там каждый по-своему отличался от Гринвича.
ZyXI
Я полагаю, проблема в том, что во?первых, секунда «часов» по разным причинам
может быть короче секунды — к примеру, ntpd синхронизирует системное время,
укорачивая/удлиняя секунду. Либо это отсылка к тому факту, что на не?realtime
системах подождать в точности одну секунду у вас не выйдет никак, а на realtime
вы всё равно ограничены точностью генератора.
При чём тут она? Нормальный sleep использует другие часы. Дело в том, что
Thread.sleep(1000)
на не?realtime системах (т.е. в абсолютном большинствесистем) передаст управление ядру, которое радостно загрузит следующий процесс.
И не отдаст управление обратно, пока опять не будет вызван планировщик задач,
и то вам может помешать более приоритетный процесс. При этом планировщику нужно
убедиться, что поток подождал достаточно (т.е. управление ваш поток, скорее
всего, получит только на следующий после 1 000 мс вызов).
В linux NTP использует
adjtime()
, который влияет, в том числе, и наCLOCK_MONOTONIC
. Обычно когда нужны монотонно возрастающие часы используютименно их, а не
CLOCK_MONOTONIC_RAW
. Сильных изменений adjtime не сделает, новполне может замедлить часы достатачно, чтобы время было меньше.
Кроме того, я не знаю, как планировщик определяет «достаточно подождал»: одним
из возможных вариантов будет «в результате работы планировщика мат. ожидание
времени в sleep должно быть равно 1 000 мс», что автоматически означает, что
часть процессов должна ждать меньше.
Правда мне не понятно, что здесь делают эти пункты: совершенно определённо, что
Thread.sleep()
не имеет отношения к «внешнему» времени.Учитывая, что
Thread.sleep()
— это уже детали реализации, предполагаю чтоимеется ввиду просто то, что пользователь может внезапно перевести часы.
Вы говорили, что «СССР переводился, вроде, с воскресенья на понедельник. Сейчас
— на выходных.» А другие страны с летним временем в тот же период?
Ещё есть вопрос про «считывание часов»: в linux время хранится в виде UNIX
timestamp и отдельно часовой пояс. Таким образом, в зависимости от способа
считывания, может оказаться, что сравнение с UTC всегда будет укладываться
в пределы погрешности синхронизации часов.
Нет.
getCurrentTime()
может отработать до того, как время изменится.chieftain_yu
Поискал данные, выяснил — ошибся.
В 1981-1983 годах переводы времени были 1 апреля и 1 октября. Так что да — бывали и времена различия.
saboteur_kiev
Время может идти не в перед, если в процессе выполнения приложения, кто-то изменил время.
Например тот же часовой пояс назад на час уехал, или просто запустилась синхронизация с атомными часами в инете и локальное время поправилось на +-несколько секунд
igrishaev
Спасибо, и еще тайский календарь со смещением в 543 лет вперед.
Bellicus
29 февраля 1931 года
chieftain_yu
Если вы про советский революционный календарь, то в табель-календаре на 1931 год 29 февраля отсутствует:
Он же в более читаемом виде:
Источник — Википедия.
Bellicus
Внимательно читали?)
| На самом деле указанные дни существовали, но не являлись «днями пятидневок». Календарь являлся табелем в прямом смысле слова, в нём содержались только рабочие дни без праздников/
| Если бы было принято решение, 29 февраля могло бы также не входить в число дней табеля-календаря, тогда табель-календарь остался бы совершенно неизменным для любого года.
chieftain_yu
Тогда поясните, пожалуйста, такую вещь — я насчитал в табель-календаре 72*5=360 дней.
При этом в табель-календаре не обозначены 22 января, 1 и 2 мая, 7 и 8 ноября. Еще пять.
В сумме — 365.
Вы уверены, что заради 29 февраля сам 1931 год было решено удлиннить на один день, и при этом вообще не упоминать, хотя пять праздничных дней заявлены явно?
Bellicus
Но вот почему то казусы с рожденными 29 февраля 30 и 31 годов имеют место быть)
chieftain_yu
Имеют место рассказы о казусах, а сами казусы — а) могут существовать, но объясняться ошибками паспортисток, б) могут не существовать, в) могут существовать и объясняться тем, что 29 февраля в 1930/31-м году было, но не обнаружено документальных подтверждений их существования, г) могут существуют, просто я не смог найти их документированными.
Как по мне, бритва Оккама оставляет варианты а и б.
Если вы можете показать документы с такой датой — с удовольствием ознакомлюсь.
Bellicus
http://lists.memo.ru/index16.htm (ищи Попов Сергей Александрович 1881)
https://people.onliner.by/2013/09/17/belorus-rodilsya-30-fevralya (возможно утка)
ну и про Камчатский УФМС где-то ниже написано.
chieftain_yu
1) Я не вижу документов.
На сайте записано со слов воронежского «Мемориала». Варианты фактического источника записи: а) ошибка в бумажном документе, б) ошибка сканирования, в) ошибка распознавания, г) ошибка программиста, писавшего скрипт генерации жертв политических репрессий, д) ошибка при переносе на lists.memo.ru.
2) ситуация еще краше:
Вообще не понимаю, почему этот курьез может служить доказательством.
Вот вам еще несколько табель-календарей. Покажите, пожалуйста, 29 или тем паче 30 февраля.
Bellicus
Ну а кто даст гарантию, что все ваши календари тоже подлинные?)
zelenin
а нужно? это докажет что было 30 февраля?
chieftain_yu
Никто. :)
Но из двух версий для меня более обоснованной кажется именно версия, что в 1930-31 годах ни 29-го, ни 30-го февраля не было.
duger
Вот, например: (найдено здесь)
chieftain_yu
Идем по ссылке.
Там идем и внимательно читаем:
duger
Во-первых — по-вашему в сельсовете не знали что 30-го февраля не бывает? Потроллить пацана решили?
Во-вторых — есть как минимум еще один подобный случай (ниже мой коментарий о судебном решении по поводу пенсионерки с датой рождения 29-го февраля 1930). Суд признал, что ее свидетельство о рождении с такой датой действительно, и предписал УФМС внести изменения в свое ПО, чтобы оно считало дату 29.02.1930 валидной. Что, в контест статьи — о том что программы должны быть готовы к таким неожиданностям — вполне укладывается.
chieftain_yu
Судебное решение означает, что свидетельство действительно, а не что такая дата была.
И обязало УФМС мочь выдать пенсионерке госуслуг даже с такой датой, внесенной в документы.
Это не доказательство существования даты, а именно показ необходимости иметь возможность ее обработать.
chieftain_yu
Внимательно почитал статью Вики:
А вариант с февральскими извращениями — это теоретический вариант:
Bellicus
25. Если имеется ввиду световой день, то полярная ночь.
26. Час Земли считается праздником?
34. разница между UTC и GMT может доходить до 0,9с
Mingun
Поменялся календарь? Вы считаете нормальным измерять начало интервала по одной системе а конец по другой?
Аналогично
Очевидно, опять намекают на другие календари. С учетом того, что предыдущее заблуждение явно про григорианский календарь (общепризнанный современный то бишь), то 0 заблуждением во всем этом списке следует назвать «при обсуждении темы времени все участники говорят об одном и том же и только об одном календаре». В противном случае вся эта дискуссия похоже на беседу шизофреников.
Похоже, имеется ввиду наоборот, если приходит 0382-12-01, то после преобразования Str->Int->Str без паддингов для года получим 3-хзначное число. Формат ГГГГ-ММ-ДД уже предполагает, что для года требуют ввести 4 цифры.
Все-таки пора определиться, один календарь мы рассматриваем или все, в том числе и те, которые придумают в будущем.
Atilla
25. День начинается утром.
Возможно имеется в виду астрономический день — он начинается в полдень.
https://en.wikipedia.org/wiki/Astronomical_day
ustin
В оригинальной статье на реддите приводили пример: ТВ-расписание в японии. Поздние программы считаются частью прошлого дня. Вот расписание, где встречаются времена вида 27:04.
nektotrishin
26. Праздники занимают целое число полных суток.
антипример: Рамандан начинается с восхода солнца + месяц и до заката крайнего дня.
Пасха с вечерней службы (примерно в 16-17часов) и +39 дней
duger
Например: (источник)
RovingStone
В солнечных сутках может быть больше 24 часов
artemisia_borealis
И сейчас бывает. Например 13-й месяц в Коптском календаре длится 5 или 6 дней.
В Непале вообще 5--6.
В Григорианском каждый год N, при N mod 400 = {100,200,300} невискосный.
Напрмер, Календарь Армелина и другие стабильные календари
Сейчас наверное нет таких примеров. Но, например, в процессе перехода к поясным временам, растянувшимся на полвека было:
В Либерии до 1972 время было UTC +44:30.
В Иране в субботу
Что такое день и что такое утро? Утро — это восход или конец (астрономических, навигационных, гражданских) сумерек?
А если день Полярный? А если Полярная ночь, то определяется ли день?
В Иране только пятница
Думаю нельзя. В Иранском календаре циклы по 33 года, но иногда назначаются по 29 или 37 лет.
Вероятно не в этом дело. О ВС системные часы не знают. Скорее точность «тиков» процессора.
Наверное 999.51 вполне возможно.
И не только ЛДП. Просто большинство скачков на запад из пояса в пояс.
Аналогично, астрономическое время при достаточно быстром перемещении на запад. А у полюсов и при небыстром.
JS так не считает. В консоли, например:
Недаром тут некоторые вводы повторены два раза. Дело в том, что если 3600*h + 60*m + s не прывышает 86400, то мы получем «корректную» установку даты с учётом переполенния
минут и секунд, а в ином случае при повторном введении значений у нас щёлкает и день.
О том какой качественный это багогенератор, можно долго рассуждать.
не учитвать, это просто отбрасывать (floor), но лучеше всё-таки округлять иначе целевое время будет иметь ощику выше 0.5 сек.
Если не учесть (особенно отбросив как выше), то при переходе в Новый Год (месяц, час) можно получить казус (скрыть различия или выявить его при отсутсвии).
Теоретически, если в одной стране есть пояса отличающиеся не на целое число часoв, то можно скакнуть пр переходе.
Хороший пример Австалия с поясами: +8:45, +9:3о, +1о: оо (и ещё там острова есть +5: оо, +6:3o, +1о:3о)
В Григорианском каждый год N, при N mod 400 = {100,200,300} невискосный.
В Иране обычно циклы по 33 года (вискосные там N mod 33 = {1, 5, 9, 13, 17, 22, 26 или 30} )
Антарктида. Китай. Гренландия.
Это уже какая-то софистика. Что такое скорость времени? dt/dt? В принципе астрономическое время можно сказать что идёт по разному, если скорость определить как dt/dx [c/м].
Тогда это ещё и от широты зависит.
>А вот это можно запихать в лицензионное соглашение!
В целом ПО, вращаясь вместе с солнечной системой вокруг центра галактики, вращается вокруг ЧД.
ga-to
То же самое по п. 7 в Советской России было в 1918: после 31 января сразу наступило 14 февраля (перешли на григорианский календарь), вследствие чего есть даже шутка, что «с 1 по 13 февраля на территории РСФСР никто не рождался, не умирал и вообще не произошло никаких событий»
DrGluck
41. При выводе на дисплей даты и времени показываемое время имеет ту же самую вторую часть, что и время, хранимое в памяти.
Например можно встретить на 8-битном контроллере при чтении значения 16-битного таймера (если не читать документацию). Обычно в документации указан порядок чтения, гарантирующий, что будет прочитано одно 16-битное значение.
Правда тут можно нарваться на то, что после чтения первого байта, придёт прерывание и второй байт будет прочитан немного позднее, например на пару миллисекунд.