JSFiddle - React, Tailwind, and code Playground

by woozyking

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone-with-data.min.js"></script>

JavaScript

const DEFAULT_TZ = 'America/Toronto'

// return start/end as moment object capping at today
const getStartEnd = ({ startDate, endDate, timeZone=DEFAULT_TZ }) => {
  const now = moment()
  let start = moment.tz(startDate, timeZone)
  let end =  moment.tz(endDate, timeZone)
  if (now.isBefore(end)) {
    end = now
  }
  return { start, end }
}

// generate array of days based on given start/end
const getDays = ({ startDate, endDate, timeZone = DEFAULT_TZ }) => {
  const startEnd = getStartEnd({ startDate, endDate, timeZone })
  let { start } = startEnd
  const { end } = startEnd
  const days = []
  while (start.isSameOrBefore(end)) {
    const dayStart = moment(start)
    let dayEnd = moment(dayStart).endOf('day')
    if (dayEnd.isAfter(end)) {
      dayEnd = moment(end)
    }
    days.push({
      start: dayStart,
      end: dayEnd,
    })
    start = moment(dayEnd).startOf('day').add(1, 'day')
  }
  return days
}

const startDate = '2018-07-05'
const endDate = '2018-07-07'
const {start, end} = getStartEnd({startDate, endDate})
console.log(start.format(), end.format())

const days = getDays({startDate, endDate})
for (const day of days) {
	console.log(day.end.format())
}