-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Fix DateToDay #1126
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix DateToDay #1126
Changes from 6 commits
310ffca
7df28dd
777e45f
7e75b66
88604e4
f437c62
73eac53
31c8442
ca3555c
be5f007
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,30 +4,11 @@ | |
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://cs.uwaterloo.ca/~alopez-o/math-faq/node73.html | ||
whether their date is valid or not, if the date is not valid | ||
then we return a type error, else we apply Zeller's congruence. | ||
Algorithm & Explanation : https://www.geeksforgeeks.org/zellers-congruence-find-day-date/ | ||
*/ | ||
|
||
// March is taken as the first month of the year. | ||
const calcMonthList = { | ||
1: 11, | ||
2: 12, | ||
3: 1, | ||
4: 2, | ||
5: 3, | ||
6: 4, | ||
7: 5, | ||
8: 6, | ||
9: 7, | ||
10: 8, | ||
11: 9, | ||
12: 10 | ||
} | ||
|
||
// show the week day in a number : Sunday - Saturday => 0 - 6 | ||
const daysNameList = { // weeks-day | ||
|
||
0: 'Sunday', | ||
|
@@ -38,25 +19,23 @@ const daysNameList = { // weeks-day | |
5: 'Friday', | ||
6: 'Saturday' | ||
} | ||
|
||
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 | ||
const [day, month, year] = date.split('/').map((x) => Number(x)) | ||
let [day, month, year] = date.split('/').map((x) => Number(x)) | ||
// check the data are valid or not. | ||
if (day < 0 || day > 31 || month > 12 || month < 0) { | ||
return new TypeError('Date is not valid.') | ||
} | ||
// divide year to century and yearDigit value. | ||
const yearDigit = (year % 100) | ||
// date is resolved based on Zeller's congruence. | ||
|
||
if (month < 3) { year--; month += 12 } | ||
const century = Math.floor(year / 100) | ||
// Apply the algorithm shown above | ||
const weekDay = Math.abs((day + Math.floor((2.6 * calcMonthList[month]) - 0.2) - (2 * century) + yearDigit + Math.floor(yearDigit / 4) + Math.floor(century / 4)) % 7) | ||
// return the weekDay name. | ||
return daysNameList[weekDay] | ||
year %= 100 | ||
const weekDay = (year + Math.floor(year / 4) + Math.floor(century / 4) - 2 * century + Math.floor((26 * (month + 1)) / 10) + day - 1) % 7 | ||
|
||
return daysNameList[(weekDay + 7) % 7] | ||
} | ||
|
||
// Example : DateToDay("18/12/2020") => Friday | ||
|