Martin Laptev

Dec Date

  • Home
  • About
  • CV/Résumé
  • Article List
  • Dec
    • Date
    • Time
    • Snap
    • Span
  • History
    • World War 2
  • Machine Learning
    • Probablity
    • Language Models
  • Software
    • Git
    • Jupyter
    • Observable
    • Positron
    • Quarto
      • Filter
      • Include
      • Script
    • Reveal

On this page

  • Day of year (doy)
  • Day of era (doe)
  • Epochal year aggregate (eya)
  • Day of week (dow)
  • Week of year (woy)
  • Day of dek (dod)
  • Day of month (dom)
  • Month of year (moy)
  • Summary
  • Next
  • Cite
  • View source

Other Formats

  • CommonMark

Dec Date

Introducing the Dec calendar (Decalendar), which displays dates in years and days using math notation without the need for months or weeks.

Author

Martin Laptev

Published

2024+345

%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '32px'}}}%%
flowchart LR
   A[Dec]-->B[date]-->C[time]-->D[snap]-->E[span]
   click A "/dec"
   click B "/dec/date"
   click C "/dec/time"
   click D "/dec/snap"
   click E "/dec/span"

My website serves as a demonstration of both the Quarto publishing📤system and the Dec measurement📐system. I use several clever hacks to get Quarto to display all of the dates on my website in the Dec year+day format. Knowing the basics of the Dec calendar🗓️(Decalendar) will help you to understand the filter, include, and script articles in the Quarto section of my site.

Among its many features, Quarto offers support for the Observable data visualization system. Observable is my top choice for interactive graphics. We can interact with the two Observable calendar🗓️plots below⬇️using the adjacent Observable inputs. The scrubber🧽input is a great place to start because it cycles🔄through every value of the range🎚️inputs beneath it.

To activate the scrubber🧽input, press the Play▶️button above⬆️the range🎚️inputs. Upon activation, the red🟥box in each plot will move between the first and the last day of the Dec year. While it always begins with Day 0, the Dec year ends with either Day 364 or Day 365. To add or remove Day 365, use the toggle✅input labelled🏷️“Leap year” to the right of the Play▶️button.

The “Leap year” toggle✅input shifts 306 dates, Day 0 to Day 305, in the Gregorian calendar🗓️by one day, but does not change the order of any Dec dates, because Day 365 is the last day of Dec leap years and is always followed by Day 0 of the subsequent Dec year. The “Vertical layout” toggle✅input rotates the plots by a quarter turn, interchanging the x- and y-axes.

The axis labels🏷️of the plots imply that a dek and a “day of dek” (dod) are analogous to a week and a “day of week” (dow). Indeed, deks are groups of ten days that serve as the Dec analog of both weeks and months. With the exception of Day 365 in leap years, every year has the same deks and months, but not the same weeks, because the dow of the first day of the year varies.

