feat: daily notes (dev only) (#1894)
This commit is contained in:
31
packages/web/src/javascripts/Utils/DateUtils.spec.ts
Normal file
31
packages/web/src/javascripts/Utils/DateUtils.spec.ts
Normal 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)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user