diff --git a/Conversions/DateToDay.js b/Conversions/DateToDay.js index 8683bdec4b..d295ff25a9 100644 --- a/Conversions/DateToDay.js +++ b/Conversions/DateToDay.js @@ -4,59 +4,38 @@ 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', - 1: 'Monday', - 2: 'Tuesday', - 3: 'Wednesday', - 4: 'Thursday', - 5: 'Friday', - 6: 'Saturday' -} - +// days in a week : Sunday - Saturday => 0 - 6 +const daysNameList = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + '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) + // count Jan & Feb as months 13 & 14 of the previous year + 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) + return daysNameList[(weekDay + 7) % 7] } // Example : DateToDay("18/12/2020") => Friday diff --git a/Conversions/test/DateToDay.test.js b/Conversions/test/DateToDay.test.js index a932dff08c..d5cec6c4fa 100644 --- a/Conversions/test/DateToDay.test.js +++ b/Conversions/test/DateToDay.test.js @@ -2,7 +2,7 @@ import { DateToDay } from '../DateToDay' test('The date 18/02/2001 is Monday', () => { const res = DateToDay('18/02/2001') - expect(res).toBe('Monday') + expect(res).toBe('Sunday') }) test('The date 18/12/2020 is Friday', () => { @@ -16,5 +16,5 @@ test('The date 12/12/2012 is Wednesday', () => { }) test('The date 01/01/2001 is Friday', () => { const res = DateToDay('01/01/2001') - expect(res).toBe('Friday') + expect(res).toBe('Monday') })

AltStyle によって変換されたページ (->オリジナル) /