viewof leapscrub = Inputs.form([
  Scrubber(numbers, {autoplay: false, alternate: true, delay: 86.4, loopDelay: 864, format: y => "", inputStyle: "display:none;"}),
  Inputs.toggle({label: "Leap year", value: false}),
  Inputs.toggle({label: "Vertical layout", value: false}),
])
viewof dotyInput = Inputs.range([0, 364 + leapInput], {value: 306, step: 1, label: "Day of year"});
viewof monthInput = transformInput(
  Inputs.range([1, 12], {step: 1, label: "Month"}),
  {bind: viewof dotyInput, transform: doty2month, invert: month2doty}
);
viewof dotyInput1 = transformInput(
  Inputs.range([-365 - leapInput, -1], {step: 1, label: "Day of year"}),
  {bind: viewof dotyInput, transform: subN, invert: addN}
);
viewof dotmInput = transformInput(
  Inputs.range([1, 31], {step: 1, label: "Day of month"}),
  {bind: viewof dotyInput, transform: doty2dotm, invert: (x => Math.floor(( 153 * (
    viewof monthInput.value > 2
    ? viewof monthInput.value - 3
    : viewof monthInput.value + 9) + 2
  ) / 5 + x - 1
))});
decPlot = turnInput ? Plot.plot({
  title: "Decalendar",
  padding: 0,
  width: 480,
  height: 980,
  className: "leftplot",
  marginTop: -3,
  marginRight: 31,
  marginBottom: 35,
  x: {tickSize: 0,
      label: "Day of dek    ",
      domain: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      ticks: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      tickPadding: -9,
      labelOffset: 24,
  },
  y: {interval: 1, ticks: 18, label: "Dek", type: "band", tickSize: 0, tickPadding: -2, labelOffset: 40, labelArrow: false},
  //fx: {tickFormat: ""},
  style: { fontSize: "21px" },
  color: {
    range: d3.schemePastel1.concat(d3.schemePastel2.slice(4, 7)).concat(d3.schemeSet1[0]),
    domain: months.concat("selected"),
    className: "cal",
  },
  marks: [
    Plot.cell(dates, {
      y: (d, i) => Math.floor(i / 10),
      x: (d, i) => i % 10,
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "selected" : months[d.getUTCMonth()],
      stroke: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "darkorange" : "none",
      strokeWidth: 3,
      inset: 0.5,
    }),
    Plot.text(dates, {
      y: (d, i) => Math.floor(i / 10),
      text: d => d.getUTCDate() === 11 ? months[d.getUTCMonth()].slice(0, 3) : "",
      frameAnchor: "right",
      dx: 32,
      monospace: true,
      fontSize: "18px"}),
    Plot.text(dates, {
      y: (d, i) => Math.floor(i / 10),
      x: (d, i) => i % 10,
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "white" : "black",
      //stroke: "white",
      text: (d, i) => String(i),//.padStart(3, "0").slice(1),
      monospace: true,
      fontSize: "16px"})
    ]
  }) : Plot.plot({
  title: "Decalendar",
  padding: 0,
  width: 1280,
  height: 280,
  className: "topplot",
  marginTop: -3,
  marginLeft: 31,
  marginBottom: 35,
  y: {tickSize: 0,
      label: "Day of dek    ",
      domain: [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      ticks: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      tickPadding: -4,
      labelOffset: 28,
  },
  x: {interval: 1, ticks: 18, label: "Dek", type: "band", tickSize: 0, tickPadding: -2, labelOffset: 32, labelArrow: false},
  style: { fontSize: "21px" },
  color: {
    range: d3.schemePastel1.concat(d3.schemePastel2.slice(4, 7)).concat(d3.schemeSet1[0]),
    domain: months.concat("selected"),
    className: "cal",
  },
  marks: [
    Plot.cell(dates, {
      x: (d, i) => Math.floor(i / 10),
      y: (d, i) => i % 10,
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "selected" : months[d.getUTCMonth()],
      stroke: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "darkorange" : "none",
      strokeWidth: 3,
      inset: 0.5,
    }),
    Plot.text(dates, {
      x: (d, i) => Math.floor(i / 10),
      y: (d, i) => i % 10,
      //fx: d => d.getUTCFullYear(),
      text: d => d.getUTCDate() === 11 ? months[d.getUTCMonth()].slice(0, 3) : "",
      y: -1,
      frameAnchor: "left",
      dy: -1,
      monospace: true,
      fontSize: "18px"}),
    Plot.text(dates, {
      x: (d, i) => Math.floor(i / 10),
      y: (d, i) => i % 10,
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "white" : "black",
      //stroke: "white",
      text: (d, i) => String(i),//.padStart(3, "0").slice(1),
      monospace: true,
      fontSize: "16px"})
  ]
})
calPlot = turnInput ? Plot.plot({
  title: "Gregorian calendar",
  padding: 0,
  width: 280,
  height: 980,
  className: "rightplot",
  marginTop: 10,
  marginBottom: 30,
  marginRight: 42,
  x: {tickFormat: Plot.formatWeekday("en", "narrow"), tickSize: 0,
      domain: [-1, 0, 1, 2, 3, 4, 5, 6],
      ticks: [0, 1, 2, 3, 4, 5, 6],
      tickPadding: 2,
  },
  y: {interval: 1, ticks: 26, label: "Week", type: "band", tickSize: 0, tickPadding: -26, labelOffset: 16, labelArrow: false},
  style: { fontSize: "21px" },
  color: {
    range: d3.schemePastel1.concat(d3.schemePastel2.slice(4, 7)).concat(d3.schemeSet1[0]),
    domain: months.concat("selected"),
    className: "cal",
  },
  marks: [
    Plot.cell(datesCal, {
      y: d => d3.utcWeek.count(d3.utcYear(d), d),
      x: d => d.getUTCDay(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "selected" : months[d.getUTCMonth()],
      stroke: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "darkorange" : "none",
      strokeWidth: 3,
      inset: .5,
    }),
    Plot.text(datesCal, {
      y: d => d3.utcWeek.count(d3.utcYear(d), d),
      text: d => d.getUTCDate() === 9 ? months[d.getUTCMonth()].slice(0, 3) : "",
      frameAnchor: "right",
      dx: 32,
      monospace: true,
      fontSize: "18px"}),
    Plot.text(datesCal, {
      y: d => d3.utcWeek.count(d3.utcYear(d), d),
      x: d => d.getUTCDay(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "white" : "black",
      text: d => d.getUTCDate(), //Math.floor(unix2doty(d.getTime())).toString().padStart(3, "0"),
      monospace: true,
      fontSize: "16px"})
  ]
}) : Plot.plot({
  title: "Gregorian calendar",
  padding: 0,
  width: 1280,
  height: 200,
  className: "btmplot",
  marginTop: 0,
  marginBottom: 40,
  marginLeft: 42,
  y: {tickFormat: Plot.formatWeekday("en", "short"), tickSize: 0,
      domain: [-1, 0, 1, 2, 3, 4, 5, 6],
      ticks: [0, 1, 2, 3, 4, 5, 6],
      tickPadding: 0,
  },
  x: {interval: 1, ticks: 26, label: "Week", type: "band", tickSize: 0, tickPadding: 2, labelOffset: 36, labelArrow: false},
  //fx: {tickFormat: ""},
  style: { fontSize: "21px" },
  color: {
    range: d3.schemePastel1.concat(d3.schemePastel2.slice(4, 7)).concat(d3.schemeSet1[0]),
    domain: months.concat("selected"),
    className: "cal",
  },
  marks: [
    Plot.cell(datesCal, {
      x: d => d3.utcWeek.count(d3.utcYear(d), d),
      y: d => d.getUTCDay(),
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "selected" : months[d.getUTCMonth()],
      stroke: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "darkorange" : "none",
      strokeWidth: 3,
      inset: .5,
    }),
    Plot.text(datesCal, {
      x: d => d3.utcWeek.count(d3.utcYear(d), d),
      y: d => d.getUTCDay(),
      //fx: d => d.getUTCFullYear(),
      text: d => d.getUTCDate() === 7 ? months[d.getUTCMonth()].slice(0, 3) : "",
      y: -1,
      frameAnchor: "left",
      dy: -1,
      monospace: true,
      fontSize: "18px"}),
    Plot.text(datesCal, {
      x: d => d3.utcWeek.count(d3.utcYear(d), d),
      y: d => d.getUTCDay(),
      //fx: d => d.getUTCFullYear(),
      fill: d => Math.floor(unix2doty(d.getTime())) === dotyInput ? "white" : "black",
      //stroke: "white",
      text: d => d.getUTCDate(), //Math.floor(unix2doty(d.getTime())).toString().padStart(3, "0"),
      monospace: true,
      fontSize: "16px"})
  ]
})

First day of the Gregorian calendar year

viewof dotwInput = Inputs.radio([
  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
  ], {value: "Sunday"})

The radio🔘input beneath the plots selects the dow for Day 306, the first day of the Gregorian calendar🗓️year. Changing the Day 306 dow shifts every date in the Gregorian calendar🗓️by one to six days depending on the number of days that Week 0, the first week of the year, contributes to the year. In contrast, weeks have no effect on Decalendar.

Although weeks determine the shape of the Gregorian calendar🗓️plot, each of its cell values is a “day of month” (dom). To uniquely identify🪪a specific day in a year, a dom must be paired with the month to which it belongs. Both plots use three-letter abbreviations and the same color🎨scheme to label🏷️months, but are shifted in relation to each other by two months.

Day of year (doy)

A dek and dod can be combined into a single number called a “day of year” (doy). Every cell value in the Decalendar plot is a doy. The doy chosen by the range🎚️inputs to be highlighted with a red🟥background in the plots is . You can use the range🎚️inputs to convert a month and a dom into a doy. Try converting a special date such as your birthday🎂 or anniversary💍!

There are two range🎚️inputs labeled🏷️as “day of year” because every doy can be expressed as both a positive and a negative number. The typical range for doys is 0 to n-1, but negative doys typically range from -n to -1, where n is the number of days in the year, either 365 or 366. A doy outside these bounds represents a day in a previous or subsequent year.

The current doy can be expressed as or . The difference between any positive doy and its negative equivalent is n: - = . We obtain the current dek via the dek equation, = ⌊ ÷ 10⌋, and the current dod number via the dod equation: = mod 10. To combine a dek and dod, we multiply the dek by ten and add the dod: = × 10 + .

Unlike weeks in the Gregorian calendar🗓️, doys and deks do not need to continue in an infinite unbroken sequence. The last day of the year, Day -1, is always followed by Day 0, regardless of the last 4 or 5 days of Dek 36 that extend past the end of the year. If we want to track days seamlessly across years, we can use a continuous count of days called the “day of era” (doe).

Day of era (doe)

A doe is essentially a Julian day number (JDN) with a different epoch. We can convert a JDN to a doe by subtracting 1721119.5 days to shift the epoch from -4713+268.5 to 0000+000.0. To turn a UNIX timestamp into a doe, we divide by 86400 to convert seconds to days and then add 719468.0 to account for the fact that the UNIX epoch is 1969+306.0.

Dec uses does for calculations, such as finding the POSIX zero-based dow of a given date. This year, the dow of Christmas🎄is according to the Dec dow equation: ( + 3) mod 7 = . As opposed to the dow, we can find the dod of Christmas🎄without any calculation because its dod, 9, is simply the last digit of the integer part of its doy: 299.

Bad Pun Alert

Dek the halls with dows of holly! Fa + la × 8!

Christmas🎄is a anchored⚓️holiday because it occurs on the same doy every year. In contrast, floating🛟holidays happen on a different doy every year so that their dow can remain constant. Dec uses the dow delta equation, wΔ = (wM - wS + 7) mod 7, to determine which of the seven possible floating🛟holiday dates corresponds to the given year.

In the dow delta equation, wM is the minuend dow destination and wS is the subtrahend dow starting point. To get the doy of the first Dow 4 after Day 265, which is Thanksgiving🦃in the United States and Brazil, we plug 4 as wM and , the dow of Day 266 this year, as wS into the dow delta equation, = (4 - + 7) mod 7, and then add wΔ to 266: = + 266.

Apart from the dow and dow delta equations, the Thanksgiving🦃calculation above⬆️relies on the Dec doe equation, which is based on the days_from_civil algorithm created by Howard Hinnant and described in his manuscript entitled chrono-Compatible Low-Level Date Algorithms, to convert the cycle of era (coe), year of cycle (yoc), and doy of Day 266 into its doe:

\[\text{coe} = \Biggl \lfloor \frac{\begin{cases}\text{year}&{\text{if } \text{year} \geq 0;}\\\text{year}-399&{\text{otherwise.}}\end{cases}}{400} \Biggr \rfloor\]

\[\text{yoc} = \text{year} - \text{coe} \times 400\]

\[\text{doe} = \text{coe}\times146097 + \text{yoc}\times365 + \lfloor\frac{\text{yoc}}{4}\rfloor - \lfloor\frac{\text{yoc}}{100}\rfloor + \text{doy}\]

The Dec date equations are the inverse🔁of the Dec doe equations above⬆️, based on Howard Hinnant’s civil_from_days algorithm, and useful for obtaining Dec dates from does and doe analogs like UNIX timestamps and JDNs. Besides the coe and yoc, the Dec date equations also use the “day of cycle” (doc) of a doe to produce its corresponding year and doy:

\[\text{coe} = \Biggl \lfloor \frac{\begin{cases}\text{doe}&{\text{if } \text{doe} \geq 0;}\\\text{doe}-146096&{\text{otherwise.}}\end{cases}}{146097} \Biggr \rfloor\]

\[\text{doc} = \text{doe} - \text{coe} \times 146097\]

\[\text{yoc} = \biggl \lfloor \frac{\text{doc} - \lfloor \frac{\text{doc}}{1460} \rfloor + \lfloor \frac{\text{doc}}{36524} \rfloor - \lfloor \frac{\text{doc}}{146096} \rfloor}{365} \biggr \rfloor\]

\[\text{year} = \text{yoc} + \text{coe} \times 400\]

\[\text{doy} = \text{doc} - \text{yoc} \times 365 - \lfloor \frac{\text{yoc}}{4} \rfloor + \lfloor \frac{\text{yoc}}{100} \rfloor\]

Dates generated by the Dec date equations are guaranteed to be in the standard year+day format. Therefore, we can standardize Dec dates by performing a round-trip “date to doe to date” conversion using the Dec doe and date equations consecutively. This allows Dec to handle Dec dates with a non-integer year and a day outside the typical range of 0 ≤ day ≤ 365.

Epochal year aggregate (eya)

A doe is essentially a Dec date with a year that is always equal to 0 and a day that is unbounded. Similarly, a Dec “epochal year aggregate” (eya) is basically a Dec date with a non-integer year and a day permanently set to 0. Both does and soys allow us to represent a date as a single number and obtain the difference between two dates, either in days (dM - dS) or years (yM - yS).

Compared to does, soys are easier to turn into Dec dates. We can convert dates to soys and vice versa with the Dec eya equation: y = ⌊y⌋ + d ÷ n. In the Dec eya equation, y is the eya, ⌊y⌋ + d is the Dec date, ⌊y⌋ is the year, d is the doy, and n is the number of days in Year ⌊y⌋. The current eya equation values are = + ÷ .

Dec dates do not include n, because it is not needed to specify a date, remains constant for 366, 1095, or 2920 days, has only 2 possible values: 366 if ⌊y⌋+1 is a Gregorian calendar🗓️leap year and 365 if ⌊y⌋+1 is a Gregorian calendar🗓️common year, and can be determined by applying the Gregorian calendar🗓️leap year rule to ⌊y⌋+1, as shown in the Dec year length equation:

\[\text{n}=\begin{cases} 366&{\begin{align}\text{if } (\lfloor \text{y}\rfloor+1)\text{ mod }\ \ \ \ 4=0\\ \href{https://en.wikipedia.org/wiki/Logical_conjunction}{\land}(\lfloor \text{y}\rfloor+1)\text{ mod }100\neq0\\ \href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}(\lfloor \text{y}\rfloor+1)\text{ mod }400=0\end{align}}\\\\ 365&{\text{otherwise.}}\end{cases}\]

Apart from its role in the Dec date and doy equations, n is needed to convert between year+day and year-day Dec dates. The year-day version of the Dec eya equation is y = ⌊y⌋ + 1 + (d - n) ÷ n. In essence, d-n is the number of days until the start of Year ⌊y⌋+1. The current year-day date, -, tells us that Year will begin in days.

The distinction between d and d-n can also be explained in terms of computer programming. If we think of years as arrays, d and d-n are like array indexes that can be used to identify array elements or combine them into groups via slicing. In this analogy, n is the number of elements in the array, d is a positive index, and d-n is a negative index.

The eya equation can be rearranged into the Dec doy equation, d = ⌊y mod 1 × n⌋, where y mod 1 is the decimal part of y. The current doy equation values are = ⌊ × ⌋. In Dec, a doy by itself is a floating🛟date and a year+day date is a anchored⚓️date. Unlike anchored⚓️dates, floating🛟dates do not include a year and thus can apply to any year.

Anchored⚓️dates are unsimplified math expressions. Instead of simplifying a anchored⚓️date into an eya, we can do the opposite and expand it to display additional information, such as the number of days in between it and another date. An expanded version of the current date, +299, can tell us that days Day 299🎄of this year.

In the example above⬆️, the minuend has been expanded into the subtrahend 299 and the difference as per the Dec minuend equation: minuend = subtrahend + difference. If we were preparing for a rocket🚀launch, the minuend would be the current time, the subtrahend would be the planned launch time, and the difference would be the “T-minus” countdown.

To see its minuend, subtrahend, and difference at the same time, we could rewrite the expanded date above⬆️as a Dec span🌈: +=+299. Unlike expanded dates, Dec spans🌈represent time intervals instead of individual dates and are structured like the minuend equation as opposed to a math expression that can be simplified to an eya.

Whereas expanded dates have a set structure that does not change, Dec spans🌈can omit the subtrahend, +=, or the difference, +=+299. If the year is the same on both sides of the equals sign, it can be omitted from the minuend, =+299, or from the subtrahend along with the difference: +=299.

Dec spans🌈 can omit their entire left-hand side to indicate that the minuend is Day 0 of the given year. Similarly, an empty right-hand side means that the subtrahend is Day 0 of the subsequent year. Dec spans🌈with at least one year are called anchored⚓️spans🌈. In contrast, floating🛟spans🌈do not contain a year and thus can be reused♻️ every year.

Floating🛟dates and spans🌈are reusable♻️across all years, but the information displayed by expanded dates and spans🌈may not be. Information related to weeks is difficult to reuse♻️, because it takes 6 to 40 years for the pattern of dows in a year to repeat. At the price of reusability♻️, Dec can function without deks and use weeks instead.

Day of week (dow)

Even though Decalendar functions best with deks, Dec dates can display POSIX zero-based dows. Instead of the current Dec date, +, the navigation bar (navbar) of my site displays the current Dec dow date, +, by splitting the current doy, , into the doy of the first day of the current week (Dow 0 doy), , and the current POSIX dow: .

Instead of the doy d, Dec dow dates display d-w+w, where d-w is the Dow 0 doy and w is the dow associated with d. We evaluate the subtraction, d-w, to obtain the Dow 0 doy, but leave the addition unsimplified so we can see w. Dec dow dates supply all of the information needed to identify specific dates and coordinate schedules based on deks or weeks.

The dow equation, dow = (doe + 3) mod 7, is derived from Howard Hinnant’s weekday_from_days algorithm. The Dec epoch dow is 3 = (0 + 3) mod 7. The UNIX epoch dow is 4 = (719468 + 3) mod 7. Depending on how mod is defined, a negative doe could yield a negative dow: -1 = (-60 + 3) mod 7. To convert a negative dow into a positive dow, we add 7.

Sunday Monday Tuesday Wednesday Thursday Friday Saturday
0 1 2 3 4 5 6
-7 -6 -5 -4 -3 -2 -1

Week of year (woy)

Dec dow dates can be further expanded to include Dec week of year (woy) numbers: +7×+. The current woy, , is the sum of the Dow 0 doy, , and the first dow of the year (Day 0 dow), , divided by 7: = ( + ) ÷ 7. The current Dec floating🛟woy date, 7×+, is equal to the sum of the current doy and the Day 0 dow: 7 × + = + .

To create a Dec woy date, we need two types of Dec expansion: minuend and dividend expansion. First, we turn the minuend d into the subtrahend d-w and the difference w. Then, we use the dividend equation, dividend = divisor × quotient, to convert the dividend d-w+w0 into the divisor 7 and the quotient W, where W is the woy and w0 is the Day 0 dow.

Essentially, Dec woy dates turn d-w into 7×W+w-w0. Typically, only 7×W+w is displayed, because w0 is not necessary to identify a date and can be calculated from a given y by flooring it, turning it into a doe, and passing it into the dow equation. Dec woy dates obfuscate🫣d much more than dow dates, but may be useful for week-based accounting🧾.

Day of dek (dod)

While weeks are not evenly divisible by two, a dek can be cut✂️into two equal halves called pentadays (pents). The Mermaid flowcharts below⬇️show Schedule 3, the recommended dekly schedule of work and rest day. Schedule 3 can be short for Schedule 1+3+1, if you prefer the zero-based top flowchart, or Schedule 3+2, if you favor the one-based bottom flowchart.

%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '29px'}}}%%
flowchart TB
   A[0]-->B[1]-->C[2]-->D[3]-->E[4]
   F[5]-->G[6]-->H[7]-->I[8]-->J[9]
   subgraph workdays[work days]
   B
   C
   G
   H
   D
   I
   end
   subgraph restdays[rest days]
   A
   F
   E
   J
   workdays
   end
   style restdays color:transparent;
%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '29px'}}}%%
flowchart TB
   B[1]-->C[2]-->D[3]-->E[4]-->F[5]
   G[6]-->H[7]-->I[8]-->J[9]-->A[10]
   subgraph workdays[work days]
   B
   C
   G
   H
   D
   I
   end
   subgraph restdays[rest days]
   A
   F
   E
   J
   workdays
   end
   style restdays color:transparent;

Both flowcharts use dod numbers, but the bottom one starts from Dod 1 instead of Dod 0 and refers to Dod 0 as Dod 10. Like the dods in the flowcharts above⬆️, the doys in the tables below⬇️are arranged in both a zero-based (top) and a one-based (bottom) manner. The tables visualize the seamless transition between a common year and the subsequent year.

Rest Work Work Work Rest
360 361 362 363 364
0 1 2 3 4
Work Work Work Rest Rest
361 362 363 364 0
1 2 3 4 5

After 4 or 8 years of consecutive pents, the Schedule 3 pattern shown in the flowcharts and tables above⬆️is interrupted by 3 consecutive rest days during the transition from a leap year. This interruption is represented by 4 empty cells in the middle row of the two tables below⬇️. The middle row contains only one day: Day 365 in the top table and Day 0 in bottom one.

Rest Work Work Work Rest
360 361 362 363 364
365
0 1 2 3 4
Work Work Work Rest Rest
361 362 363 364 365
0
1 2 3 4 5

The last pentaday (pent) in common years is Pent 72. Day 365 is the only day in Pent 73. Day 0 is the first day of Pent 0, the first pent of the year. To get the current pent number, , we double the current dek number, , and then add 1 if the current dod number, , is greater than 4. To avoid off-by-one errors, pent, dek, dod, and dow numbers are always zero-based in Dec.

