Martin Laptev
2025+078+3
4.7111-0

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)
  • Year of era (yoe)
  • 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

Dec

date

time

snap

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}),
])
leapscrub = Array(3) [0, false, 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
))});
dotyInput = 0
monthInput = 3
dotyInput1 = -365
dotmInput = 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"})
  ]
})

Decalendar

0123456789Day of dek 024681012141618202224262830323436DekMarAprMayJunJulAugSepOctNovDecJanFeb0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
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"})
  ]
})

Gregorian calendar

SunMonTueWedThuFriSat0246810121416182022242628303234363840424446485052WeekJanFebMarAprMayJunJulAugSepOctNovDec3112345678910111213141516171819202122232425262728293031123456789101112131415161718192021222324252627281234567891011121314151617181920212223242526272829303112345678910111213141516171819202122232425262728293012345678910111213141516171819202122232425262728293031123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930311234567891011121314151617181920212223242526272829303112345678910111213141516171819202122232425262728293012345678910111213141516171819202122232425262728293031123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930

First day of the Gregorian calendar year

viewof dotwInput = Inputs.radio([
  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday",
  ], {value: "Sunday"})
dotwInput = "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 0. 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 81 or -284. The difference between any positive doy and its negative equivalent is n: 81 – -284 = 365. We obtain the current dek via the dek equation, 8 = ⌊81 ÷ 10⌋, and the current dod number via the dod equation: 1 = 81 mod 10. To combine a dek and dod, we multiply the dek by ten and add the dod: 81 = 8 × 10 + 1.

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 with a different epoch. We can convert a Julian day in 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 4 according to the Dec dow equation: (739915 + 3) mod 7 = 4. In contrast 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 fixed⚓️holiday because it occurs on the same doy every year. Unlike fixed⚓️holidays, Gregorian calendar🗓️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 6, the dow of Day 266 this year, as wS into the dow delta equation, 5 = (4 – 6 + 7) mod 7, and then add wΔ to 266: 271 = 5 + 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:

