Skip to content

refactor: add and use parseDate #1643

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

Merged
merged 2 commits into from
Apr 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 5 additions & 23 deletions Conversions/DateDayDifference.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/

import { isLeapYear } from '../Maths/LeapYear'
import { parseDate } from '../Timing-Functions/ParseDate'

const DateToDay = (dd, mm, yyyy) => {
return (
Expand All @@ -20,32 +21,13 @@ const DateToDay = (dd, mm, yyyy) => {
)
}

const CheckDayAndMonth = (inDay, inMonth) => {
if (inDay <= 0 || inDay > 31 || inMonth <= 0 || inMonth > 12) {
throw new TypeError('Date is not valid.')
}
}

const DateDayDifference = (date1, date2) => {
// firstly, check that both input are string or not.
if (typeof date1 !== 'string' || typeof date2 !== 'string') {
throw new TypeError('Argument is not a string.')
}
// extract the first date
const [firstDateDay, firstDateMonth, firstDateYear] = date1
.split('/')
.map((ele) => Number(ele))
// extract the second date
const [secondDateDay, secondDateMonth, secondDateYear] = date2
.split('/')
.map((ele) => Number(ele))
// check the both data are valid or not.
CheckDayAndMonth(firstDateDay, firstDateMonth)
CheckDayAndMonth(secondDateDay, secondDateMonth)
const firstDate = parseDate(date1)
const secondDate = parseDate(date2)

return Math.abs(
DateToDay(secondDateDay, secondDateMonth, secondDateYear) -
DateToDay(firstDateDay, firstDateMonth, firstDateYear)
DateToDay(secondDate.day, secondDate.month, secondDate.year) -
DateToDay(firstDate.day, firstDate.month, firstDate.year)
)
}

Expand Down
15 changes: 6 additions & 9 deletions Conversions/DateToDay.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
Algorithm & Explanation : https://en.wikipedia.org/wiki/Zeller%27s_congruence
*/

import { parseDate } from '../Timing-Functions/ParseDate'

// Array holding name of the day: Saturday - Sunday - Friday => 0 - 1 - 6
const daysNameArr = [
'Saturday',
Expand All @@ -25,15 +27,10 @@ const daysNameArr = [

const DateToDay = (date) => {
// firstly, check that input is a string or not.
if (typeof date !== 'string') {
throw 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) {
throw new TypeError('Date is not valid.')
}
const dateStruct = parseDate(date)
let year = dateStruct.year
let month = dateStruct.month
let day = dateStruct.day

// In case of Jan and Feb:
// Year: we consider it as previous year
Expand Down
27 changes: 27 additions & 0 deletions Timing-Functions/ParseDate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { getMonthDays } from './GetMonthDays'

function checkDate(date) {
if (date.day < 1 || date.day > getMonthDays(date.month, date.year)) {
throw new Error('Invalid day value.')
}
}

function parseDate(dateString) {
const regex = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/

const match = dateString.match(regex)

if (!match) {
throw new Error("Invalid date format. Please use 'dd/mm/yyyy'.")
}

const res = {
day: parseInt(match[1], 10),
month: parseInt(match[2], 10),
year: parseInt(match[3], 10)
}
checkDate(res)
return res
}

export { parseDate }
40 changes: 40 additions & 0 deletions Timing-Functions/test/ParseDate.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { parseDate } from '../ParseDate'

describe('parseDate', () => {
it.each([
['18/03/2024', { year: 2024, month: 3, day: 18 }],
['29/02/2024', { year: 2024, month: 2, day: 29 }],
['28/02/2023', { year: 2023, month: 2, day: 28 }],
['01/12/2024', { year: 2024, month: 12, day: 1 }],
['1/12/2024', { year: 2024, month: 12, day: 1 }],
['10/1/2024', { year: 2024, month: 1, day: 10 }]
])('Returns correct output for %s', (dateString, expected) => {
expect(parseDate(dateString)).toStrictEqual(expected)
})

it.each([
'18-03-2024',
'18.03.2024',
'03/2024',
'01/02/03/2024',
'123/03/2024'
])('Throws for %s', (wrongDateString) => {
expect(() => {
parseDate(wrongDateString)
}).toThrow()
})

it.each([
'40/03/2024',
'30/02/2024',
'29/02/2023',
'31/04/2023',
'00/01/2024',
'01/00/2024',
'01/13/2024'
])('Throws for %s', (wrongDateString) => {
expect(() => {
parseDate(wrongDateString)
}).toThrow()
})
})
Loading