feat: daily notes (dev only) (#1894)

This commit is contained in:
Mo
2022-10-27 17:21:31 -05:00
committed by GitHub
parent 064e054587
commit 69c3f2be83
47 changed files with 1535 additions and 158 deletions

View File

@@ -0,0 +1,31 @@
import { addDays } from '@/Utils/DateUtils'
import { numDaysBetweenDates } from './DateUtils'
describe('date utils', () => {
describe('numDaysBetweenDates', () => {
it('should return full days diff accurately', () => {
const today = new Date()
expect(numDaysBetweenDates(today, addDays(today, 1))).toEqual(1)
expect(numDaysBetweenDates(today, addDays(today, 2))).toEqual(2)
expect(numDaysBetweenDates(today, addDays(today, 3))).toEqual(3)
})
it('should return absolute value of difference', () => {
const today = new Date()
expect(numDaysBetweenDates(today, addDays(today, 3))).toEqual(3)
expect(numDaysBetweenDates(addDays(today, 3), today)).toEqual(3)
})
it('should return 1 day difference between two dates on different days but 1 hour apart', () => {
const today = new Date()
const oneHourBeforeMidnight = new Date()
oneHourBeforeMidnight.setHours(0, 0, 0, 0)
oneHourBeforeMidnight.setHours(-1, 0, 0, 0)
expect(today.toDateString()).not.toEqual(oneHourBeforeMidnight.toDateString())
expect(numDaysBetweenDates(today, oneHourBeforeMidnight)).toEqual(1)
})
})
})

View File

@@ -12,13 +12,84 @@ export const formatDateForContextMenu = (date: Date | undefined) => {
return `${date.toDateString()} ${date.toLocaleTimeString()}`
}
export const formatDateAndTimeForNote = (date: Date) => {
return `${date.toLocaleDateString(undefined, {
export const formatDateAndTimeForNote = (date: Date, includeTime = true) => {
const dateString = `${date.toLocaleDateString(undefined, {
weekday: 'long',
day: 'numeric',
month: 'short',
year: 'numeric',
})} at ${date.toLocaleTimeString(undefined, {
timeStyle: 'short',
})}`
if (includeTime) {
return `${dateString} at ${date.toLocaleTimeString(undefined, {
timeStyle: 'short',
})}`
} else {
return dateString
}
}
export function numHoursBetweenDates(date1: Date, date2: Date): number {
return Math.abs(date1.getTime() - date2.getTime()) / 3600000
}
export function isDateInSameDay(date1: Date, date2: Date): boolean {
return date1.toLocaleDateString() === date2.toLocaleDateString()
}
export function numDaysBetweenDates(date1: Date, date2: Date): number {
if (numHoursBetweenDates(date1, date2) < 24) {
const dayOfWeekDiffers = date1.toLocaleDateString() !== date2.toLocaleDateString()
if (dayOfWeekDiffers) {
return 1
}
}
const diffInMs = date1.getTime() - date2.getTime()
const diffInDays = Math.abs(diffInMs / (1000 * 60 * 60 * 24))
return Math.floor(diffInDays)
}
export function addDays(date: Date, days: number) {
const result = new Date(date)
result.setDate(result.getDate() + days)
return result
}
export function addMonths(date: Date, months: number) {
const result = new Date(date)
result.setMonth(result.getMonth() + months)
return result
}
export function getWeekdayName(date: Date, format: 'long' | 'short'): string {
return date.toLocaleString('default', { weekday: format })
}
export function areDatesInSameMonth(date1: Date, date2: Date): boolean {
return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth()
}
export function numberOfMonthsBetweenDates(date1: Date, date2: Date, roundUpFractionalMonths = true) {
let startDate = date1
let endDate = date2
let inverse = false
if (date1 > date2) {
startDate = date2
endDate = date1
inverse = true
}
const yearsDifference = endDate.getFullYear() - startDate.getFullYear()
const monthsDifference = endDate.getMonth() - startDate.getMonth()
const daysDifference = endDate.getDate() - startDate.getDate()
let monthCorrection = 0
if (roundUpFractionalMonths === true && daysDifference > 0) {
monthCorrection = 1
} else if (roundUpFractionalMonths !== true && daysDifference < 0) {
monthCorrection = -1
}
return (inverse ? -1 : 1) * (yearsDifference * 12 + monthsDifference + monthCorrection)
}