Problem Explanation:
- Create a program that will take two dates and convert them into a more easy to understand date such as
January 1st, 2017
. It will also check the difference between them, and handles cases with no difference, more than a day, more than a month, more than a year, and more than a month and less than a year respectively.
Hint: 1
- Split the string into an array where you get the "YYYY", "MM", "DD"
Hint: 2
- You need to handle the case for "st", "nd", and "th". Note that 13 is "th" not "rd".
Hint: 3
- If you are using
Date()
to create instances of dates to work with, then use UTC time to avoid errors due to time zone difference between servers.
Spoiler Alert!
Solution ahead!
Code Solution:
function friendly(str) {
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
// COnverst a YYYY-MM-DD string into a date object.
function convertDate(str) {
// Split the dates to work independently.
var dateStr = str.split('-');
// Force the dates into Universal time to avoid issues due to timezones.
return (new Date(Date.UTC(dateStr[0], dateStr[1] - 1, dateStr[2])));
}
// Handles the case of the day's endings.
function dateEnding(val) {
switch (val) {
case 1:
case 21:
case 31:
return val + 'st';
case 2:
case 22:
return val + 'nd';
case 3:
case 23:
return val + 'rd';
default:
return val + 'th';
}
}
// Checks for the real difference in months to avoid errors
function monthDiff(date1, date2) {
var month2 = date2.getUTCFullYear() * 12 + date2.getUTCMonth();
var month1 = date1.getUTCFullYear() * 12 + date1.getUTCMonth();
return month2 - month1;
}
//day diff
function dayDiff(date1, date2) {
if(date2.getUTCMonth() === date1.getUTCMonth()){
return date1.getUTCDate()-date2.getUTCDate();
}
return 0;
}
// Get's the right month string.
function getMonth(date) {
return months[date.getUTCMonth()];
}
function displayDate() {
// Handles same day
if (date2.getTime() - date1.getTime() === 0) {
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate()) + ', ' + date1.getUTCFullYear()];
}
// Handles same month
if (date1.getUTCMonth() === date2.getUTCMonth() && date1.getUTCFullYear() === date2.getUTCFullYear()) {
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate()), dateEnding(date2.getUTCDate())];
}
// Handles more than a month of difference, but less than 12 months and different year
if (monthDiff(date1, date2) < 12 && date1.getUTCFullYear() !== date2.getUTCFullYear() ) {
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate()), getMonth(date2) + ' ' + dateEnding(date2.getUTCDate())];
}
// Handles same month but different year
if (monthDiff(date1, date2) <= 12 && dayDiff(date1, date2)>0) {
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate())+', '+date1.getUTCFullYear(), getMonth(date2) + ' ' + dateEnding(date2.getUTCDate())];
}
// Handles more than a month of difference, but less than 12 months and same year
if (monthDiff(date1, date2) < 12) {
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate())+', '+date1.getUTCFullYear(), getMonth(date2) + ' ' + dateEnding(date2.getUTCDate())];
}
// Handles cases with more than 12 months apaprt.
return [getMonth(date1) + ' ' + dateEnding(date1.getUTCDate()) + ', ' + date1.getUTCFullYear(), getMonth(date2) + ' ' + dateEnding(date2.getUTCDate()) + ', ' + date2.getUTCFullYear()];
}
var date1 = convertDate(str[0]);
var date2 = convertDate(str[1]);
return displayDate();
}
Code Explanation:
- Read comments in code
Credits:
If you found this page useful, you can give thanks by copying and pasting this on the main chat: thanks @Rafase282 @guyjoseph for your help with Algorithm: Friendly Date Ranges
NOTE: Please add your username only if you have added any relevant main contents to the wiki page. (Please don't remove any existing usernames.)