5 ms·
Wait if you just need dates, why not store dates? I was under impression unixtime is best for timestamps. But no reason to store something like a birthday usin
by Kilenaitor 3y ago
Wait if you just need dates, why not store dates?
I was under impression unixtime is best for timestamps. But no reason to store something like a birthday using them; just do a string YYYY-MM-DD?
- WalterBright 3y agoBecause of daylight savings time and time zones.
- dragontamer 3y agoPostgres's time handling types are elaborate, and probably the best I've personally worked with. Timestamp with TimeZone (including DST + timezone offset) is a different type from timestamp without TimeZone (ie: normalized to GMT). Timestamp - Timestamp results in "interval". Perhaps my method I was discussing doesn't work. But the overall idea that "Timestamp" needs to be a different type than "Interval", is pretty key IMO to handling date/times appropriately.
- hfkwer 3y agoSame in C#. DateTime, DateTimeOffset, TimeSpan.
- WalterBright 3y agoEverybody has this painful urge to reinvent the trivial in an incompatible way.
- WalterBright 3y ago> is pretty key IMO to A time_t can handle intervals just fine. time_t interval = t1 - t0;
- dragontamer 3y agotime_t will not handle daylight savings time conversions like Postgresql does. Unambiguously resolving "Timestamp at Eastern Time - Timestamp at Arizona Time" is not as simple as you might think. Postgresql handles this case. Trying to make "time_t" handle all cases is a mistake. We need like 3 to 4 types at a minimum to handle all of the edge cases that occur in the real world. (And if anyone teaches me of any more complications, maybe we'll need even more types)
- WalterBright 3y agoThe idea is to store all times as time_t in UCT, and do all time calculations in UTC. Do conversions to/from local time only as a first and last step. It's the only sane way to do it. The D runtime library does that, and it has proven to be robust and sane. We're also recommending that users do the same thing with different character representations - do all calculation and processing in UTF-8. Other sets are translated upon input into UTF-8, and the UTF-8 is translated to other character sets only on output.
- dragontamer 3y ago> Do conversions to/from local time only as a first and last step. Cool. Now how do you enforce that? Spoiler: have the local-time be reported as a TimestampWithTimeZone. When you're doing calculations, make them all Timestamps. When you're done, you can remember that you've converted from internal UTC-timestamps into the proper output format because you'll have a TimestampWithTimezone again. ----------- We're programmers. We have problems that are simple and enforceable through compiler constructs called "The Type System". Why have the human figure out if they have time-zone back-and-forth correctly or otherwise made a mistake (ex: adding code to the wrong "part of the process" and accidentally mucking with a TimestampWithTimeZone input/output variable rather than the internal Timestamp-UTC-only type variables?) Just... leave the job of checking this entire process to the compiler. If your n00b coworker messes up, the type system catches it and we're all set.
- dheera 3y agoFor lots of use cases you want to record precise events in a universal sense, and be able to add and subtract them or compare whether one timestamp is the same exact time as another timestamp regardless of timezones. UNIX timestamps have no timezones. They are just the number of actual seconds that have elapsed since a certain commonly-agreed time. You measure the number of seconds between two events just by subtracting their timestamps arithmetically, and don't need to do any parsing or interpreting of timezones. You can just say "this hacker in Russia breached the firewall 35 seconds after this dev committed code in the US" just by subtracting two numbers. The time an airplane takes off, the time your firewall detected a security event, the time a cross-timezone meeting starts, these are all good to store as UNIX timestamps. Birthdays are different because they are inherently imprecise; humans tend to celebrate their birthdays when it's a certain day of the month in their local time zone, with little to no regard for the time zone they were born in. Someone born in Singapore (UTC+8) and lives in Alaska (UTC-8) might still celebrate their 30th birthday on the month and day of their birthday in Alaska time even though their body might need another 16 hours before it has technically experienced 30 years of life.
- zokier 3y ago> UNIX timestamps have no timezones. They are just the number of actual seconds that have elapsed since a certain commonly-agreed time. You measure the number of seconds between two events just by subtracting their timestamps arithmetically, and don't need to do any parsing or interpreting of timezones If only. UNIX mishandling of leap seconds makes this all a illusion, in reality you need to have logic to handle them
- JohnFen 3y agoI don't think that UNIX mishandles leap seconds. It properly ignores them because they aren't relevant to it. The UNIX timestamp is literally the count of units past the epoch. The existence of leap seconds don't affect that count, it only affects the timekeeping of a completely different scheme. So yes, you have to handle leap seconds when you're converting from the timestamp to/from the time scheme you are interested in, just as you have to handle leap years, etc. The UNIX timestamp is just a different way of marking time, and is blessed with not worrying at all about how that time relates to the actual motion of the Earth. That makes it easy and consistent for common operations. It is not mishandling anything. It just can't shield you from the complexity of the forms of timekeeping that make it a point to be synchronized with the Earth.
- dontlaugh 3y agoThat’s not the point. How do you store a moment before 1970 if your timestamp is an unsigned integer?
- Kilenaitor 3y agoThis might seem like a silly question but could you give me an example use-case? I'm struggling to think of a context where we basically want to create timestamps for things that happened in the past. Especially things that we want to dynamically localize rather than e.g. just store as a straight up timestamped string.
- syntheweave 3y agoIf you are creating a relationship between times in the past, you have to convert from string to something else. And the something else is always subject to some other detail - the calendar of the past is not defined identically throughout history, so you can't just extrapolate year-month-day backwards to get a time. Nobody's really solved this, it has to be tackled anew for each case of "comparing dates from long ago".
- cdumler 3y agoWith a p-adic number.
- NoMoreNicksLeft 3y agoOne might want to store legislation as a git repo. But to do that, you'd need pre-1970 timestamps. Git doesn't use string dates.