coe=⌊{yearif year≥0;year−399otherwise.400⌋

yoc=year−coe×400

doe=coe×146097+yoc×365+⌊yoc4⌋−⌊yoc100⌋+doy

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

coe=⌊{doeif doe≥0;doe−146096otherwise.146097⌋

doc=doe−coe×146097

yoc=⌊doc−⌊doc1460⌋+⌊doc36524⌋−⌊doc146096⌋365⌋

year=yoc+coe×400

doy=doc−yoc×365−⌊yoc4⌋+⌊yoc100⌋

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.

Year of era (yoe)

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 year-of-era (yoe) is basically a Dec with a non-integer year and a day permanently set to 0. Both does and yoes 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, yoes are easier to turn into Dec dates. We can convert dates to yoes and vice versa with the Dec yoe equation: y = ⌊y⌋ + d ÷ n. In the Dec yoe equation, y is the yoe, ⌊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 yoe equation values are 2025.2232 = 2025 + 81 ÷ 365.

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:

n={366if (⌊y⌋+1) mod     4=0∧(⌊y⌋+1) mod 100≠0∨(⌊y⌋+1) mod 400=0365otherwise.

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 yoe 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, 2026-284, tells us that Year 2026 will begin in 284 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 yoe 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 81 = ⌊0.2232 × 365⌋. In Dec, a doy by itself is a floating🛟date and a year+day date is a fixed⚓️date. Unlike fixed⚓️dates, floating🛟dates do not include a year and thus can apply to any year.

Fixed⚓️dates are unsimplified math expressions. Instead of simplifying a fixed⚓️date into a yoe, 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, 2025+299-218, can tell us that 218 days are left until Day 299🎄of this year.

In the example above⬆️, the minuend 81 has been expanded into the subtrahend 299 and the difference -218 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🌈: 2025+81=2025+299-218. 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 a yoe.

Whereas expanded dates have a set structure that does not change, Dec spans🌈can omit the subtrahend, 2025+81=-218, or the difference, 2025+81=2025+299. If the year is the same on both sides of the equals sign, it can be omitted from the minuend, 81=2025+299-218, or from the subtrahend along with the difference: 2025+81=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 fixed⚓️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, 2025+81, the navigation bar (navbar) of my site displays the current Dec dow date, 2025+78+3, by splitting the current doy, 81, into the doy of the first day of the current week (Dow 0 doy), 78, and the current POSIX dow: 3.

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: 2025+7×12+3. The current woy, 12, is the sum of the Dow 0 doy, 78, and the first dow of the year (Day 0 dow), 6, divided by 7: 12 = (78 + 6) ÷ 7. The current Dec floating🛟woy date, 7×12+3, is equal to the sum of the current doy and the Day 0 dow: 7 × 12 + 3 = 81 + 6.

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.

rest days

work days

1

0

2

3

4

5

6

7

8

9

rest days

work days

1

2

3

4

5

6

7

8

9

10

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, 16, we double the current dek number, 8, and then add 1 if the current dod number, 1, 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 5-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 2025+60+21. 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: 2025+061+20. 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: 2025+57+21+3, where 57 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.

moy=(5×doy+2)÷153={month−3if month>2;month+9otherwise.

month={moy+3if moy<10;moy−9otherwise.

dom=doy−(153×moy+2)÷5+1

doy=(153×moy+2)÷5+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:

Dec year={Gregorian calendar year−1if doy>305∨moy>9∨month<3;Gregorian calendar yearotherwise.

Gregorian calendar year={Dec year+1if doy>305∨moy>9∨month<3;Dec yearotherwise.

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.

Gregorian calendar

Decalendar

year
1969

doy
306

doe
719468

month
1

year
1970

dom
1

dow
4

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!

Dec

date

time

snap

span

Quarto

filter

include

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.” 2025+081. 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"
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")
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])
unix2dote = ƒ(…)
dote2date = ƒ(…)
dotw2diff = ƒ(x, y)
dz = Array(2) [739697.4711099884, -0]
ydz = Array(3) [2025, 81.47110998840071, -0]
year2leap = ƒ(…)
dote2dotw = ƒ(…)
unix2doty = ƒ(unix)
date2dote = ƒ(…)
addN = ƒ(d)
subN = ƒ(d)
transformInput = ƒ(…)
doty2month = ƒ(…)
month2doty = ƒ(…)
doty2dotm = ƒ(…)
set = ƒ(input, value)
setTransform = ƒ(input)
inverse = ƒ(f)
identity = ƒ(x)
Scrubber = ƒ(…)
decYear = 2025
nextYear = 2026
decDoty = 81
decDek = 8
decDotd = 1
decPent = 16
xmasDiff = -218
xmasDiffSign = "-"
xmasDiffSince = "are left until"
xmasDote = 739915
xmasDotw = 4
dotw = 3
day266dotw = 6
day266dotwDiff = 5
dotm = 21
dotm0 = "20"
monthNumber = 60
monthNumber0 = "061"
dotw0doty = 78
doty0dote = 739616
doty0dotw = 6
week = 12
dotw0sign = "+"
nDaysInYear = 365
Tminus = 284
TminusPadded = "284"
fracYear = 2025.2232085205162
fullfracYear = "2025.2232"
mod1FracYear = "0.2232"
months = Array(12) ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
monthNums = Array(12) ["305", "336", "", "31", "61", "92", "122", "153", "184", "214", "245", "275"]
calYear = 11
datesCal = Array(365) [1910-12-31, 1911-01-01, 1911-01-02, 1911-01-03, 1911-01-04, 1911-01-05, 1911-01-06, 1911-01-07, 1911-01-08, 1911-01-09, 1911-01-10, 1911-01-11, 1911-01-12, 1911-01-13, 1911-01-14, 1911-01-15, 1911-01-16, 1911-01-17, 1911-01-18, 1911-01-19, …]
leapInput = false
turnInput = false
dates = Array(365) [1999-02-28, 1999-03-01, 1999-03-02, 1999-03-03, 1999-03-04, 1999-03-05, 1999-03-06, 1999-03-07, 1999-03-08, 1999-03-09, 1999-03-10, 1999-03-11, 1999-03-12, 1999-03-13, 1999-03-14, 1999-03-15, 1999-03-16, 1999-03-17, 1999-03-18, 1999-03-19, …]
numbers = Array(366) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, …]
undefined
Back to top

Reuse

CC BY-SA 4.0

Citation

BibTeX citation:
@online{laptev2024,
author = {Laptev, Martin},
title = {Dec {Date}},
date = {2024+345},
urldate = {2025+081},
url = {https://maptv.github.io/dec/date},
langid = {en}
}
For attribution, please cite this work as:
Laptev, Martin. 2024+345. “Dec Date.” 2025+081. 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:
  - /dec/date
  - /date
  - /d/d
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}-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 -[\${Tminus}]{.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} -- -[\${Tminus}]{.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](https://en.wikipedia.org/wiki/Julian_day#:~:text=a%20continuous%20count%20of%20days%20from%20the%20beginning%20of%20the%20Julian%20period) 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 Julian day in 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}. In contrast 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 fixed⚓️holiday because it occurs on the same [doy]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day-of-year"} every [year]{.yellow}. Unlike fixed⚓️holidays, Gregorian calendar🗓️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} -- [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} -- [\${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, 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⬆️, are based on Howard Hinnant's [`civil_from_days`](https://howardhinnant.github.io/date_algorithms.html#civil_from_days){.mono} algorithm and are 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 [Julian days](https://en.wikipedia.org/wiki/Julian_day#:~:text=a%20continuous%20count%20of%20days%20from%20the%20beginning%20of%20the%20Julian%20period). 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 the [doe]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="day-of-era"}'s 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}.

# Year of era (yoe){#yoe}

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 [year-of-era]{.yellow} ([yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"}) is basically a Dec 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 [yoes]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="years-of-era"} allow us to represent a date as a single number and obtain the difference between two dates, either in days ([d~M~]{.cyan} - [d~S~]{.cyan}) or [years]{.yellow} ([y~M~]{.yellow} -- [y~S~]{.yellow}).

Compared to [does]{.cyan .under .tool data-bs-toggle="tooltip" data-bs-title="days-of-era"}, [yoes]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="years-of-era"} are easier to turn into Dec dates. We can convert dates to [yoes]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="years-of-era"} and vice versa with the Dec [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"} equation: [y]{.yellow} = &LeftFloor;[y]{.yellow}&RightFloor; + [d]{.cyan} &div; [n]{.orange}. In the Dec [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"} equation, [y]{.yellow} is the [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"}, &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 [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"} 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}-[day]{.pink} Dec dates. The [year]{.yellow}-[day]{.pink} version of the Dec [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"} equation is [y]{.yellow} = &LeftFloor;[y]{.yellow}&RightFloor; + 1 + ([d]{.cyan} -- [n]{.orange}) &div; [n]{.orange}. In essence, [d]{.cyan}-[n]{.orange} is the number of days until the start of [Year]{.yellow} &LeftFloor;[y]{.yellow}&RightFloor;+1. The current [year]{.yellow}-[day]{.pink} date, [\${nextYear}]{.yellow}-[\${TminusPadded}]{.pink}, tells us that [Year]{.yellow} [\${nextYear}]{.yellow} will begin in [\${Tminus}]{.pink} days.

The distinction between [d]{.cyan} and [d]{.cyan}-[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}-[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}-[n]{.orange} is a [negative index](https://en.wikipedia.org/wiki/Array_slicing#:~:text=specify%20an%20offset%20from%20the%20end%20of%20the%20array).

The [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"} 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 fixed⚓️date. Unlike fixed⚓️dates, floating🛟dates do not include a [year]{.yellow} and thus can apply to any [year]{.yellow}.

Fixed⚓️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 fixed⚓️date into a [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"}, 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}[\${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}[\${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 a [yoe]{.yellow .under .tool data-bs-toggle="tooltip" data-bs-title="year-of-era"}.

Whereas expanded dates have a set structure that does not change, Dec spans🌈can omit the subtrahend, [\${decYear}]{.yellow}+[\${decDoty}]{.cyan}=\${xmasDiffSign}[\${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}[\${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 fixed⚓️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}[\${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}-[w]{.lightgreen}+[w]{.lightgreen}, where [d]{.cyan}-[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}-[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}-[w]{.lightgreen} and the difference [w]{.lightgreen}. Then, we use the dividend equation, dividend = divisor &times; quotient, to convert the dividend [d]{.cyan}-[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}-[w]{.lightgreen} into 7&times;[W]{.darkgreen}+[w]{.lightgreen}-[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}-[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 5-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}-[m]{.lightblue}+[m]{.lightblue}. We evaluate the subtraction to get [d]{.cyan}-[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}-[m]{.lightblue}-[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 "#yoe"
   click D "#doy"
   click G "#yoe"
   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