mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-06 01:18:23 +08:00
63 lines
2.5 KiB
JavaScript
63 lines
2.5 KiB
JavaScript
/*
|
|
DateToDay Method
|
|
----------------
|
|
The DateToDay method takes a date in string format and
|
|
returns the name of a day. The approach behind this method
|
|
is very simple, we first take a string date and check
|
|
whether their date is valid or not, if the date is valid
|
|
then we do this But apply the algorithm shown below. The
|
|
algorithm shown below gives us the number of the day and
|
|
finally converts it to the name of the day.
|
|
|
|
Algorithm & Explanation : https://en.wikipedia.org/wiki/Zeller%27s_congruence
|
|
*/
|
|
|
|
// Array holding name of the day: Saturday - Sunday - Friday => 0 - 1 - 6
|
|
const daysNameArr = ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
|
|
|
|
const DateToDay = (date) => {
|
|
// firstly, check that input is a string or not.
|
|
if (typeof date !== 'string') {
|
|
return new TypeError('Argument is not a string.')
|
|
}
|
|
// extract the date
|
|
let [day, month, year] = date.split('/').map((x) => Number(x))
|
|
// check the data are valid or not.
|
|
if (day < 1 || day > 31 || month > 12 || month < 1) {
|
|
return new TypeError('Date is not valid.')
|
|
}
|
|
|
|
// In case of Jan and Feb:
|
|
// Year: we consider it as previous year
|
|
// e.g., 1/1/1987 here year is 1986 (-1)
|
|
// Month: we consider value as 13 & 14 respectively
|
|
if (month < 3) {
|
|
year--
|
|
month += 12
|
|
}
|
|
|
|
// divide year into century and the last two digits of the century
|
|
const yearDigits = year % 100
|
|
const century = Math.floor(year / 100)
|
|
|
|
/*
|
|
In mathematics, remainders of divisions are usually defined to always be positive;
|
|
As an example, -2 mod 7 = 5.
|
|
Many programming languages including JavaScript implement the remainder of `n % m` as `sign(n) * (abs(n) % m)`.
|
|
This means the result has the same sign as the numerator. Here, `-2 % 7 = -1 * (2 % 7) = -2`.
|
|
|
|
To ensure a positive numerator, the formula is adapted: `- 2 * century` is replaced with `+ 5 * century`
|
|
which does not alter the resulting numbers mod 7 since `7 - 2 = 5`
|
|
|
|
The following example shows the issue with modulo division:
|
|
Without the adaption, the formula yields `weekDay = -6` for the date 2/3/2014;
|
|
With the adaption, it yields the positive result `weekDay = 7 - 6 = 1` (Sunday), which is what we need to index the array
|
|
*/
|
|
const weekDay = (day + Math.floor((month + 1) * 2.6) + yearDigits + Math.floor(yearDigits / 4) + Math.floor(century / 4) + 5 * century) % 7
|
|
return daysNameArr[weekDay] // name of the weekday
|
|
}
|
|
|
|
// Example : DateToDay("18/12/2020") => Friday
|
|
|
|
export { DateToDay }
|