-
Notifications
You must be signed in to change notification settings - Fork 0
/
dateConverter.ts
86 lines (75 loc) · 2.34 KB
/
dateConverter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
const weekdays = [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
]
/**
* If the day is Monday, return the number of days until next Monday
* If the day is Tuesday, return the number of days until next Tuesday
* If the day is Wednesday, and the current day is Wednesday, return 0
* @input day [string]
*/
function daysUntilNext(day: string): number {
const today = (new Date().getDay() + 6) % 7 // Adjust to make Monday = 0, Tuesday = 1, etc.
const targetDayIndex = weekdays.indexOf(day)
if (targetDayIndex === -1) {
throw new Error("Invalid day")
}
if (targetDayIndex === today) {
return 0
}
return (targetDayIndex + 7 - today) % 7
}
/**
* If the day is today, return 0
* If the day is tomorrow, return 1
* If the day is Saturday, return the number of days until Saturday
* If the day is Sunday, return the number of days until Sunday
* @param day [string]
*/
function parseDayDelay(day: string): number {
if (weekdays.includes(day)) {
return daysUntilNext(day)
} else if (day === "Today") {
return 0
} else if (day === "Tomorrow") {
return 1
}
throw new Error(`Invalid day ${day}`)
}
const fancyDateToDate = (input: string) => {
const [day, time] = input.split(", ")
const [hour, minuteString] = time.split(":")
const [minute, pmOrAm] = minuteString.split(" ")
const delay = new Date()
delay.setHours(pmOrAm === "PM" ? Number(hour) + 12 : Number(hour))
delay.setMinutes(Number(minute))
delay.setDate(delay.getDate() + parseDayDelay(day))
return delay
}
function dateToReadableDelay(date: Date): string {
const now = new Date()
const diffInMillis = date.getTime() - now.getTime()
console.log(diffInMillis)
const diffInMinutes = Math.round(diffInMillis / (1000 * 60))
const diffInHours = Math.round(diffInMillis / (1000 * 60 * 60))
const diffInDays = Math.round(diffInMillis / (1000 * 60 * 60 * 24))
if (diffInMinutes < 0) {
return "The date is in the past"
} else if (diffInMinutes < 60) {
return `in ${diffInMinutes} minutes`
} else if (diffInHours < 24) {
return `in ${diffInHours} hours`
} else if (diffInDays === 1) {
return "in one day"
} else {
return `in ${diffInDays} days`
}
}
export default function fancyDateToReadableDelay(fancyDate: string): string {
return dateToReadableDelay(fancyDateToDate(fancyDate))
}