Other than pent numbers, a pent can also be expressed as a span🌈. Pent 72 can be represented as 360=365-5, 360=-5, or 360=365. In addition to omitting the subtrahend or the difference, we can make the subtrahend precede the minuend to indicate that we want to start from the latest day and work backwards: 365=360+5, 365=360, or 365=+5.

Spans🌈can also represent groups of non-consecutive days. All of the Schedule 3 work days in a year can be expressed as 1=4=:5. In this span🌈, we start with Days 1, 2, and 3 and then include every day that is a multiple of 5 days away from one of the starting days. The number preceded by a colon is called a step and determines which days we want to include.

Wikimedia

Schedule 3 is one of six dekly schedules that allow us to organize work and rest days into five homogeneous columns like in the tables and flowcharts above⬆️. These schedules are like the gears⚙️of a 5-speed manual transmission in a car. The approximate speed ranges for the five gears⚙️are <5, 5 to 10, 10 to 15, 15 to 20, and ≥20 kilometers per centiday.

In this analogy, Neutral (N), 1st, 2nd, 3rd, 4th, and 5th gear⚙️are Schedules 0, 1, 2, 3, 4, and 5, respectively. To complete the gearshift analogy, Reverse (R) would be a time machine that takes us to the past. As our driving speed changes, we would shift up to a higher gear⚙️or shift down to a lower gear⚙️. Similarly, we can switch between the six dekly schedules as needed.

The names of the dekly schedules are derived from their respective numbers of work days per pent. The total🧮number of work days per year provided by Schedules 0, 1, 2, 3, 4, and 5 are 0, 73, 146, 219, 292, and 365, respectively. In general, Schedule 3 should be the default and Schedule 5 should only be used temporarily during crises‼️and emergencies🚨.

In addition to switching between schedules, we can also mix them to create hybrid schedules. Schedule 34 mixes Schedules 3 and 4 to obtain an annual total🧮of 255 work days without modifying the transition between years shown in the tables above⬆️. This annual total🧮is about 1 pent less than the 260 to 262 work days that we get annually from a five-day workweek.

Unlike weekly schedules, Schedules 3 and 34 provide a consistent🎯number of work days every year. While Days 364, 365, and 0 can be work or rest days in the Gregorian calendar🗓️, these days are always rest days if we follow Schedules 3 or 34. Therefore, Schedules 3 and 34 do not require any holidays to smooth the transition between years.

There are 11 United States Federal holidays. Federal holidays that fall on a Gregorian calendar🗓️rest day, Dow 0 or Dow 6, are observed on the nearest Gregorian calendar🗓️work day: Dow 1 or Dow 5. To apply this rule to Schedule 3, we would observe the Day 110⛓️‍💥, 125🎆, 255🫡, and 299🎄holidays on Days 111⛓️‍💥, 126🎆, 256🫡, and 298🎄, respectively.

With dekly schedules, we can determine whether any date falls on a work or a rest day with just a glance. Counterintuitively, dekly schedules can be based on months instead of deks. Month-based dekly schedules distinguish between work and rest days based on the last digit of doms. The drawback of month-based schedules is that doms reset twelve times every year.

The month-based Schedules 3 and 34 have 223 and 258 work days per year, respectively, but will require at least one holiday to avoid six consecutive work days during the transition from a Dec common year. The best time to switch from a weekly to a dekly schedule may be from Day 31 to 93 when the original and month-based versions of Schedules 3 and 34 are identical.

Day of month (dom)

Dec dates can be expanded to display Dec month and POSIX dom numbers. The current Dec dom date is ++. Dec month numbers are the last doy of the previous month because POSIX doms are one-based. For zero-based doms, Dec represents each month with its first doy: ++. This way, Dec can support both zero- and one-based doms.

Dec dom dates replace the doy d from Dec dates with d-m+m. We evaluate the subtraction to get d-m, the Dec month number, but not the addition, so we can see m, the dom. If we combine the dom and dow patterns above⬆️, we can create hybrid dom+dow Dec dates: +++, where is d-m-w, the doy of the last Dow 0 before the beginning of the month.

We can obtain Dec month numbers using only a pair of hands🤲by counting index☝️and ring💍fingers as 30 days and other fingers as 31 days. For zero-based doms, we start counting from 0. For one-based doms, we start counting from -1, as shown in the image below⬇️. To spread 12 months across 10 fingers, the first and last fingers each represent 2 months.

Adobe PDF library 6.66 2010-03-06T19:45:34Z 2008-03-27T12:07:11+01:00 Illustrator 2008-03-27T16:40:58+01:00 JPEG 256 160 /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAoAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9KaVpWlnS7MmzgJMEdT6 afyD2xVFfonSv+WKD/kUn9MVd+idK/5YoP8AkUn9MVd+idK/5YoP+RSf0xV36J0r/lig/wCRSf0x V36J0r/lig/5FJ/TFXfonSv+WKD/AJFJ/TFXfonSv+WKD/kUn9MVd+idK/5YoP8AkUn9MVd+idK/ 5YoP+RSf0xV5L/zjFaWl1+Wjy3MMc8v6Uvl5yqHagl2FWB6Yq9a/ROlf8sUH/IpP6Yq79E6V/wAs UH/IpP6Yq79E6V/yxQf8ik/pirv0TpX/ACxQf8ik/pirv0TpX/LFB/yKT+mKu/ROlf8ALFB/yKT+ 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 uuid:db0c57f4-dad3-11dc-b3c0-003065732f80 image/svg+xml keyboard.ai June91May60July121August152April30March-1 Adobe PDF library 6.66 2010-03-06T19:45:34Z 2008-03-27T12:07:11+01:00 Illustrator 2008-03-27T16:40:58+01:00 JPEG 256 160 /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAoAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9KaVpWlnS7MmzgJMEdT6 afyD2xVFfonSv+WKD/kUn9MVd+idK/5YoP8AkUn9MVd+idK/5YoP+RSf0xV36J0r/lig/wCRSf0x V36J0r/lig/5FJ/TFXfonSv+WKD/AJFJ/TFXfonSv+WKD/kUn9MVd+idK/5YoP8AkUn9MVd+idK/ 5YoP+RSf0xV5L/zjFaWl1+Wjy3MMc8v6Uvl5yqHagl2FWB6Yq9a/ROlf8sUH/IpP6Yq79E6V/wAs UH/IpP6Yq79E6V/yxQf8ik/pirv0TpX/ACxQf8ik/pirv0TpX/LFB/yKT+mKu/ROlf8ALFB/yKT+ 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 uuid:db0c57f4-dad3-11dc-b3c0-003065732f80 image/svg+xml keyboard.ai September183October213November244December274January305February336

Wikimedia

The finger🖐mnemonic described above⬆️is similar to the knuckle👊and musical keyboard🎹mnemonics. These mnemonics attempt to make sense of the irregular pattern of month lengths in the Gregorian calendar🗓️. As opposed to months, we do not need mnemonics, tables, or mental calculations to use deks, because all of the required information is plainly visible in the doy.

Month of year (moy)

To convert doys to or from POSIX month and dom numbers, we can use the month of year (moy) equations from the civil_from_days and days_from_civil algorithms. Unlike POSIX month numbers, moys are zero-based and start from Moy 0 instead of Moy 10. As shown in the first moy equation below⬇️, we can obtain a moy from a doy or a POSIX month number.

\[\text{moy} = (5 \times \text{doy} + 2) \div 153 = \begin{cases}\text{month}-3&{\text{if }\text{month}\gt 2;}\\\text{month}+9&{\text{otherwise.}}\end{cases}\]

\[\text{month} = \begin{cases}\text{moy}+3&{\text{if }\text{moy}\lt 10;}\\\text{moy}-9&{\text{otherwise.}}\end{cases}\]

\[\text{dom} = \text{doy} - (153 \times \text{moy} + 2) \div 5 + 1\]

\[\text{doy} = (153 \times \text{moy}+ 2) \div 5 + \text{dom} - 1\]

A moy and its equivalent POSIX month number differ by 9 in Moy 10 or 11 and -3 in any other moy because the Dec epoch, 0000+000, is 2 months later than the Gregorian calendar🗓️epoch: -0001+306. To convert years, we add 1 to Dec years and subtract 1 from Gregorian calendar🗓️years if the doy is greater than 305, the moy is greater than 9, or the month is less than 3:

\[\text{Dec year} = \begin{cases}\text{Gregorian calendar year}-1&{\text{if }\text{doy}\gt 305\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{moy}\gt 9\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{month}\lt 3;}\\\text{Gregorian calendar year}&{\text{otherwise.}}\end{cases}\]

\[\text{Gregorian calendar year} = \begin{cases}\text{Dec year}+1&{\text{if }\text{doy}\gt 305\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{moy}\gt 9\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{month}\lt 3;}\\\text{Dec year}&{\text{otherwise.}}\end{cases}\]

Summary

This article describes Dec and how it can interoperate with the Gregorian calendar🗓️by minuend expanding Dec dates into dom and dow dates or dividend expanding dow dates into woy dates. On its own, Dec minuend expands dates into span🌈equivalents, but has no use for dividend expansion, because doys display deks and dods without any expansion.

The flowchart below⬇️visualizes the conversion of the UNIX epoch Dec date 1969+306 into a Gregorian calendar🗓️year, month, dom and dow. To obtain its associated dow, we first need to convert a Dec date into a doe. Outside of its interoperability with the Gregorian calendar🗓️, Dec converts dates into does to find the number of days in between two dates.

%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '20px'}}}%%
flowchart LR
   L~~~Y
   L-->Y
   L-->D
   L-->E
   R-->Y
   M-->R[  ]:::empty
   D-->A
   D~~~B[  ]:::empty
   A-->G
   G-->R
   Y~~~L[  ]:::empty
   Y---A[  ]:::empty
   Y~~~A
   B-->M
   B~~~N
   B-->N
   B-->D
   B~~~D
   N~~~B
   E-->W
   subgraph decdate[Decalendar]
   Y[year<br>1969]
   D[doy<br>306]
   E[doe<br>719468]
   end
   subgraph gregdate[Gregorian calendar]
   W[dow<br>4]
   G[year<br>1970]
   M[month<br>1]
   N[dom<br>1]
   end
   classDef empty width:0px;
   click E "#doe"
   click W "#dow"
   click Y "#eya"
   click D "#doy"
   click G "#eya"
   click M "#moy"
   click N "#dom"

For simplicity, the flowchart above⬆️does not show conversion byproducts, such as the coe, yoc, and doc generated during Dec doe to date conversion or the moy that we need in order to split a doy into a month and a dom or combine a month and a dom into a doy. The arrows in the flowchart represent equations adapted from chrono-Compatible Low-Level Date Algorithms.

Instead of converting Dec dates, we can expand them to view the information we need as part of the math-inspired notation of Dec. At its heart❤️, Dec is a simple system that uses only years and days for time measurement. Thanks to Dec expansion, Dec can work with other units. In this way, Dec expansion bridges the gap between the Dec and Gregorian calendars🗓️.

Next

After reading this article, you should be able to understand the examples in my filter, include, and script articles, but you may want to start with my Quarto article. To see the full extent of the benefits that Dec provides, I recommend that you continue through the Dec section of my site to the time⏳, snap🫰, and span🌈articles. Dec has a lot more to offer than just dates!

%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '32px'}}}%%
flowchart LR
   A[Dec]-->B[date]-->C[time]-->D[snap]-->E[span]
   Z[  ]:::empty~~~F[Quarto]-->G[filter]-->H[include]-->I[script]
   classDef empty width:0px;
   click A "/dec"
   click B "/dec/date"
   click C "/dec/time"
   click D "/dec/snap"
   click E "/dec/span"
   click F "/quarto"
   click G "/quarto/filter"
   click H "/quarto/include"
   click I "/quarto/script"

In addition my Dec and Quarto articles, many other articles on my site discuss Dec. Notably, my Jupyter article compares the code underlying Dec in several programming languages, my Reveal article features a presentation on Dec time measurement, and my Observable article describes how I demonstrate Dec in action with interactive and animated visualizations.

Cite

Thank you for your interest in Dec. You will find citation information for this article below⬇️. Please note that the original source of the algorithms underlying the conversion of Dec year+day dates and does is Hinnant, Howard. 2021+184. “chrono-Compatible Low-Level Date Algorithms.” +. https://howardhinnant.github.io/date_algorithms.html.

function unix2dote(unix, zone, offset = 719468) {
  return [(unix ?? Date.now()) / 86400000 + (
    zone = zone ?? -Math.round(
      (new Date).getTimezoneOffset() / 144)
    ) / 10 + offset, zone]
}
function dote2date(dote, zone = 0) {
  const cote = Math.floor((
      dote >= 0 ? dote
      : dote - 146096
    ) / 146097),
  dotc = dote - cote * 146097,
  yotc = Math.floor((dotc
    - Math.floor(dotc / 1460)
    + Math.floor(dotc / 36524)
    - Math.floor(dotc / 146096)
  ) / 365);
  return [
    yotc + cote * 400,
    dotc - (yotc * 365
      + Math.floor(yotc / 4)
      - Math.floor(yotc / 100)
  ), zone]}
