JSFiddle - React, Tailwind, and code Playground

by Josh Pullen

JavaScript

function fuzzyDueString(date) {
	const now = new Date()

  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate())
  
  function daysFromToday(n) {
  	const result = new Date(today)
    result.setDate(result.getDate() + n)
    return result
  }
  
  function sameDay(a, b) {
  	return (
    	a.getFullYear() === b.getFullYear() &&
      a.getMonth() === b.getMonth() &&
      a.getDate() === b.getDate()
    )
  }
  
  const timeString = date.toLocaleTimeString("en-US", { timeStyle: "short" })
	const defaultString = `${date.toLocaleDateString("en-US", {
    weekday: "long",
    year: (date.getFullYear() === today.getFullYear()) ? undefined : "long",
    month: "short",
    day: "numeric"
  })} at ${timeString}`

	if (sameDay(date, daysFromToday(-1))) {
  	return `yesterday at ${timeString}`
  }

  if (sameDay(date, today)) {
  	return `today at ${timeString}`
  }
  
  if (date < now) {
  	return defaultString
  }
  
  if (sameDay(date, daysFromToday(1))) {
  	return `tomorrow at ${timeString}`
  }
  
  const dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
  if (date < daysFromToday(7)) {
    return `${dayNames[date.getDay()]} at ${timeString}`
  }
  
  return defaultString
}

console.log(fuzzyDueString(new Date("10/31/2020 12:40")))