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())
}