function dotw2diff(x, y) {
  return (x - y + 7) % 7;
}
dz = unix2dote(now)
ydz = dote2date(...dz)
function year2leap(year = 1970) {
  return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
function dote2dotw(d = 719468) {
  return d >= -3 ? (d + 3) % 7 : (d + 4) % 7 + 6
}
function unix2doty(unix) {
  const dote = (
    unix ?? Date.now()
  ) / 86400000 + 719468,
    cote = Math.floor((
      dote >= 0 ? dote
      : dote - 146096
    ) / 146097),
  dotc = dote - cote * 146097,
  yotc = Math.floor((dotc
    - Math.floor(dotc / 1460)
    + Math.floor(dotc / 36524)
    - Math.floor(dotc / 146096)
  ) / 365);
  return dotc - (yotc * 365
      + Math.floor(yotc / 4)
      - Math.floor(yotc / 100)
  )}
function date2dote(year = 1969, doty = 306, zone = 0) {
    const cote = Math.floor((year >= 0 ? year : year - 399) / 400),
      yote = year - cote * 400;
    return [cote * 146097 + yote * 365 + Math.floor(yote / 4) - Math.floor(yote / 100) + doty, zone]
}
function addN(d) { return d + 365 + leapInput }
function subN(d) { return d - 365 - leapInput }
// https://observablehq.com/@observablehq/synchronized-inputs
// https://observablehq.com/@juang1744/transform-input/1
transformInput = function(target, {bind: source, transform = identity, involutory = false, invert = involutory ? transform : inverse(transform)} = {}){
  if (source === undefined) {
    source = target;
    target = html`<div>${source}</div>`;
  }
  function sourceInputHandler() {
    target.removeEventListener("input", targetInputHandler);
    setTransform(target).to(transform(source.value)).andDispatchEvent();
    target.addEventListener("input", targetInputHandler);
  }
  function targetInputHandler() {
    source.removeEventListener("input", sourceInputHandler);
    setTransform(source).to(invert(target.value)).andDispatchEvent();
    source.addEventListener("input", sourceInputHandler);
  }
  source.addEventListener("input", sourceInputHandler);
  target.addEventListener("input", targetInputHandler);
  invalidation.then(() => {
    source.removeEventListener("input", sourceInputHandler);
    target.removeEventListener("input", targetInputHandler);
  });
  sourceInputHandler();
  return target;
}
function doty2month(doty = 0) {
    const m = Math.floor((5 * doty + 2) / 153);
    return Math.floor(m < 10 ? m + 3 : m - 9);
}
function month2doty(month = 1) {
    return Math.floor(
        (153 * (month > 2 ? month - 3 : month + 9) + 2) / 5
)}
function doty2dotm(doty = 0) {
    const m = Math.floor((5 * doty + 2) / 153);
    return doty - Math.floor((153 * m + 2) / 5) + 1;
}
function set(input, value) {
  input.value = value;
  input.dispatchEvent(new Event("input", {bubbles: true}));
}
setTransform = (input) => ({to: (value) => (input.value = value, {andDispatchEvent: (event = new Event("input")) => input.dispatchEvent(event)})});
function inverse(f) {
  switch (f) {
    case identity:  return identity;
    case Math.sqrt: return square;
    case Math.log:  return Math.exp;
    case Math.exp:  return Math.log;
    default:        return (x => solve(f, x, x));
  }
  function solve(f, y, x = 0) {
    const dx = 1e-6;
    let steps = 100, deltax, fx, dfx;
    do {
      fx = f(x)
      dfx = (f(x + dx) - fx) || dx;
      deltax = dx * (fx - y)/dfx
      x -= deltax;
    } while (Math.abs(deltax) > dx && --steps > 0);
    return steps === 0 ? NaN : x;
  }
function square(x) {
    return x * x;
  }
}
function identity(x) {
  return x;
}
// https://observablehq.com/@mbostock/scrubber
function Scrubber(values, {
  format = value => value,
  initial = 0,
  direction = 1,
  delay = null,
  autoplay = true,
  loop = true,
  loopDelay = null,
  alternate = false,
  inputStyle = ""
} = {}) {
  values = Array.from(values);
  const form = html`<form style="font: 18px var(--monospace); font-variant-numeric: tabular-nums; display: flex; height: 33px; align-items: center;">
  <button name=b type=button style="margin-right: 0.4em; width: 5em;"></button>
  <label style="display: flex; align-items: center;">
    <input name=i type=range min=0 max=${values.length - 1} value=${initial} step=1 style=${inputStyle}>
    <output name=o style="margin-left: 0.4em;"></output>
  </label>
</form>`;
  let frame = null;
  let timer = null;
  let interval = null;
  function start() {
    form.b.textContent = "Stop";
    if (delay === null) frame = requestAnimationFrame(tick);
    else interval = setInterval(tick, delay);
  }
  function stop() {
    form.b.textContent = "Play";
    if (frame !== null) cancelAnimationFrame(frame), frame = null;
    if (timer !== null) clearTimeout(timer), timer = null;
    if (interval !== null) clearInterval(interval), interval = null;
  }
  function running() {
    return frame !== null || timer !== null || interval !== null;
  }
  function tick() {
    if (form.i.valueAsNumber === (direction > 0 ? values.length - 1 : direction < 0 ? 0 : NaN)) {
      if (!loop) return stop();
      if (alternate) direction = -direction;
      if (loopDelay !== null) {
        if (frame !== null) cancelAnimationFrame(frame), frame = null;
        if (interval !== null) clearInterval(interval), interval = null;
        timer = setTimeout(() => (step(), start()), loopDelay);
        return;
      }
    }
    if (delay === null) frame = requestAnimationFrame(tick);
    step();
  }
  function step() {
    form.i.valueAsNumber = (form.i.valueAsNumber + direction + values.length) % values.length;
    form.i.dispatchEvent(new CustomEvent("input", {bubbles: true}));
  }
  form.i.oninput = event => {
    if (event && event.isTrusted && running()) stop();
    form.value = values[form.i.valueAsNumber];
    form.o.value = format(form.value, form.i.valueAsNumber, values);
  };
  form.b.onclick = () => {
    if (running()) return stop();
    direction = alternate && form.i.valueAsNumber === values.length - 1 ? -1 : 1;
    form.i.valueAsNumber = (form.i.valueAsNumber + direction) % values.length;
    form.i.dispatchEvent(new CustomEvent("input", {bubbles: true}));
    start();
  };
  form.i.oninput();
  if (autoplay) start();
  else stop();
  Inputs.disposal(form).then(stop);
  return form;
}
decYear = ydz[0]
nextYear = decYear + 1
decDoty = Math.floor(ydz[1])
decDek = Math.floor(decDoty / 10)
decDotd = decDoty % 10
decPent = decDek * 2 + (decDotd > 4)
xmasDiff = decDoty - 299
xmasDiffSign = xmasDiff < 0 ? "-" : "+"
xmasDiffSince = xmasDiff < 0 ? "are left until" : "have passed since"
xmasDiffResult = xmasDiff < 0 ? "-" : ""
xmasDote = date2dote(ydz[0], 299)[0]
xmasDotw = dote2dotw(xmasDote)
dotw = Math.floor(dote2dotw(dz[0]))
day266dotw = dote2dotw(date2dote(ydz[0], 266)[0])
day266dotwDiff = dotw2diff(4, day266dotw)
dotm = doty2dotm(Math.floor(ydz[1]))
dotm0 = String(dotm - 1).padStart(2, "0")
monthNumber = Math.floor(ydz[1] - dotm)
monthNumber0 = String(monthNumber + 1).padStart(3, "0")
dotw0doty = Math.floor(ydz[1]) - dotw
doty0dote = date2dote(ydz[0], 0)[0]
doty0dotw = dote2dotw(doty0dote)
week = Math.floor((ydz[1] + doty0dotw) / 7)
dotw0sign = dotw0doty < 0 ? "-" : "+"
nDaysInYear = 365 + year2leap(ydz[0] + 1)
Tminus = nDaysInYear - decDoty
TminusPadded = Tminus.toString().padStart(3, "0")
TminusPaddedNeg = "-" + TminusPadded
fracYear = ydz[0] + ydz[1] / nDaysInYear
fullfracYear = (fracYear).toFixed(4)
mod1FracYear = (fracYear % 1).toFixed(4)
months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
monthNums = ["305", "336", "", "31", "61", "92", "122", "153", "184", "214", "245", "275"];
calYear = !leapInput && dotwInput == "Monday" ? 6 : !leapInput && dotwInput == "Tuesday" ? 7 : !leapInput && dotwInput == "Wednesday" ? 2 : !leapInput && dotwInput == "Thursday" ? 3 : !leapInput && dotwInput == "Friday" ? 9 : !leapInput && dotwInput == "Saturday" ? 10 : !leapInput && dotwInput == "Sunday" ? 11 : leapInput && dotwInput == "Monday" ? 12 : leapInput && dotwInput == "Tuesday" ? 24 : leapInput && dotwInput == "Wednesday" ? 8 : leapInput && dotwInput == "Thursday" ? 20 : leapInput && dotwInput == "Friday" ? 4 : leapInput && dotwInput == "Saturday" ? 16 : leapInput && dotwInput == "Sunday" ? 28 : 0;
datesCal = d3.utcDays(new Date(calYear, 0, 0), new Date(calYear, 12, 0));
leapInput = leapscrub[1]
turnInput = leapscrub[2]
dates = d3.utcDays(new Date(1999, 2, 0), new Date(2000, 1, 28 + leapInput));
numbers = Array.from({length: 366}, (_, i) => i)
set(viewof dotyInput, leapscrub[0])
Back to top

Reuse

CC BY-SA 4.0

Citation

BibTeX citation:
@online{laptev2024,
  author = {Laptev, Martin},
  title = {Dec {Date}},
  date = {2024},
  urldate = {2024},
  url = {https://maptv.github.io/dec/date},
  langid = {en}
}
For attribution, please cite this work as:
Laptev, Martin. 2024. “Dec Date.” 2024. https://maptv.github.io/dec/date.
Dec
Time
Source Code
---
title: Dec Date
author:
  - name: Martin Laptev
    url: https://maptv.github.io
image: /asset/cal16.svg
description: >
  Introducing the Dec calendar (Decalendar), which displays dates in years and days using math notation without the need for months or weeks.
citation:
  url: https://maptv.github.io/dec/date
aliases:
  - /date
  - /dd
license: CC BY-SA
lightbox: false
toc: true
toc-depth: 4
bread-crumbs: false
format:
  html:
    grid:
      body-width: 900px
    shift-heading-level-by: 3
    include-after-body:
      - ../../asset/cite.html
      - ../../asset/style.html
      - ../../asset/stamp.html
      - ../../asset/tooltip.html
  commonmark: default
filters:
  - ../../asset/date.lua
---

:::{#datenav}
{{< include /asset/_decnav.qmd >}}
:::

My website serves as a demonstration of both the [Quarto](https://quarto.org) publishing📤system and the [Dec](/dec) measurement📐system. I use several clever hacks to get Quarto to display all of the dates on my website in the Dec [year]{.yellow}+[day]{.cyan} format. Knowing the basics of the Dec calendar🗓️(Decalendar) will help you to understand the [filter](https://quarto.org/docs/extensions/filters.html), [include](https://quarto.org/docs/output-formats/html-basics.html#includes), and [script](https://quarto.org/docs/projects/scripts.html) articles in the [Quarto section](/quarto) of my site.

Among its many features, Quarto offers support for the [Observable](https://observablehq.com/) data visualization system. Observable is my top choice for interactive graphics. We can interact with the two Observable [calendar🗓️plots](https://observablehq.com/@observablehq/plot-calendar)
below⬇️using the adjacent Observable [inputs](https://observablehq.com/documentation/inputs/overview). The [scrubber](https://observablehq.com/@mbostock/scrubber)🧽input is a great place to start because it cycles🔄through every value of the [range](https://observablehq.com/@observablehq/input-range)🎚️inputs beneath it.

To activate the scrubber🧽input, press the Play▶️button above⬆️the range🎚️inputs. Upon activation, the red🟥box in each plot will move between
the first and the last day of the Dec [year]{.yellow}. While it always begins with [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"}, the Dec [year]{.yellow} ends with either [Day 364]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 28"} or [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"}. To add or remove [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"}, use the [toggle](https://observablehq.com/@observablehq/input-toggle)✅input labelled🏷️"Leap year" to the right of the Play▶️button.

The "Leap year" toggle✅input shifts 306 dates, [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} to [Day 305]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="December 31"}, in the Gregorian calendar🗓️by one day, but does not change the order of any Dec dates, because [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"} is the last day of Dec leap [years]{.yellow} and is always followed by [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} of the subsequent Dec [year]{.yellow}. The "Vertical layout" toggle✅input rotates the plots by a quarter turn, interchanging the x- and y-axes.

The axis labels🏷️of the plots imply that a [dek]{.cyan} and a "[day of dek]{.cyan}" ([dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"}) are analogous to a [week]{.darkgreen} and a "[day of week]{.lightgreen}" ([dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}). Indeed, [deks]{.cyan} are groups of ten days that serve as the Dec analog of both [weeks]{.darkgreen} and [months]{.azul}. With the exception of [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"} in leap [years]{.yellow}, every [year]{.yellow} has the same [deks]{.cyan} and [months]{.azul}, but not the same [weeks]{.darkgreen}, because the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} of the first day of the [year]{.yellow} varies.

:::{#calplots}
{{< include /dec/date/_calplots.qmd >}}
:::

The [radio](https://observablehq.com/@observablehq/input-radio)🔘input beneath the plots selects the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} for [Day 306]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="January 1"}, the first day of the Gregorian calendar🗓️[year]{.yellow}. Changing the [Day 306]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="January 1"} [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} shifts every date in the Gregorian calendar🗓️by one to six days depending on the number of days that [Week 0]{.darkgreen}, the first [week]{.darkgreen} of the [year]{.yellow}, contributes to the [year]{.yellow}. In contrast, [weeks]{.darkgreen} have no effect on Decalendar.

Although [weeks]{.darkgreen} determine the shape of the Gregorian calendar🗓️plot, each of its [cell](https://observablehq.com/plot/marks/cell) values is a "[day of month]{.lightblue}" ([dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"}). To uniquely identify🪪a specific day in a [year]{.yellow}, a [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} must be paired with the [month]{.azul} to which it belongs. Both plots use three-letter abbreviations and the same [color🎨scheme](https://observablehq.com/@d3/color-schemes) to label🏷️[months]{.azul}, but are shifted in relation to each other by two [months]{.azul}.

# Day of year (doy){id="doy"}

A [dek]{.cyan} and [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} can be combined into a single number called a "[day of year]{.cyan}" ([doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}). Every cell value in the Decalendar plot is a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}. The [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} chosen by the range🎚️inputs to be highlighted with a red🟥background in the plots is [\${dotyInput}]{.cyan}. You can use the range🎚️inputs to convert a [month]{.azul} and a [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} into a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}. Try converting a special date such as your birthday🎂 or anniversary💍!

There are two range🎚️inputs labeled🏷️as "day of year" because every [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} can be expressed as both a positive and a negative number. The typical range for [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of year"} is 0 to [n]{.orange}[-]{.mono}1, but negative [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of year"} typically range from -[n]{.orange} to -1, where [n]{.orange} is the number of days in the [year]{.yellow}, either [365]{.orange} or [366]{.orange}. A [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} outside these [bounds](https://en.wikipedia.org/wiki/Upper_and_lower_bounds#:~:text=an%20upper%20bound%20or%20majorant%5B1%5D%20of%20a%20subset%20S%20of%20some%20preordered%20set%20(K%2C%20%E2%89%A4)%20is%20an%20element%20of%20K%20that%20is%20greater%20than%20or%20equal%20to%20every%20element%20of%20S.%5B2%5D%5B3%5D%20Dually%2C%20a%20lower%20bound%20or%20minorant%20of%20S%20is%20defined%20to%20be%20an%20element%20of%20K%20that%20is%20less%20than%20or%20equal%20to%20every%20element%20of%20S) represents a day in a previous or subsequent [year]{.yellow}.

The current [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} can be expressed as [\${decDoty}]{.cyan} or [\${TminusPaddedNeg}]{.pink}. The difference between any positive [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} and its negative equivalent is [n]{.orange}: [\${decDoty}]{.cyan} [-]{.mono} [\${TminusPaddedNeg}]{.pink} = [\${nDaysInYear}]{.orange}. We obtain the current [dek]{.cyan} via the [dek]{.cyan} equation, [\${decDek}]{.cyan} = &LeftFloor;[\${decDoty}]{.cyan} &div; 10&RightFloor;, and the current [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} number via the [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} equation: [\${decDotd}]{.cyan} = [\${decDoty}]{.cyan} [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 10. To combine a [dek]{.cyan} and [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"}, we multiply the [dek]{.cyan} by ten and add the [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"}: [\${decDoty}]{.cyan} = [\${decDek}]{.cyan} &times; 10 + [\${decDotd}]{.cyan}.

Unlike [weeks]{.darkgreen} in the Gregorian calendar🗓️, [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of year"} and [deks]{.cyan} do not need to continue in an infinite unbroken sequence. The last day of the [year]{.yellow}, Day -1, is always followed by [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"}, regardless of the last 4 or 5 days of [Dek]{.cyan} 36 that extend past the end of the [year]{.yellow}. If we want to track days seamlessly across [years]{.yellow}, we can use a continuous count of days called the "[day of [era](https://en.wikipedia.org/wiki/Calendar_era#:~:text=the%20period%20of%20time%20elapsed%20since%20one%20epoch%20of%20a%20calendar){.darklink}]{.cyan}" ([doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"}).

# Day of era (doe){id="doe"}

A [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} is essentially a [Julian day number](https://en.wikipedia.org/wiki/Julian_day#:~:text=a%20continuous%20count%20of%20days%20from%20the%20beginning%20of%20the%20Julian%20period) ([JDN]{.under .tool data-bs-toggle="tooltip" data-bs-title="Julian day number"}) with a different [epoch](https://en.wikipedia.org/wiki/Epoch#:~:text=an%20instant%20in%20time%20chosen%20as%20the%20origin%20of%20a%20particular%20calendar%20era). We can convert a [JDN]{.under .tool data-bs-toggle="tooltip" data-bs-title="Julian day number"} to a [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} by subtracting [1721119.5]{.cyan} days to shift the epoch from [-4713]{.under .yellow data-bs-toggle="tooltip" data-bs-title="4714 BC"}+[268]{.under .cyan data-bs-toggle="tooltip" data-bs-title="November 24"}.[5]{.under .cyan data-bs-toggle="tooltip" data-bs-title="noon"} to [0000]{.under .yellow data-bs-toggle="tooltip" data-bs-title="1 BC"}+[000]{.under .cyan data-bs-toggle="tooltip" data-bs-title="March 1"}.[0]{.under .cyan data-bs-toggle="tooltip" data-bs-title="midnight"}. To turn a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time#:~:text=the%20number%20of%20non%2Dleap%20seconds%20that%20have%20elapsed%20since%2000%3A00%3A00%20UTC%20on%201%C2%A0January%201970) into a [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"}, we divide by [86400](https://en.wikipedia.org/wiki/Day#:~:text=average%2C%20this%20is-,24%20hours%20(86%2C400%20seconds),-.%20As%20a%20day) to convert [seconds]{.purple} to days and then add [719468.0]{.cyan} to account for the fact that the [UNIX epoch](https://en.wikipedia.org/wiki/Unix_time#:~:text=00%3A00%3A00%20UTC%20on%201%C2%A0January%201970) is [1969]{.under .yellow data-bs-toggle="tooltip" data-bs-title="1970"}+[306]{.under .cyan data-bs-toggle="tooltip" data-bs-title="January 1"}.[0]{.under .cyan data-bs-toggle="tooltip" data-bs-title="midnight"}.

Dec uses [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"} for calculations, such as finding the [POSIX](https://en.wikipedia.org/wiki/POSIX#:~:text=a%20family%20of%20standards%20specified%20by%20the%20IEEE%20Computer%20Society%20for%20maintaining%20compatibility%20between%20operating%20systems) [zero-based [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}](https://pubs.opengroup.org/onlinepubs/007904875/utilities/date.html#:~:text=weekday%20as%20a%20decimal%20number%20%5B0%2C6%5D%20(0%3Dsunday)) of a given date. This [year]{.yellow}, the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} of [Christmas](https://en.wikipedia.org/wiki/Christmas#:~:text=annual%20festival%20commemorating%20the%20birth%20of%20Jesus%20Christ)🎄is [\${xmasDotw}]{.lightgreen} according to the Dec [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} equation: ([\${xmasDote}]{.cyan} + 3) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7 = [\${xmasDotw}]{.lightgreen}. As opposed to the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}, we can find the [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} of Christmas🎄without any calculation because its [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"}, [9]{.cyan}, is simply the last digit of the [integer part](https://en.wikipedia.org/wiki/Decimal#:~:text=the%20integer%20written%20to%20the%20left%20of%20the%20decimal) of its [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}: [299]{.cyan}.

::: {.callout-warning}
# Bad Pun Alert
[Dek the halls](https://en.wikipedia.org/wiki/Deck_the_Halls#:~:text=a%20traditional%20Christmas%20carol.) with [dows]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="days of week"} of holly! Fa + la &times; 8!
:::

Christmas🎄is a anchored⚓️holiday because it occurs on the same [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} every [year]{.yellow}. In contrast, floating🛟holidays happen on a different [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} every [year]{.yellow} so that their [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} can remain constant. Dec uses the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} [delta](https://en.wikipedia.org/wiki/Delta_(letter)#:~:text=the%20difference%20operator) equation, [w~Δ~]{.lightgreen} = ([w~M~]{.lightgreen} [-]{.mono} [w~S~]{.lightgreen} + 7) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7, to determine which of the seven possible floating🛟holiday dates corresponds to the given [year]{.yellow}.

In the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} [delta](https://en.wikipedia.org/wiki/Delta_(letter)#:~:text=the%20difference%20operator) equation, [w~M~]{.lightgreen} is the [minuend](https://en.wiktionary.org/wiki/minuend#:~:text=A%20number%20or%20quantity%20from%20which%20another%20is%20to%20be%20subtracted) [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} destination and [w~S~]{.lightgreen} is the [subtrahend](https://en.wikipedia.org/wiki/Subtraction#:~:text=number%20being%20subtracted) [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} starting point. To get the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} of the first [Dow 4]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Thursday"} after [Day 265]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="November 21"}, which is [Thanksgiving](https://en.wikipedia.org/wiki/Thanksgiving#:~:text=Thanksgiving%20is-,a%20national%20holiday,-celebrated%20on%20various)🦃in the United States and Brazil, we plug [4]{.lightgreen} as [w~M~]{.lightgreen} and [\${day266dotw}]{.lightgreen}, the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} of [Day 266]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="November 22"} this [year]{.yellow}, as [w~S~]{.lightgreen} into the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} [delta](https://en.wikipedia.org/wiki/Delta_(letter)#:~:text=the%20difference%20operator) equation, [\${day266dotwDiff}]{.lightgreen} = ([4]{.lightgreen} [-]{.mono} [\${day266dotw}]{.lightgreen} + 7) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7, and then add [w~Δ~]{.lightgreen} to [266]{.cyan}: [\${day266dotwDiff + 266}]{.cyan} = [\${day266dotwDiff}]{.lightgreen} + [266]{.cyan}.

Apart from the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} and [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} [delta](https://en.wikipedia.org/wiki/Delta_(letter)#:~:text=the%20difference%20operator) equations, the Thanksgiving🦃calculation above⬆️relies on the Dec [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} equation, which is based on the [`days_from_civil`](https://howardhinnant.github.io/date_algorithms.html#days_from_civil){.mono .under} algorithm created by [Howard Hinnant](https://howardhinnant.github.io) and described in his manuscript entitled [[`chrono`]{.mono .under}-Compatible Low-Level Date Algorithms](https://howardhinnant.github.io/date_algorithms.html), to convert the [cycle](https://en.wikipedia.org/wiki/Solar_cycle_(calendar)#:~:text=the%20Gregorian%20cycle%20of%20400%20years%20has%20exactly%20146%2C097%20days%2C%20i.e.%20exactly%2020%2C871%20weeks%2C%20one%20can%20say%20that%20the%20Gregorian%20so%2Dcalled%20solar%20cycle%20lasts%20400%20years) of era ([coe]{.under .tool data-bs-toggle="tooltip" data-bs-title="cycle of era"}), [year of cycle]{.yellow} ([yoc]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year of cycle"}), and [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} of [Day 266]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="November 22"} into its [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"}:

$$\text{coe} = \Biggl \lfloor \frac{\begin{cases}\text{year}&{\text{if } \text{year} \geq 0;}\\\text{year}-399&{\text{otherwise.}}\end{cases}}{400} \Biggr \rfloor$$

$$\text{yoc} = \text{year} - \text{coe} \times 400$$

:::{.overflowequation style="overflow-x:auto;overflow-y:hidden;"}
$$\text{doe} = \text{coe}\times146097 + \text{yoc}\times365 + \lfloor\frac{\text{yoc}}{4}\rfloor - \lfloor\frac{\text{yoc}}{100}\rfloor + \text{doy}$$
:::

The Dec date equations are the [inverse](https://en.wikipedia.org/wiki/Inverse#:~:text=Inverse%20function%2C-,a%20function%20that%20%22reverses%22%20another%20function,-Generalized%20inverse%2C%20a)🔁of the Dec [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} equations above⬆️, based on Howard Hinnant's [`civil_from_days`](https://howardhinnant.github.io/date_algorithms.html#civil_from_days){.mono} algorithm, and useful for obtaining Dec dates from [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"} and [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} analogs like [UNIX timestamps](https://en.wikipedia.org/wiki/Unix_time#:~:text=the%20number%20of%20seconds%20that%20have%20elapsed%20since%2000%3A00%3A00%20UTC%20on%201%C2%A0January%201970) and [JDNs]{.under .tool data-bs-toggle="tooltip" data-bs-title="Julian day numbers"}. Besides the [coe]{.under .tool data-bs-toggle="tooltip" data-bs-title="cycle of era"} and [yoc]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year of cycle"}, the Dec date equations also use the "[day of cycle]{.cyan}" ([doc]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of cycle"}) of a [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} to produce its corresponding [year]{.yellow} and [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}:

$$\text{coe} = \Biggl \lfloor \frac{\begin{cases}\text{doe}&{\text{if } \text{doe} \geq 0;}\\\text{doe}-146096&{\text{otherwise.}}\end{cases}}{146097} \Biggr \rfloor$$

$$\text{doc} = \text{doe} - \text{coe} \times 146097$$

$$\text{yoc} = \biggl \lfloor \frac{\text{doc} - \lfloor \frac{\text{doc}}{1460} \rfloor + \lfloor \frac{\text{doc}}{36524} \rfloor - \lfloor \frac{\text{doc}}{146096} \rfloor}{365} \biggr \rfloor$$

$$\text{year} = \text{yoc} + \text{coe} \times 400$$

$$\text{doy} = \text{doc} - \text{yoc} \times 365 - \lfloor \frac{\text{yoc}}{4} \rfloor + \lfloor \frac{\text{yoc}}{100} \rfloor$$

Dates generated by the Dec date equations are guaranteed to be in the standard [year]{.yellow}+[day]{.cyan} format. Therefore, we can standardize Dec dates by performing a [round-trip](https://en.wikipedia.org/wiki/Round-trip_format_conversion#:~:text=converting%20from%20any%20data%20representation%20and%20back%20again) "date to [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} to date" conversion using the Dec [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} and date equations consecutively. This allows Dec to handle Dec dates with a non-integer [year]{.yellow} and a [day]{.cyan} outside the typical range of [0]{.cyan} &le; [day]{.cyan} &le; [365]{.cyan}.

# Epochal year aggregate (eya){#eya}

A [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} is essentially a Dec date with a [year]{.yellow} that is always equal to [0]{.yellow} and a [day]{.cyan} that is [unbounded](https://en.wikipedia.org/wiki/Bounded_set#:~:text=a%20set%20which%20is%20not%20bounded). Similarly, a Dec "[epochal year aggregate]{.yellow}" ([eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"}) is basically a Dec date with a non-integer [year]{.yellow} and a [day]{.cyan} permanently set to [0]{.cyan}. Both [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"} and [soys]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="sums of years"} allow us to represent a date as a single number and obtain the difference between two dates, either in [days]{.cyan} ([d~M~]{.cyan} [-]{.mono} [d~S~]{.cyan}) or [years]{.yellow} ([y~M~]{.yellow} [-]{.mono} [y~S~]{.yellow}).

Compared to [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"}, [soys]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="sums of years"} are easier to turn into Dec dates. We can convert dates to [soys]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="sums of years"} and vice versa with the Dec [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"} equation: [y]{.yellow} = &LeftFloor;[y]{.yellow}&RightFloor; + [d]{.cyan} &div; [n]{.orange}. In the Dec [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"} equation, [y]{.yellow} is the [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"}, &LeftFloor;[y]{.yellow}&RightFloor; + [d]{.cyan} is the Dec date, &LeftFloor;[y]{.yellow}&RightFloor; is the [year]{.yellow}, [d]{.cyan} is the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}, and [n]{.orange} is the number of days in [Year]{.yellow} &LeftFloor;[y]{.yellow}&RightFloor;. The current [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"} equation values are [\${fullfracYear}]{.yellow} = [\${decYear}]{.yellow} + [\${decDoty}]{.cyan} &div; [\${nDaysInYear}]{.orange}.

Dec dates do not include [n]{.orange}, because it is not needed to specify a date, remains constant for 366, 1095, or 2920 days, has only 2 possible values: 366 if &LeftFloor;[y]{.yellow}&RightFloor;+1 is a Gregorian calendar🗓️leap [year]{.yellow} and 365 if &LeftFloor;[y]{.yellow}&RightFloor;+1 is a Gregorian calendar🗓️common [year]{.yellow}, and can be determined by applying the Gregorian calendar🗓️[leap [year]{.yellow} rule](https://en.wikipedia.org/wiki/Leap_year#:~:text=Every%20year%20that%20is%20exactly%20divisible%20by%20four%20is%20a%20leap%20year%2C%20except%20for%20years%20that%20are%20exactly%20divisible%20by%20100%2C%20but%20these%20centurial%20years%20are%20leap%20years%20if%20they%20are%20exactly%20divisible%20by%20400) to &LeftFloor;[y]{.yellow}&RightFloor;+1, as shown in the Dec [year]{.yellow} length equation:

$$\text{n}=\begin{cases}
  366&{\begin{align}\text{if } (\lfloor \text{y}\rfloor+1)\text{ mod }\ \ \ \ 4=0\\
  \href{https://en.wikipedia.org/wiki/Logical_conjunction}{\land}(\lfloor \text{y}\rfloor+1)\text{ mod }100\neq0\\
  \href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}(\lfloor \text{y}\rfloor+1)\text{ mod }400=0\end{align}}\\\\
  365&{\text{otherwise.}}\end{cases}$$

Apart from its role in the Dec date and [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} equations, [n]{.orange} is needed to convert between [year]{.yellow}+[day]{.cyan} and [year]{.yellow}[-]{.mono}[day]{.pink} Dec dates. The [year]{.yellow}[-]{.mono}[day]{.pink} version of the Dec [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"} equation is [y]{.yellow} = &LeftFloor;[y]{.yellow}&RightFloor; + 1 + ([d]{.cyan} [-]{.mono} [n]{.orange}) &div; [n]{.orange}. In essence, [d]{.cyan}[-]{.mono}[n]{.orange} is the number of days until the start of [Year]{.yellow} &LeftFloor;[y]{.yellow}&RightFloor;+1. The current [year]{.yellow}[-]{.mono}[day]{.pink} date, [\${nextYear}]{.yellow}[-]{.mono}[\${TminusPadded}]{.pink}, tells us that [Year]{.yellow} [\${nextYear}]{.yellow} will begin in [\${Tminus}]{.pink} days.

The distinction between [d]{.cyan} and [d]{.cyan}[-]{.mono}[n]{.orange} can also be explained in terms of computer programming. If we think of [years]{.yellow} as [arrays](https://en.wikipedia.org/wiki/Array_(data_structure)#Element_identifier_and_addressing_formulas:~:text=a%20data%20structure%20consisting%20of%20a%20collection%20of%20elements%20(values%20or%20variables)%2C%20of%20same%20memory%20size%2C%20each%20identified%20by%20at%20least%20one%20array%20index), [d]{.cyan} and [d]{.cyan}[-]{.mono}[n]{.orange} are like array [indexes](https://en.wikipedia.org/wiki/Array_(data_structure)#Element_identifier_and_addressing_formulas:~:text=individual%20objects%20are%20selected%20by%20an%20index) that can be used to identify array elements or combine them into groups via [slicing](https://en.wikipedia.org/wiki/Array_slicing#:~:text=an%20operation%20that%20extracts%20a%20subset%20of%20elements%20from%20an%20array). In this analogy, [n]{.orange} is the number of elements in the array, [d]{.cyan} is a [positive index](https://en.wikipedia.org/wiki/Zero-based_numbering#:~:text=a%20way%20of%20numbering%20in%20which%20the%20initial%20element%20of%20a%20sequence%20is%20assigned%20the%20index%C2%A00), and [d]{.cyan}[-]{.mono}[n]{.orange} is a [negative index](https://en.wikipedia.org/wiki/Array_slicing#:~:text=specify%20an%20offset%20from%20the%20end%20of%20the%20array).

The [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"} equation can be rearranged into the Dec [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} equation, [d]{.cyan} = &LeftFloor;[y]{.yellow} [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 1 &times; [n]{.orange}&RightFloor;, where [y]{.yellow} [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 1 is the [decimal part](https://en.wikipedia.org/wiki/Fractional_part#:~:text=the%20excess%20beyond%20that%20number%27s%20integer%20part) of [y]{.yellow}. The current [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} equation values are [\${decDoty}]{.cyan} = &LeftFloor;[\${mod1FracYear}]{.yellow} &times; [\${nDaysInYear}]{.orange}&RightFloor;. In Dec, a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} by itself is a floating🛟date and a [year]{.yellow}+[day]{.cyan} date is a anchored⚓️date. Unlike anchored⚓️dates, floating🛟dates do not include a [year]{.yellow} and thus can apply to any [year]{.yellow}.

Anchored⚓️dates are [unsimplified](https://en.wikipedia.org/wiki/Simplification#:~:text=the%20process%20of%20replacing%20a%20mathematical%20expression%20by%20an%20equivalent%20one%2C%20that%20is%20simpler) math expressions. Instead of simplifying a anchored⚓️date into an [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"}, we can do the opposite and expand it to display additional information, such as the number of days in between it and another date. An expanded version of the current date, [\${decYear}]{.yellow}+[299]{.cyan}[\${xmasDiffSign}]{.mono}[\${Math.abs(xmasDiff)}]{.violet}, can tell us that [\${Math.abs(xmasDiff)}]{.violet} days \${xmasDiffSince} [Day 299]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="December 25"}🎄of this [year]{.yellow}.

In the example above⬆️, the minuend [\${decDoty}]{.cyan} has been expanded into the subtrahend [299]{.cyan} and the difference [\${xmasDiff}]{.violet} as per the Dec minuend equation: minuend = subtrahend + difference. If we were preparing for a rocket🚀launch, the minuend would be the current time, the subtrahend would be the planned launch time, and the difference would be the ["T-minus" countdown](https://en.wikipedia.org/wiki/Countdown#:~:text=backward%20counting%20to%20indicate%20the%20time%20remaining%20before%20an%20event).

To see its minuend, subtrahend, and difference at the same time, we could rewrite the expanded date above⬆️as a Dec span🌈: [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}=[\${decYear}]{.yellow}+[299]{.cyan}[\${xmasDiffSign}]{.mono}[\${Math.abs(xmasDiff)}]{.violet}. Unlike expanded dates, Dec spans🌈represent time intervals instead of individual dates and are structured like the minuend equation as opposed to a math expression that can be simplified to an [eya]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="epochal year aggregate"}.

Whereas expanded dates have a set structure that does not change, Dec spans🌈can omit the subtrahend, [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}=[\${xmasDiffResult}\${Math.abs(xmasDiff)}]{.violet}, or the difference, [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}=[\${decYear}]{.yellow}+[299]{.cyan}. If the [year]{.yellow} is the same on both sides of the equals sign, it can be omitted from the minuend, [\${decDoty}]{.cyan}=[\${decYear}]{.yellow}+[299]{.cyan}[\${xmasDiffSign}]{.mono}[\${Math.abs(xmasDiff)}]{.violet}, or from the subtrahend along with the difference: [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}=[299]{.cyan}.

Dec spans🌈 can omit their entire [left](https://en.wikipedia.org/wiki/Sides_of_an_equation#:~:text=the%20expression%20on%20the%20left%20of%20the%20%22%3D%22)-hand side to indicate that the minuend is [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} of the given [year]{.yellow}. Similarly, an empty [right](https://en.wikipedia.org/wiki/Sides_of_an_equation#:~:text=The%20expression%20on%20the%20right%20side%20of%20the%20%22%3D%22%20sign)-hand side means that the subtrahend is [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} of the subsequent [year]{.yellow}. Dec spans🌈with at least one [year]{.yellow} are called anchored⚓️spans🌈. In contrast, floating🛟spans🌈do not contain a [year]{.yellow} and thus can be reused♻️ every [year]{.yellow}.

Floating🛟dates and spans🌈are reusable♻️across all [years]{.yellow}, but the information displayed by expanded dates and spans🌈may not be.
Information related to [weeks]{.darkgreen} is difficult to reuse♻️, because it takes 6 to 40 [years]{.yellow} for the pattern of [dows]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="days of week"} in a [year]{.yellow} to repeat. At the price of reusability♻️, Dec can function without [deks]{.cyan} and use [weeks]{.darkgreen} instead.

# Day of week (dow){#dow}

Even though Decalendar functions best with [deks]{.cyan}, Dec dates can display POSIX [zero-based](https://pubs.opengroup.org/onlinepubs/007904875/utilities/date.html#:~:text=Weekday%20as%20a%20decimal%20number%20%5B0%2C6%5D) [dows]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="days of week"}. Instead of the current Dec date, [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}, the [navigation bar](https://en.wikipedia.org/wiki/Navigation_bar#:~:text=a%20section%20of%20a%20graphical%20user%20interface%20intended%20to%20aid%20visitors%20in%20accessing%20information) (navbar) of my site displays the current Dec [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} date, [\${decYear}]{.yellow}[\${dotw0sign}]{.mono}[\${dotw0doty}]{.cyan}+[\${dotw}]{.lightgreen}, by splitting the current [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}, [\${decDoty}]{.cyan}, into the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} of the first day of the current week ([Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}), [\${dotw0doty}]{.cyan}, and the current POSIX [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}: [\${dotw}]{.lightgreen}.

Instead of the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} [d]{.cyan}, Dec [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates display [d]{.cyan}[-]{.mono}[w]{.lightgreen}+[w]{.lightgreen}, where [d]{.cyan}[-]{.mono}[w]{.lightgreen} is the [Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} and [w]{.lightgreen} is the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} associated with [d]{.cyan}. We evaluate the subtraction, [d]{.cyan}[-]{.mono}[w]{.lightgreen}, to obtain the [Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}, but leave the addition unsimplified so we can see [w]{.lightgreen}. Dec [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates supply all of the information needed to identify specific dates and coordinate schedules based on [deks]{.cyan} or [weeks]{.darkgreen}.

The [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} equation, [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} = ([doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} + 3) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7, is derived from Howard Hinnant's [`weekday_from_days`](https://howardhinnant.github.io/date_algorithms.html#weekday_from_days) algorithm. The Dec epoch [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} is [3]{.lightgreen} = ([0]{.cyan} + 3) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7. The UNIX epoch [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} is [4]{.lightgreen} = ([719468]{.cyan} + 3) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7. Depending on how [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) is defined, a negative [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} could yield a negative [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}: [-1]{.lightgreen} = ([-60]{.cyan} + 3) [mod](https://en.wikipedia.org/wiki/Modulo#:~:text=returns%20the%20remainder) 7. To convert a negative [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} into a positive [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}, we add 7.

:::{.overflowtable style="overflow-x:auto;overflow-y:hidden;"}
| Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday |
| ------ | ------ | ------- | --------- | -------- | ------ | -------- |
|   0    |   1    |    2    |     3     |    4     |   5    |    6     |
|  -7    |  -6    |   -5    |    -4     |   -3     |  -2    |   -1     |
:::

# Week of year (woy){#woy}

Dec [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates can be further expanded to include Dec [week of year]{.darkgreen} ([woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"}) numbers: [\${decYear}]{.yellow}+7&times;[\${week}]{.darkgreen}+[\${dotw}]{.lightgreen}. The current [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"}, [\${week}]{.darkgreen}, is the sum of the [Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}, [\${dotw0doty}]{.cyan}, and the first [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} of the [year]{.yellow} ([Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}), [\${doty0dotw}]{.lightgreen}, divided by 7: [\${week}]{.darkgreen} = ([\${dotw0doty}]{.cyan} + [\${doty0dotw}]{.lightgreen}) &div; 7. The current Dec floating🛟[woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} date, 7&times;[\${week}]{.darkgreen}+[\${dotw}]{.lightgreen}, is equal to the sum of the current [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} and the [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}: 7 &times; [\${week}]{.darkgreen} + [\${dotw}]{.lightgreen} = [\${decDoty}]{.cyan} + [\${doty0dotw}]{.lightgreen}.

To create a Dec [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} date, we need two types of Dec expansion: minuend and dividend expansion. First, we turn the minuend [d]{.cyan} into the subtrahend [d]{.cyan}[-]{.mono}[w]{.lightgreen} and the difference [w]{.lightgreen}. Then, we use the dividend equation, dividend = divisor &times; quotient, to convert the dividend [d]{.cyan}[-]{.mono}[w]{.lightgreen}+[w~0~]{.lightgreen} into the divisor 7 and the quotient [W]{.darkgreen}, where [W]{.darkgreen} is the [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} and [w~0~]{.lightgreen} is the [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}.

Essentially, Dec [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} dates turn [d]{.cyan}[-]{.mono}[w]{.lightgreen} into 7&times;[W]{.darkgreen}+[w]{.lightgreen}[-]{.mono}[w~0~]{.lightgreen}. Typically, only 7&times;[W]{.darkgreen}+[w]{.lightgreen} is displayed, because [w~0~]{.lightgreen} is not necessary to identify a date and can be calculated from a given [y]{.yellow} by flooring it, turning it into a [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"}, and passing it into the [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} equation. Dec [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} dates obfuscate🫣[d]{.cyan} much more than [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates, but may be useful for [[week]{.darkgreen}-based accounting](https://en.wikipedia.org/wiki/Accounting_period#52%E2%80%9353-week_fiscal_year:~:text=used%20by%20companies%20that%20desire%20that%20their%20fiscal%20year%20always%20end%20on%20the%20same%20day%20of%20the%20week)🧾.

# Day of dek (dod){#dod}

While [weeks]{.darkgreen} are not evenly divisible by two, a [dek]{.cyan} can be cut✂️into two equal halves called pentadays (pents). The [Mermaid](https://mermaid.js.org) flowcharts below⬇️show Schedule [3]{.green}, the recommended [dek]{.cyan}ly schedule of [work]{.green} and [rest]{.blue} day. Schedule [3]{.green} can be short for Schedule [1]{.blue}+[3]{.green}+[1]{.blue}, if you prefer the zero-based top flowchart, or Schedule [3]{.green}+[2]{.blue}, if you favor the one-based bottom flowchart.

```{mermaid}
%%| label: zerobasedpent
%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '29px'}}}%%
flowchart TB
   A[0]-->B[1]-->C[2]-->D[3]-->E[4]
   F[5]-->G[6]-->H[7]-->I[8]-->J[9]
   subgraph workdays[work days]
   B
   C
   G
   H
   D
   I
   end
   subgraph restdays[rest days]
   A
   F
   E
   J
   workdays
   end
   style restdays color:transparent;
```

```{mermaid}
%%| label: onebasedpent
%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '29px'}}}%%
flowchart TB
   B[1]-->C[2]-->D[3]-->E[4]-->F[5]
   G[6]-->H[7]-->I[8]-->J[9]-->A[10]
   subgraph workdays[work days]
   B
   C
   G
   H
   D
   I
   end
   subgraph restdays[rest days]
   A
   F
   E
   J
   workdays
   end
   style restdays color:transparent;
```

Both flowcharts use [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} numbers, but the bottom one starts from [Dod 1]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="second day of dek"} instead of [Dod 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} and refers to [Dod 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="first day of dek"} as [Dod 10]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="first day of dek"}. Like the [dods]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of dek"} in the flowcharts above⬆️, the [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of year"} in the tables below⬇️are arranged in both a zero-based (top) and a one-based (bottom) manner. The tables visualize the seamless transition between a common [year]{.yellow} and the subsequent [year]{.yellow}.

| [Rest]{.blue} | [Work]{.green} | [Work]{.green} | [Work]{.green} | [Rest]{.blue} |
| ------------- | -------------- | -------------- | -------------- | ------------- |
| [360]{.blue}  | [361]{.green}  | [362]{.green}  | [363]{.green}  | [364]{.blue} |
| [0]{.blue}    | [1]{.green}    | [2]{.green}    | [3]{.green}    | [4]{.blue}   |

| [Work]{.green} | [Work]{.green} | [Work]{.green} | [Rest]{.blue} | [Rest]{.blue} |
| -------------  | -------------- | -------------- | ------------- | ------------- |
| [361]{.green}  | [362]{.green}  | [363]{.green}  | [364]{.blue} | [0]{.blue}    |
| [1]{.green}    | [2]{.green}    | [3]{.green}    | [4]{.blue}   | [5]{.blue}    |

After 4 or 8 [years]{.yellow} of consecutive pents, the Schedule [3]{.green} pattern shown in the flowcharts and tables above⬆️is interrupted by [3]{.blue} consecutive [rest]{.blue} days during the transition from a leap [year]{.yellow}. This interruption is represented by 4 empty cells in the middle row of the two tables below⬇️. The middle row contains only one day: [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"} in the top table and [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} in bottom one.

| [Rest]{.blue} | [Work]{.green} | [Work]{.green} | [Work]{.green} | [Rest]{.blue} |
| ------------- | -------------- | -------------- | -------------- | ------------- |
| [360]{.blue}  | [361]{.green}  | [362]{.green}  | [363]{.green}  | [364]{.blue}  |
|               |                |                |                | [365]{.blue}  |
| [0]{.blue}    | [1]{.green}    | [2]{.green}    | [3]{.green}    | [4]{.blue}    |

| [Work]{.green} | [Work]{.green} | [Work]{.green} | [Rest]{.blue} | [Rest]{.blue} |
| -------------  | -------------- | -------------- | ------------- | ------------- |
| [361]{.green}  | [362]{.green}  | [363]{.green}  | [364]{.blue}  | [365]{.blue}  |
|                |                |                |               | [0]{.blue}    |
| [1]{.green}    | [2]{.green}    | [3]{.green}    | [4]{.blue}    | [5]{.blue}    |

The last pentaday (pent) in common [years]{.yellow} is Pent 72. [Day 365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"} is the only day in Pent 73. [Day 0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} is the first day of Pent 0, the first pent of the [year]{.yellow}. To get the current pent number, ${decPent}, we double the current [dek]{.cyan} number, [\${decDek}]{.cyan}, and then add 1 if the current [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"} number, [\${decDotd}]{.cyan}, is greater than 4. To avoid [off-by-one errors](https://en.wikipedia.org/wiki/Off-by-one_error#:~:text=a%20logic%20error%20that%20involves%20a%20number%20that%20differs%20from%20its%20intended%20value%20by%201), pent, [dek]{.cyan}, [dod]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of dek"}, and [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} numbers are always zero-based in Dec.

Other than pent numbers, a pent can also be expressed as a span🌈. Pent 72 can be represented as [360]{.cyan}=[365]{.cyan}[-]{.mono}[5]{.violet}, [360]{.cyan}=[-5]{.violet}, or [360]{.cyan}=[365]{.cyan}. In addition to omitting the subtrahend or the difference, we can make the subtrahend precede the minuend to indicate that we want to start from the latest day and work backwards: [365]{.cyan}=[360]{.cyan}+[5]{.violet}, [365]{.cyan}=[360]{.cyan}, or [365]{.cyan}=+[5]{.violet}.

Spans🌈can also represent groups of non-consecutive days. All of the Schedule [3]{.green} [work]{.green} days in a [year]{.yellow} can be expressed as [1]{.cyan}=[4]{.cyan}=:[5]{.sienna}. In this span🌈, we start with Days [1]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 2"}, [2]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 3"}, and [3]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 4"} and then include every day that is a multiple of 5 days away from one of the starting days. The number preceded by a colon is called a step and determines which days we want to include.

:::{.column-margin fig-align="center" style="text-align:center;"}
![[Wikimedia](https://commons.wikimedia.org/wiki/File:Manual_Layout.svg)](../../asset/Manual_Layout.svg)
:::
Schedule [3]{.green} is one of six [dek]{.cyan}ly schedules that allow us to organize [work]{.green} and [rest]{.blue} days into five homogeneous columns like in the tables and flowcharts above⬆️. These schedules are like the gears⚙️of a [5-speed](https://en.m.wikipedia.org/wiki/Manual_transmission#:~:text=Common%20shift%20pattern%20for%20a%205%2Dspeed%20transmission) [manual transmission](https://en.m.wikipedia.org/wiki/Manual_transmission#:~:text=a%20multi%2Dspeed%20motor%20vehicle%20transmission%20system%20where%20gear%20changes%20require%20the%20driver%20to%20manually%20select%20the%20gears%20by%20operating%20a%20gear%20stick%20and%20clutch) in a car. The approximate speed ranges for the five gears⚙️are <5, 5 to 10, 10 to 15, 15 to 20, and &ge;20 [kilometers]{.underline .tool data-bs-toggle="tooltip" data-bs-title="thousands of meters"} per [centiday]{.underline .tool data-bs-toggle="tooltip" data-bs-title="a hundredth of a day"}.

In this analogy, [Neutral](https://en.m.wikipedia.org/wiki/Neutral#:~:text=the%20state%20where%20no%20gears%20are%20selected%20for%20a%20motor%20vehicle's%20transmission) (N), 1st, 2nd, 3rd, 4th, and 5th gear⚙️are Schedules [0]{.green}, [1]{.green}, [2]{.green}, [3]{.green}, [4]{.green}, and [5]{.green}, respectively. To complete the [gearshift](https://en.m.wikipedia.org/wiki/Gear_stick#:~:text=a%20metal%20lever%20attached%20to%20the%20transmission%20of%20an%20automobile) analogy, Reverse (R) would be a time machine that takes us to the past. As our driving speed changes, we would shift up to a higher gear⚙️or shift down to a lower gear⚙️. Similarly, we can switch between the six [dek]{.cyan}ly schedules as needed.

The names of the [dek]{.cyan}ly schedules are derived from their respective numbers of [work]{.green} days per pent. The total🧮number of [work]{.green} days per [year]{.yellow} provided by Schedules [0]{.green}, [1]{.green}, [2]{.green}, [3]{.green}, [4]{.green}, and [5]{.green} are 0, 73, 146, 219, 292, and 365, respectively. In general, Schedule [3]{.green} should be the default and Schedule [5]{.green} should only be used temporarily during crises‼️and emergencies🚨.

In addition to switching between schedules, we can also mix them to create hybrid schedules. Schedule [34]{.green} mixes Schedules [3]{.green} and [4]{.green} to obtain an annual total🧮of 255 [work]{.green} days without modifying the transition between [years]{.yellow} shown in the tables above⬆️. This annual total🧮is about 1 pent less than the 260 to 262 [work]{.green} days that we get annually from a five-day [work]{.green}[week]{.darkgreen}.

Unlike [week]{.darkgreen}ly schedules, Schedules [3]{.green} and [34]{.green} provide a consistent🎯number of [work]{.green} days every [year]{.yellow}. While Days [364]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 28"}, [365]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="February 29"}, and [0]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="March 1"} can be [work]{.green} or [rest]{.blue} days in the Gregorian calendar🗓️, these days are always [rest]{.blue} days if we follow Schedules [3]{.green} or [34]{.green}. Therefore, Schedules [3]{.green} and [34]{.green} do not require any holidays to smooth the transition between [years]{.yellow}.

There are 11 United States [Federal holidays](https://www.opm.gov/policy-data-oversight/pay-leave/federal-holidays/). Federal holidays that fall on a Gregorian calendar🗓️[rest]{.blue} day, [Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} or [Dow 6]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Saturday"}, are observed on the nearest Gregorian calendar🗓️[work]{.green} day: [Dow 1]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Monday"} or [Dow 5]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Friday"}. To apply this rule to Schedule [3]{.green}, we would observe the Day [110]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="June 19"}⛓️‍💥, [125]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="July 4"}🎆, [255]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="November 11"}🫡, and [299]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="December 25"}🎄holidays on Days [111]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="June 20"}⛓️‍💥, [126]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="July 5"}🎆, [256]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="November 12"}🫡, and [298]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="December 26"}🎄, respectively.

With [dek]{.cyan}ly schedules, we can determine whether any date falls on a [work]{.green} or a [rest]{.blue} day with just a glance. Counterintuitively, [dek]{.cyan}ly schedules can be based on [months]{.azul} instead of [deks]{.cyan}. [Month]{.azul}-based [dek]{.cyan}ly schedules distinguish between [work]{.green} and [rest]{.blue} days based on the last digit of [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"}. The drawback of [month]{.azul}-based schedules is that [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"} reset twelve times every [year]{.yellow}.

The [month]{.azul}-based Schedules [3]{.green} and [34]{.green} have 223 and 258 [work]{.green} days per [year]{.yellow}, respectively, but will require at least one holiday to avoid six consecutive [work]{.green} days during the transition from a Dec common [year]{.yellow}. The best time to switch from a [week]{.darkgreen}ly to a [dek]{.cyan}ly schedule may be from [Day 31]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="April 1"} to [93]{.under .tool data-bs-toggle="tooltip" data-bs-title="June 2"} when the original and [month]{.azul}-based versions of Schedules [3]{.green} and [34]{.green} are identical.

# Day of month (dom){#dom}

Dec dates can be expanded to display Dec [month]{.azul} and [POSIX [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"}](https://pubs.opengroup.org/onlinepubs/007904875/utilities/date.html#:~:text=day%20of%20the%20month%20as%20a%20decimal%20number%20%5B01%2C31%5D) numbers. The current Dec [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} date is [\${decYear}]{.yellow}+[\${monthNumber}]{.cyan}+[\${dotm}]{.lightblue}. Dec [month]{.azul} numbers are the last [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} of the previous [month]{.azul} because POSIX [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"} are one-based. For zero-based [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"}, Dec represents each [month]{.azul} with its first [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}: [\${decYear}]{.yellow}+[\${monthNumber0}]{.cyan}+[\${dotm0}]{.lightblue}. This way, Dec can support both zero- and one-based [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"}.

Dec [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} dates replace the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} [d]{.cyan} from Dec dates with [d]{.cyan}[-]{.mono}[m]{.lightblue}+[m]{.lightblue}. We evaluate the subtraction to get [d]{.cyan}[-]{.mono}[m]{.lightblue}, the Dec [month]{.azul} number, but not the addition, so we can see [m]{.lightblue}, the [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"}. If we combine the [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} and [dow]{.under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} patterns above⬆️, we can create hybrid [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"}+[dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} Dec dates: [\${decYear}]{.yellow}+[\${monthNumber - dotw}]{.cyan}+[\${dotm}]{.lightblue}+[\${dotw}]{.lightgreen}, where [\${monthNumber - dotw}]{.cyan} is [d]{.cyan}[-]{.mono}[m]{.lightblue}[-]{.mono}[w]{.lightgreen}, the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} of the last [Dow 0]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="Sunday"} before the beginning of the [month]{.azul}.

We can obtain Dec [month]{.azul} numbers using only a pair of hands🤲by counting index☝️and ring💍fingers as 30 days and other fingers as 31 days. For zero-based [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"}, we start counting from 0. For one-based [doms]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="days of month"}, we start counting from -1, as shown in the image below⬇️. To spread 12 [months]{.azul} across 10 fingers, the first and last fingers each represent 2 [months]{.azul}.


:::{.hand}
{{< include _left.qmd >}}
{{< include _right.qmd >}}
:::
[[Wikimedia](https://commons.wikimedia.org/wiki/File:Typing-colour_for-finger-positions.svg)]{.handlabel}

The finger🖐[mnemonic](https://en.wikipedia.org/wiki/Mnemonic#:~:text=any%20learning%20technique%20that%20aids%20information%20retention%20or%20retrieval%20in%20the%20human%20memory) described above⬆️is similar to the [knuckle👊](https://en.wikipedia.org/wiki/Knuckle_mnemonic#:~:text=a%20mnemonic%20device%20for%20remembering%20the%20number%20of%20days%20in%20the%20months%20of%20the%20Julian%20and%20Gregorian%20calendars)and [musical keyboard🎹](https://en.wikipedia.org/wiki/Month#:~:text=this%20cyclical%20pattern%20of%20month%20lengths%20matches%20the%20musical%20keyboard%20alternation%20of%20wide%20white%20keys%20(31%20days)%20and%20narrow%20black%20keys%20(30%20days))mnemonics. These mnemonics attempt to make sense of the irregular pattern of [[month]{.azul} lengths](https://en.wikipedia.org/wiki/Month#:~:text=Name-,Number,of%20days) in the Gregorian calendar🗓️. As opposed to [months]{.azul}, we do not need mnemonics, tables, or mental calculations to use [deks]{.cyan}, because all of the required information is plainly visible in the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}.

# Month of year (moy){#moy}

To convert [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of year"} to or from [POSIX month](https://pubs.opengroup.org/onlinepubs/007904875/utilities/date.html#:~:text=Month%20as%20a%20decimal%20number%20%5B01%2C12%5D) and [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} numbers, we can use the [month of year]{.azul} ([moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"}) equations from the [`civil_from_days`](https://howardhinnant.github.io/date_algorithms.html#civil_from_days){.mono .under} and [`days_from_civil`](https://howardhinnant.github.io/date_algorithms.html#days_from_civil){.mono .under} algorithms. Unlike POSIX month numbers, [moys]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="months of year"} are zero-based and start from [Moy 0]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="March"} instead of [Moy 10]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="January"}. As shown in the first [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"} equation below⬇️, we can obtain a [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"} from a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} or a POSIX [month]{.azul} number.

:::{.overflowequation style="overflow-x:auto;overflow-y:hidden;"}
$$\text{moy} = (5 \times \text{doy} + 2) \div 153 = \begin{cases}\text{month}-3&{\text{if }\text{month}\gt 2;}\\\text{month}+9&{\text{otherwise.}}\end{cases}$$
:::

$$\text{month} = \begin{cases}\text{moy}+3&{\text{if }\text{moy}\lt 10;}\\\text{moy}-9&{\text{otherwise.}}\end{cases}$$

$$\text{dom} = \text{doy} - (153 \times \text{moy} + 2) \div 5 + 1$$

$$\text{doy} = (153 \times \text{moy}+ 2) \div 5 + \text{dom} - 1$$

A [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"} and its equivalent POSIX [month]{.azul} number differ by 9 in [Moy]{.azul} [10]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="January"} or [11]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="February"} and -3 in any other [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"} because the Dec epoch, [0000]{.yellow}+[000]{.cyan}, is 2 [months]{.azul} later than the Gregorian calendar🗓️epoch: [-0001]{.yellow}+[306]{.cyan}. To convert [years]{.yellow}, we add 1 to Dec [years]{.yellow} and subtract 1 from Gregorian calendar🗓️[years]{.yellow} if the [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} is greater than 305, the [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="month of year"} is greater than 9, or the [month]{.azul} is less than 3:

:::{.overflowequation style="overflow-x:auto;overflow-y:hidden;"}
$$\text{Dec year} = \begin{cases}\text{Gregorian calendar year}-1&{\text{if }\text{doy}\gt 305\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{moy}\gt 9\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{month}\lt 3;}\\\text{Gregorian calendar year}&{\text{otherwise.}}\end{cases}$$
:::

:::{.overflowequation style="overflow-x:auto;overflow-y:hidden;"}
$$\text{Gregorian calendar year} = \begin{cases}\text{Dec year}+1&{\text{if }\text{doy}\gt 305\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{moy}\gt 9\href{https://en.wikipedia.org/wiki/Logical_disjunction}{\lor}\text{month}\lt 3;}\\\text{Dec year}&{\text{otherwise.}}\end{cases}$$
:::

# Summary{#tldr}

This article describes Dec and how it can interoperate with the Gregorian calendar🗓️by minuend expanding Dec dates into [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} and [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates or dividend expanding [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"} dates into [woy]{.darkgreen .under .tool data-bs-toggle="tooltip" data-bs-title="week of year"} dates. On its own, Dec minuend expands dates into span🌈equivalents, but has no use for dividend expansion, because [doys]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} display [deks]{.cyan} and [dods]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of dek"} without any expansion.

The flowchart below⬇️visualizes the conversion of the UNIX epoch Dec date [1969]{.yellow}+[306]{.cyan} into a Gregorian calendar🗓️[year]{.yellow}, [month]{.azul}, [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} and [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}. To obtain its associated [dow]{.lightgreen .under .tool data-bs-toggle="tooltip" data-bs-title="day of week"}, we first need to convert a Dec date into a [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"}. Outside of its interoperability with the Gregorian calendar🗓️, Dec converts dates into [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"} to find the number of days in between two dates.

```{mermaid}
%%| label: conversionchart
%%{init: {'theme': 'default', 'themeVariables': { 'fontSize': '20px'}}}%%
flowchart LR
   L~~~Y
   L-->Y
   L-->D
   L-->E
   R-->Y
   M-->R[  ]:::empty
   D-->A
   D~~~B[  ]:::empty
   A-->G
   G-->R
   Y~~~L[  ]:::empty
   Y---A[  ]:::empty
   Y~~~A
   B-->M
   B~~~N
   B-->N
   B-->D
   B~~~D
   N~~~B
   E-->W
   subgraph decdate[Decalendar]
   Y[year<br>1969]
   D[doy<br>306]
   E[doe<br>719468]
   end
   subgraph gregdate[Gregorian calendar]
   W[dow<br>4]
   G[year<br>1970]
   M[month<br>1]
   N[dom<br>1]
   end
   classDef empty width:0px;
   click E "#doe"
   click W "#dow"
   click Y "#eya"
   click D "#doy"
   click G "#eya"
   click M "#moy"
   click N "#dom"
```

For simplicity, the flowchart above⬆️does not show conversion byproducts, such as the [coe]{.under .tool data-bs-toggle="tooltip" data-bs-title="cycle of era"}, [yoc]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year of cycle"}, and [doc]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of cycle"} generated during Dec [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of era"} to date conversion or the [moy]{.azul .under .tool data-bs-toggle="tooltip" data-bs-title="months of year"} that we need in order to split a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"} into a [month]{.azul} and a [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} or combine a [month]{.azul} and a [dom]{.lightblue .under .tool data-bs-toggle="tooltip" data-bs-title="day of month"} into a [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day of year"}. The arrows in the flowchart represent equations adapted from [[`chrono`]{.mono .under}-Compatible Low-Level Date Algorithms](https://howardhinnant.github.io/date_algorithms.html).

Instead of converting Dec dates, we can expand them to view the information we need as part of the math-inspired notation of Dec. At its heart❤️, Dec is a simple system that uses only [years]{.yellow} and [days]{.cyan} for time measurement. Thanks to Dec expansion, Dec can work with other units. In this way, Dec expansion bridges the gap between the Dec and Gregorian calendars🗓️.

# Next

After reading this article, you should be able to understand the examples in my [filter](/quarto/filter), [include](/quarto/include), and [script](/quarto/script) articles, but you may want to start with my [Quarto article](/quarto). To see the full extent of the benefits that Dec provides, I recommend that you continue through the [Dec section](/dec) of my site to the [time](/dec/time)⏳, [snap](/dec/snap)🫰, and [span](/dec/span)🌈articles. Dec has a lot more to offer than just dates!

:::{#datenav}
{{< include /asset/_decquanav.qmd >}}
:::

In addition my Dec and Quarto articles, many other articles on my site discuss Dec. Notably, my [Jupyter](/jupyter) article compares the code underlying Dec in several programming languages, my [Reveal](/reveal) article features a presentation on Dec time measurement, and my [Observable](/observable) article describes how I demonstrate Dec in action with interactive and animated visualizations.

# Cite

Thank you for your interest in Dec. You will find citation information for this article below⬇️. Please note that the original source of the algorithms underlying the conversion of Dec [year]{.yellow}+[day]{.cyan} dates and [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days of era"} is [Hinnant, Howard](https://howardhinnant.github.io). [[2021]{.yellow}+[184]{.cyan}]{.underline .tool data-bs-toggle="tooltip" data-bs-title="2021-09-01"}. “`chrono`-Compatible Low-Level Date Algorithms.” [\${decYear}]{.yellow}+[\${String(decDoty).padStart(3, "0")}]{.cyan}. <https://howardhinnant.github.io/date_algorithms.html>.

{{< include /dec/date/_index.qmd >}}

© Copyright 2025, Martin Laptev

 
  • View source