What do you call the number of *days* since the unix epoch?

Viewed 2951

I initially learned that Unix time is the number of seconds that have elapsed since 00:00:00 (UTC) on 1 January 1970. With 24 hours in a day, that means that the unix timestamp grows by 86400 every day.

Then I heard about the concept of leap seconds, and thought that would mean that maybe on some days, the unix timestamp would grow by 86401 seconds in a day, but apparently this is not the case. From what I've read, every day is treated as if it contains exactly 86400 seconds. When you get a leap second, the operating system will 'fudge' it in some way to make sure there's still 86400 timestamps - either make every 'second' that day a little bit longer than a real SI second, or they'll report the same integer timestamp twice in a row.

So I think that this means that every date since 1 Jan 1970 can be mapped to a unique integer which is the timestamp at 00:00:00 (UTC) that day divided by 86400. (guaranteed to be an integer with no remainder because as discussed every day has to have 86400 timestamps). Alternatively you could take any timestamp during that day and calculate floor(timestamp / 86400).

For example, today, Fri 23rd April 2021 - timestamp at 00:00:00 UTC was 1619136000. As expected, this is a multiple of 86400, and 1619136000 / 86400 = 18740. There have been 18740 days since the unix epoch.

So my question is:

  1. Does this integer already have a well-known name? Is it already widely used in software for representing dates? I've not been able to find any reference online to this concept.
  2. Is my logic here correct - is there really a unique integer for each date, and you can easily calculate it in your code as timestamp_at_midnight_utc / 86400? Or is there some subtle problem that I've overlooked.

My motivation here is that I often have to do complicated calculations involving lots of dates without any time information (I work for a vacation rentals company where each unit has it's own availability calendar). I think I could make a lot of efficiency improvements in my code if I was working with integers uniquely representing a date, instead of DateTime objects, or strings like '2021-04-23'.

2 Answers

Yes, your logic is correct. Where I still get worried is that it requires you to do your calculations in UTC. Holiday rentals happen in a time zone, and associating a date in that time zone with the start of the day in UTC instead could get confusing soon.

And yes, the concept of a count of days since 1970-01-01 is sometimes used, though not often that I have seen.

In the Java documentation the terms “epoch day” and “epoch day count” are used, but this doesn’t make these terms a standard.

I think that the first avenue for you to consider is whether either your programming language comes with a library for counting days without the need to convert to and from seconds, or there is a trustworthy third-party library that you may use for the purpose.

This Java snippet confirms your calculation:

    // A LocalDate in Java is a date without time zone or UTC offset
    LocalDate date = LocalDate.of(2021, Month.APRIL, 23);
    long epochDayCount = date.toEpochDay();
    System.out.println("Epoch day: " + epochDayCount);

Output agrees with the result you got:

Epoch day: 18740

Link: Epoch day count in the Java documentation.

From my experience there is no official name for "days since epoch". Some nuances that can be detected about UNIX time (and its measurement units):

  1. It appears to be (relatively) officially defined as the number of seconds since the UNIX epoch.
  2. The main purpose of the UNIX time mechanism (regardless of measurement unit conventions) is to define a point in time.
  3. In the context of point #2, in practice, it has already become traditional that the UNIX timestamp is often returned in milliseconds.
  4. There are several factors that can influence the measurement unit that is available to you:
  • design decisions by APIs, libraries and programming languages
  • time resolution / clock frequency of the software & hardware that you are running on - e.g. some circuits, controllers or other entities aren't able to reach millisecond resolution or they don't have enough bits available in memory to represent big numbers.
  • performance reasons - offering a time service at millisecond or second resolution via HTTP might prove too much for networks / server CPUs. The next best thing would be a UNIX timestamp in minutes. This value can then be cached by intermediary caches for the duration of 1 minute.
  • use cases - there are epochs (e.g. in astronomy) where the day is the main measurement unit.

Here are a few examples of such day-based epochs:

If you have a look at one method of calculating the Julian Date, dividing by 86400 is an important step. So, given that the JD system seems to be widely used in astronomy, I think it would be safe to consider this division by 86400 as valid :)

Related