[HN Gopher] How Debian cron handles DST transitions ___________________________________________________________________ How Debian cron handles DST transitions Author : zdw Score : 62 points Date : 2021-10-27 18:01 UTC (4 hours ago) (HTM) web link (blog.healthchecks.io) (TXT) w3m dump (blog.healthchecks.io) | 0xbadcafebee wrote: | I hope nobody is depending on cron to be super reliable and | accurate. If it matters how often a job is run, the job itself | needs to account for it. Cron is simply not intended to be a | super robust job scheduler. | codetrotter wrote: | The key thing to realize about DST IMO, is the fact that time | zone is adjusted for it. | | So for example I live in Europe/Oslo, which is UTC+02 when DST is | in effect (CEST). When DST is not in effect, my time zone becomes | UTC+01 (CET). | | And therefore, when we adjust our clocks, time is not really | moved. | | Although it may seem like the time turns back from 3 AM to 2 AM | on 31 October 2021 in my location, that's only true if you don't | take the time zone into account. | | What actually happens is we go from: | | 2021-10-31T02:59:59.999...+0200 | | to: | | 2021-10-31T02:00:00.000...+0100 | | And we see then that if we convert this time to UTC, we have | simply a transition from: | | 2021-10-31T00:59:59.999...Z | | to: | | 2021-10-31T01:00:00.000...Z | | So actually, nothing bad happened. | | The article also says as much, but I wanted to comment on how I | think about it when I consider DST, because I think it's a pretty | straight forward way to look at it. | tshaddox wrote: | Just to clarify the terminology, since you seem to be referring | to the widely-used tz database, "time zone" is defined as a | geographic region where local clocks agree year-round. | Europe/Oslo is one such time zone in the tz database. Thus your | time zone does not change when DST begins and ends, only your | UTC offset. | codetrotter wrote: | Yes I may have formulated that part a bit clumsily. What I | mean to convey is that the time zone changes between CEST and | CET. And this in turn means different UTC offsets. | | The Europe/Oslo identifier from the time zone databases was | meant for context, but may have made what I tried to say less | clear, sorry about that. | birdman3131 wrote: | (Caveat that this may be US specific.) For the Central time | zone there are 2 variants. CST and CDT. Most people will | wrongly use CST to mean both variants but that is incorrect. | Central Standard Time only applies when daylight savings is | off and Central Daylight Time only applies when it is on. | | The same is true for say PST and PDT. | tshaddox wrote: | It's common to casually refer to "CST" and "CDT" as "time | zones." I was only pointing out that in the specific | context of the tz database, "time zone" has a specific | definition that is distinct from individual UTC offsets. | mdavidn wrote: | CST and CDT are known as a single time zone, | America/Chicago, in the tz database. The tz database can | convert UTC times into local Chicago time. It even | accommodates historic changes in DST law, like changes to | the start date in prior years. | herova wrote: | DST must die. That's it. It's 21 century already. Why? | icedchai wrote: | I'd prefer we stay on daylight time all year around, eliminate | standard time. (Northeast US here.) | tzs wrote: | Because we live on an approximately spherical world whose | rotation is not tidal locked to the star it orbits, that world | rotates around an axis that is not perpendicular to its orbital | plane around said star, we have a biology that uses sunrise to | synchronize its internal clocks to the planet's rotation, we | have spread to occupy regions of the world that are not near | its equator, and we align our timekeeping to midnight or noon. | dtgriscom wrote: | A lot of people (myself included) like it. Is that a rational | reason? No, but it is a portent of how difficult it may be to | get rid of it. | function_seven wrote: | That's a perfectly rational reason! I like it, too. | | Yeah, it makes it harder for programmers to accommodate. I'll | play my violin for them next July when it's nice and bright | outside at 7:30pm. :) | tshaddox wrote: | That might be a valid reason, but it's almost certainly not | an _explanation_ of why things are the way they are now or | why they might change in the future. I don 't recall there | ever being a vote on the subject. | PetahNZ wrote: | Because I don't like it getting light at 4am and dark at 5pm. | flabbergasted wrote: | As the very last line mentions, "use UTC" and avoid silly DST | issues like this. | dbrueck wrote: | Would that it were so simple! For cronjobs, maybe it often is, | but DST transitions are a mess to deal with in things like | calendaring UIs and other places where you have to convert | point-in-time values to the format consumed by normal people, | and where your users can have different but legitimate | expectations about how those transitions should be handled. | | At one company I remember helping build a scheduling UI for a | linear TV broadcast channel, where you plan out the broadcast | day in 24h blocks. Worked great except twice a year when, due | to DST, you have either a 23h day or a 25h day, and half a | dozen ways various customers expected that to be handled. The | de facto solution was to have happy customers 363 days a year. | :-/ | | Hey, but thank goodness for | https://en.wikipedia.org/wiki/Uniform_Time_Act or it would have | been even worse! | midasuni wrote: | My shop opens when the local clock tower says 9 am | | I want a cronjob set up to change the "closed" sigh to say | "open". | | How do I set that with UTC? | dqv wrote: | You store the time you want to see on the clock tower and the | timezone where the clock tower is. Every hour you do the | following pseudocode: if | utc_now().to_timzone(my_timezone) >= "9AM": sign | = "open" | | I know you didn't mean this, but it _was_ a problem I thought | about: How does one make sure the local clock tower actually | changes in cadence with DST? You can 't, so I guess you could | use open vz with a camera to have your open sign be based on | what time is actually seen on the tower. | | I know it's just an example, but I say in jest, don't use | cron jobs to change your closed sign to open! If you can't | make it to your shop, people will be waiting around all day | for you to unlock the door. Very unhappy customers. | blibble wrote: | some timezones go forwards/back 30 minutes with DST | | and historically there have been even weirder cases | remram wrote: | This is just duplicating the code already in cron. Of | course you can make cron simpler by running your script | every hour, and making the script more complex. You're just | pushing the complexity to user-authored, non-reviewed, non- | tested code. What is the advantage? | dqv wrote: | The first advantage is that you can dynamically check | what your actual open hours are rather than having them | statically configured (e.g. a web service to check for | holidays). Open hours are never actually static. (Unless | maybe cron does holidays?) | | The second advantage is that you can check in multiple | timezones especially if the server itself is in DST. Does | cron itself let you set the timezone for each individual | check? Or does it only run in one timezone? As far as I | can tell, it only lets you use one timezone. | PetahNZ wrote: | Set the cron job to run every hour in UTC, and your | application logic checks if its time to open in the | configured time zone. | kymaz wrote: | So the fix to using UTC for computers and crons that only | care about the local time zone is to reimplement time | checking? | | If youre just gonna run it every hour, you might as well | while(1){ check time; do stuff; sleep 1 hour;} now there's | one less dependency? | rovr138 wrote: | It depends on that never dying. | kymaz wrote: | You also depend on cron never having a bug, and you also | depend on crons working as intended, unless you also have | some extra system logging your cron jobs. | dbaupp wrote: | Unfortunately there's more ... interesting time zones than | UTC+/-xx:00, and more interesting transitions than moving | an hour. | | For instance, Nepal uses UTC+05:45, and the time shifted by | 15 minutes in 1986 (from UTC+05:30): | https://www.timeanddate.com/time/zone/nepal/kathmandu | | That said, I think running every 15 minutes handles all | currently-observed time zones. | noja wrote: | Open your shop at 0900 UTC | dzdt wrote: | This is a same problem in financial markets. Things like | options contracts depend on a value observed say at 10am New | York time on a particular date a decade in the future. If the | daylight savings time schedule changes between now and then | then the UTC time of the expiry of the options contract will | change. The right reference isnt UTC or EST or EDT but "NY | local time." | tshaddox wrote: | And probably don't schedule anything for the last few seconds | of a calendar year. | janiscaune69 wrote: | End of year is fine, it is around start of day / end of day | when DST switches that screws up things | tshaddox wrote: | I was referring to leap seconds, which are applied at the | end of the calendar in UTC, and are the only cases where | UTC is not a continuous and predictable time scale. A | scheduling system like cron still needs to have some | mechanism to handle events that are scheduled in UTC, | because particular UTC seconds can be skipped over. (And | FYI, this can actually happen in other parts of the | calendar year, not just the end.) | mdavidn wrote: | A leap second would be a change "less than 3 hours," so | the job should still run according to the cited Debian | man page. | | Google's NTP servers smear leap seconds over an entire | day, so UTC may appear continuous despite leap seconds. | | https://developers.google.com/time/smear | tshaddox wrote: | Indeed. I only meant that simply switching to UTC doesn't | actually reduce the necessity for the complex handling of | scheduled events this article describes. It would just | make these cases occur less frequently. | 0x0 wrote: | Huh, it's quite surprising to see the concurrent runs at 02:00 | for multiple instances. | | I guess this can cause quite a bit of weirdness if you use a spec | like "5,17,32,47 * * * *" (to avoid the "thundering herd" of | cronjobs at xx:00) and then getting four concurrent instances | running at 02:00 in the daylight switchover hour? | cuu508 wrote: | The hour specifier in "5,17,32,47 * * * *" is "*", so this | would count as a wildcard job, and Debian cron would not run it | at xx:00. But, if the hour specifier started with anything but | "*", that would be problematic. For example "5,17,32,47 0-23 * | * *" appears equivalent, but Debian cron _would_ run this one | four times at xx:00 after a time jump. | | Edit: I just ran the second example - | https://gist.github.com/cuu508/7e42e5eecd42babf43f8d0dd0d987... | 0x0 wrote: | Interesting, thanks for running it. And yes I guess I got | confused with the hour wildcard. So I guess the takeaway is | to avoid non-wildcarded hours such as 0-23 or 0,1,2,3,4,5,6,7 ___________________________________________________________________ (page generated 2021-10-27 23:00 UTC)