Skip to content

Instantly share code, notes, and snippets.

@MrModest
Created January 10, 2025 09:37
Show Gist options
  • Save MrModest/a358781d2f9b02210962802cb7b21d96 to your computer and use it in GitHub Desktop.
Save MrModest/a358781d2f9b02210962802cb7b21d96 to your computer and use it in GitHub Desktop.
SilverBullet functions (Library/Custom/Functions/datetime.md)
tags
meta
function getMonday(date) {
    const dayOfWeek = date.getDay();
    const diff = dayOfWeek >= 1 // 1 - for 'Monday', for Sunday - it will be '0'
      ? dayOfWeek - 1 // 1 - for 'Monday', for Sunday - it will be '0'
      : 6 - dayOfWeek;

    const monday = new Date(date);
    monday.setDate(date.getDate() - diff)
    monday.setHours(0,0,0,0)

    return monday;
}

function computeDay(dayNumber, offset = 0) {
  const monday = getMonday(new Date())

  const d = new Date(monday);
  d.setDate(monday.getDate() + (dayNumber - 1) + offset)

  return d.toISOString().slice(0,10);
}

// Mapping days to their respective ISO day numbers 
const daysMapping = {
  "Monday": 1, "Tuesday": 2, "Wednesday": 3,
  "Thursday": 4, "Friday": 5, "Saturday": 6,
  "Sunday": 7, 
};

for (const [day, dayNumber] of Object.entries(daysMapping)) {
  // Register functions (no change needed here)
  silverbullet.registerFunction({ name: `last${day}` }, () => computeDay(dayNumber, -7));  
  silverbullet.registerFunction({ name: `this${day}` }, () => computeDay(dayNumber));  
  silverbullet.registerFunction({ name: `next${day}` }, () => computeDay(dayNumber, 7));
}
## Last week's days

- Monday: `{{lastMonday}}`
- Tuesday: `{{lastTuesday}}`
- Wednesday: `{{lastWednesday}}`
- Thursday: `{{lastThursday}}`
- Friday: `{{lastFriday}}`
- Saturday: `{{lastSaturday}}`
- Sunday: `{{lastSunday}}`

## This week's days

- Monday: `{{thisMonday}}`
- Tuesday: `{{thisTuesday}}`
- Wednesday: `{{thisWednesday}}`
- Thursday: `{{thisThursday}}`
- Friday: `{{thisFriday}}`
- Saturday: `{{thisSaturday}}`
- Sunday: `{{thisSunday}}`

## Next week's days

- Monday: `{{nextMonday}}`
- Tuesday: `{{nextTuesday}}`
- Wednesday: `{{nextWednesday}}`
- Thursday: `{{nextThursday}}`
- Friday: `{{nextFriday}}`
- Saturday: `{{nextSaturday}}`
- Sunday: `{{nextSunday}}`

function isPast(date) {
  return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) > 0
}

function isFuture(date) {
  return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) < 0
}

function isToday(date) {
  return Temporal.PlainDate.compare(Temporal.Now.plainDateISO(), date) === 0
}

function prettifyDuration({ direction, duration }) {
  const outStr = [];
  if (duration.years > 0) {
    outStr.push(`${duration.years}Y`)
  }
  if (duration.months > 0) {
    outStr.push(`${duration.months}M`)
  }
  if (duration.days > 0) {
    outStr.push(`${duration.days}D`)
  }
  if (duration.hours > 0) {
    outStr.push(`${duration.hours}H`)
  }
  if (duration.minutes > 0) {
    outStr.push(`${duration.minutes}m`)
  }
  if (outStr.length === 0) {
    outStr.push("Now!")
  }

  const prefix = (direction === 'past') ? 'Passed: ' : 'Remains: ' 

  return prefix + outStr.join('/')
}

function DateDiffString(rawDate) {
  const parsedDate = Temporal.PlainDateTime.from(rawDate);
  const now = Temporal.Now.plainDateTimeISO();

  const duration = isPast(parsedDate)
    ? ({ 
        direction: 'past',
        duration: now.since(parsedDate, { largestUnit: 'years', smallestUnit: 'minute' }) 
      })
    : ({ 
        direction: 'future',
        duration: now.until(parsedDate, { largestUnit: 'years', smallestUnit: 'minute' }) 
      })

  return duration
}

function untilDateAnniversary(rawDate) {
  const parsedDate = Temporal.PlainDateTime.from(rawDate);
  const now = Temporal.Now.plainDateTimeISO();

  const thisYearDate = new Temporal.PlainDate(
    now.year, parsedDate.month, parsedDate.day,
    parsedDate.hours, parsedDate.minutes
  );
  const nextYearDate = new Temporal.PlainDate(
    now.year + 1, parsedDate.month, parsedDate.day,
    parsedDate.hours, parsedDate.minutes
  );

  const duration = isPast(thisYearDate)
    ? now.until(nextYearDate, { largestUnit: 'years', smallestUnit: 'minute' })
    : now.until(thisYearDate, { largestUnit: 'years', smallestUnit: 'minute' });

  return ({
    direction: 'future',
    duration: duration 
  })
}

silverbullet.registerFunction("untilDate", (rawDate, yearly = false) => {
  if (yearly) {
    return prettifyDuration(untilDateAnniversary(rawDate));
  } else {
    return prettifyDuration(DateDiffString(rawDate))
  }
})
{{untilDate("1995-05-15", true)}}
{{untilDate("1995-05-15")}}
{{untilDate("2024-08-18")}}

@MrModest
Copy link
Author

image image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment