DEV Community

hudy9x
hudy9x

Posted on

8 Date Functions You Can Absolutely Write Without a Library

Hi everyone, It's Hudy again

Date is one of the most popular object in Javascript that you're supposed to work with in at least one of your projects. And I'm sure that you also implement these function using the Date object for some cases:

  • compare two dates
  • get the last date of month
  • convert date to readable version
  • ... many more

So in this post, I'd like to share with you 8 date utilities function that I often use to manipulate the Date object in javascript.

1. Convert date to a readable version

If you have a list of activities and you'd like to display a readable version of date (ex: 2 min ago, 10 hours ago, 2 days ago) for straightforward and understandable when an activity happens.

Then you could try this.

function toReadableDate(date) {
  const AMIN = 60
  const ADAY = AMIN * 24;

  const minutes = calculateMinuteFromNow(date)
  const isFuture = minutes < 0;
  const absMinutes = Math.abs(minutes)
  const r = n => Math.round(n)

  const addAffix = minStr => {
    if (isFuture) return `in ${minStr}`;
    return `${minStr} ago`;
  }

  if (absMinutes < AMIN) {
    return addAffix(`${minutes} minutes`)
  }

  if (absMinutes < ADAY){
    return addAffix(`${r(absMinutes/AMIN)} hours`)
  }

  if (absMinutes === ADAY && !isFuture) {
    return `yesterday`
  }

  if (absMinutes === ADAY && isFuture) {
    return `tomorrow`
  }

  return addAffix(`${r(absMinutes/ADAY)} days`);
}

function calculateMinuteFromNow(date) {
  const d1 = new Date(date);
  const d2 = new Date();
  const diff = d2.getTime() - d1.getTime();

  return Math.round(diff / (1000 * 60)); // minutes
}

// Test
toReadableDate(new Date(2024, 5, 12)) // '11 days ago'
toReadableDate(new Date(2024, 5, 28)) // 'in 5 days'

Enter fullscreen mode Exit fullscreen mode

2. Get the first/last date of month

The second function that I often used for getting first/last date in month. You can write it easily as follow.

function getFirstDateOfMonth(date) {
  const d = new Date(date)
  d.setDate(1)
  return d
}

function getLastDateOfMonth(date){
  const d1 = new Date(date)

  d1.setMonth(d1.getMonth() + 1)
  d1.setDate(1)
  d1.setHours(-1)

  return d1.getDate()
}

// Test
getFirstDateOfMonth(new Date())
getLastDateOfMonth(new Date()) 

Enter fullscreen mode Exit fullscreen mode

3. Compare two dates

There are two case occur in this function. First, you'd like to compare date and the second is you'd like to compare exact date and time.

function compareDate(dateLeft, dateRight) {
  const d1 = new Date(dateLeft)
  const d2 = new Date(dateRight)

  const d1Str = `${d1.getFullYear()}-${d1.getMonth()}-${d1.getDate()}`
  const d2Str = `${d2.getFullYear()}-${d2.getMonth()}-${d2.getDate()}`

  return d1Str === d2Str
}
Enter fullscreen mode Exit fullscreen mode

The above version compares dates only by year, month and day. It doesn't consider hours, minutes and seconds. The following will handle comparisions based on the exact date and time.

function compareExactDate(dateLeft, dateRight){
  return new Date(dateLeft).getTime() === new Date(dateRight).getTime()
}
Enter fullscreen mode Exit fullscreen mode

4. Calculate the duration between two dates

The fourth function will helps you calculate the number of days/hours/minutes between two dates.


function getDuration(dateLeft, dateRight){
  const DAY = 24
  const HOUR = 60
  const MIN = 60
  const d1 = new Date(dateLeft);
  const d2 = new Date(dateRight);
  const diff = d2.getTime() - d1.getTime();

  return Math.round(diff / (1000 * MIN * HOUR * DAY));
}

// Test
getDuration(new Date(2024, 5, 11) , new Date(2024, 5, 13))

Enter fullscreen mode Exit fullscreen mode

The earlier function only returns the number of days. You can custom the formula to return value in hour, minute as you wish.

5. Get list of month/day in alphabet or number

Sometimes, you want to get the list of month or day in alphabet for displaying on a select box or calendar.

function getMonthList(){
  const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

  return months
}

function getDayList() {
  const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 
  return days
}

function getCompactDayList() {
  return getDayList().map(d => d.slice(0,3))
}

function getCompactMonthList() {
  return getMonthList().map(m => m.slice(0,3))
}

function getMonthOptions(compact) {
  const options = compact ? getCompactMonthList() : getMonthList()
  return options.map((v, i) => ({title: v, id: i}))
}

function getDayOptions(compact) {
  const options = compact ? getCompactDayList() : getDayList()
  return options.map((v, i) => ({title: v, id: i}))
}

Enter fullscreen mode Exit fullscreen mode

6. Get the first (monday) and last day (saturday) of week

For those unfamiliar with the Date object, keep in mind that Sunday is assigned 0 and Saturday is assigned 6.

function getFirstDayOfWeek(date) {
  const d = new Date(date)
  const day = d.getDay()
  const currentDate = d.getDate()

  d.setDate(currentDate - (day - 1))
  return d;
}

// Test
getFirstDayOfWeek(new Date(2024, 5, 22))

Enter fullscreen mode Exit fullscreen mode
function getLastDayOfWeek(date) {
  const d = new Date(date)
  const day = d.getDay()
  const currentDate = d.getDate()

  d.setDate(currentDate + (6 - day))
  return d;
}

// Test
getLastDayOfWeek(new Date(2024, 5, 16))

Enter fullscreen mode Exit fullscreen mode

7. Get the list of week by a specified date

I often use this function to generate labels for a week's worth of data, which I then use on the x-axis of my visualizations.

function getListOfWeekByDate(date) {
  const day = date.getDay()
  const week = []
  const weekLen = 7

  let i = 0

  while (i < weekLen) {
    const d = new Date(date.getTime())
    const distance = day - i

    d.setDate(d.getDate() - distance)
    week.push(d)
    i++
  }

  return week
}

// Test
getListOfWeekByDate(new Date(2024, 5, 18))
Enter fullscreen mode Exit fullscreen mode

8. Get all week of month

The last function will return all weeks of month. I ultilize getLastDateOfMonth, getFirstDateOfMonth and getListOfWeekByDate from the above functions to create this function.

// 1. we generate the first week of month 
// by using `getFirstDateOfMonth` and `getListOfWeekByDate`
function getFirstWeekOfMonth(d) {
  const firstDateOfMonth = getFirstDateOfMonth(d)
  return getListOfWeekByDate(firstDateOfMonth)
}


function getFullWeekOfMonth(d) {
  const weeks = []
  const month = d.getMonth()
  const lastDateInThisMonth = getLastDateOfMonth(d)

  // 1. get the first week
  const firstWeek = getFirstWeekOfMonth(d)

  weeks[0] = firstWeek

  let going = true

  while (going) {
    const lastWeek = weeks[weeks.length - 1]
    // 5.1 until no week found
    if (!lastWeek) {
      going = false
      break
    }

    // 2. get the last date of the last week
    const lastDate = lastWeek[lastWeek.length - 1]
    const ldate = lastDate.getDate()
    const lmonth = lastDate.getMonth()

    // 5.2 or that last date belongs to next month
    if (lmonth > month || ldate === lastDateInThisMonth) {
      going = false
      break
    }

    // 3. increase the last date to 1
    const nextDate = new Date(lastDate.getTime())
    nextDate.setDate(nextDate.getDate() + 1)

    // 4. generate the week by a new date
    // then keep going
    const week = getListOfWeekByDate(nextDate)
    weeks.push(week)
  }

  return weeks
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

So, I hope this post provided you some useful things. If you have a better version of the above functions or want to share yours, go ahead, I'd love to learn from you guys.

Thanks for reading, see you in the next post.

Top comments (0)