Here is what I came up with when I needed to convert mm/dd/yyyy to verity of different formats. e.g dd/mm/yyyy, yyyy/mm/dd, yyyy-mm-dd, dd.mm.yyyy (it typescript, though just remove type hinting and you'll get vanilla js)
const dateStringToFormat = (dateString: string, format: string): string => {
const parts = dateString.split('/'); // assume incoming date format is mm/dd/yyyy
const date = new Date(Date.UTC(+parts[2], +parts[0]-1, +parts[1]));
let delimiter = '.';
if (format.includes('/')) {
delimiter = '/'
} else if (format.includes('-')) {
delimiter = '-';
}
const year = date.getFullYear();
const month = (date.getMonth() + 1 + '').padStart(2, '0');
const day = (date.getDate() + '').padStart(2, '0');
const position = (idx:number) => idx === 0 ? 0 : (idx < 6 ? 1 : 2);
const partsForamtted = [];
partsForamtted[position(format.indexOf('yyyy'))] = year;
partsForamtted[position(format.indexOf('mm'))] = month;
partsForamtted[position(format.indexOf('dd'))] = day;
return partsForamtted.join(delimiter);
}
Use like this:
dateStringToFormat('03/24/2021', 'dd-mm-yyyy') //24-03-2021
And here is unit tests for the function:
describe('test dateStringToFormat function', () => {
// incoming format is mm/dd/yyyy
test('Test formats with different delimeters, month followed by date and by year', () => {
expect(dateStringToFormat('03/24/2021', 'mm/dd/yyyy')).toBe('03/24/2021');
expect(dateStringToFormat('03/24/2021', 'mm.dd.yyyy')).toBe('03.24.2021');
expect(dateStringToFormat('03/24/2021', 'mm-dd-yyyy')).toBe('03-24-2021');
expect(dateStringToFormat('12/05/2021', 'mm-dd-yyyy')).toBe('12-05-2021');
})
test('Test formats with different delimeters, year followed by month and by date', () => {
expect(dateStringToFormat('03/24/2021', 'yyyy/mm/dd')).toBe('2021/03/24');
expect(dateStringToFormat('03/24/2021', 'yyyy.mm.dd')).toBe('2021.03.24');
expect(dateStringToFormat('03/24/2021', 'yyyy-mm-dd')).toBe('2021-03-24');
expect(dateStringToFormat('12/05/2021', 'yyyy-mm-dd')).toBe('2021-12-05');
})
test('Test formats with different delimeters, date followed by month and by year', () => {
expect(dateStringToFormat('03/24/2021', 'dd/mm/yyyy')).toBe('24/03/2021');
expect(dateStringToFormat('03/24/2021', 'dd.mm.yyyy')).toBe('24.03.2021');
expect(dateStringToFormat('03/24/2021', 'dd-mm-yyyy')).toBe('24-03-2021');
expect(dateStringToFormat('12/05/2021', 'dd-mm-yyyy')).toBe('05-12-2021');
})
})