function parseDateComponents(dateStr) {
var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var dateComponents = {year: null, month: 0, day: 1, hour: 0, minute: 0, second: 0}
var patterns = [
{ regex: /^(\d{4})$/, format: "yyyy" },
{ regex: /^(\d{4})-(\d{2})$/, format: "yyyy-MM" },
{ regex: /^(\d{4})-(\d{2})-(\d{2})$/, format: "yyyy-MM-dd" },
{ regex: /^(\d{4})-(\d{2})-(\d{2}) (\d{2})$/, format: "yyyy-MM-dd HH" },
{ regex: /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})$/, format: "yyyy-MM-dd HH:mm" },
{ regex: /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/, format: "yyyy-MM-dd HH:mm:ss" },
{ regex: /^(\d{2}):(\d{2}):(\d{2})$/, format: "HH:mm:ss" },
{ regex: /^(\d{2}):(\d{2})$/, format: "HH:mm" },
{ regex: /^(\d{2})$/, format: "HH" },
{ regex: /^(\d{2})-(\d{4})$/, format: "MM-yyyy" },
{ regex: /^(\d{2})-(\d{2})-(\d{4})$/, format: "MM-dd-yyyy" },
{ regex: /^(\d{2})-(\d{2})-(\d{4}) (\d{2})$/, format: "MM-dd-yyyy HH" },
{ regex: /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/, format: "MM-dd-yyyy HH:mm" },
{ regex: /^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})$/, format: "MM-dd-yyyy HH:mm:ss" },
{ regex: /^(\d{2})-([A-Za-z]{3})-(\d{4})$/, format: "dd-MMM-yyyy" },
{ regex: /^(\d{2})-([A-Za-z]{3})-(\d{4}) (\d{2})$/, format: "dd-MMM-yyyy HH" },
{ regex: /^(\d{2})-([A-Za-z]{3})-(\d{4}) (\d{2}):(\d{2})$/, format: "dd-MMM-yyyy HH:mm" },
{ regex: /^(\d{2})-([A-Za-z]{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2})$/, format: "dd-MMM-yyyy HH:mm:ss" },
{ regex: /^([A-Za-z]{3})-(\d{4})$/, format: "MMM-yyyy" },
{ regex: /^([A-Za-z]{3})-(\d{2})-(\d{4})$/, format: "MMM-dd-yyyy" },
{ regex: /^([A-Za-z]{3})-(\d{2})-(\d{4}) (\d{2})$/, format: "MMM-dd-yyyy HH" },
{ regex: /^([A-Za-z]{3})-(\d{2})-(\d{4}) (\d{2}):(\d{2})$/, format: "MMM-dd-yyyy HH:mm" },
{ regex: /^([A-Za-z]{3})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})$/, format: "MMM-dd-yyyy HH:mm:ss" },
{ regex: /^(\d{4})-([A-Za-z]{3})$/, format: "yyyy-MMM" },
{ regex: /^(\d{4})-([A-Za-z]{3})-(\d{2})$/, format: "yyyy-MMM-dd" },
{ regex: /^(\d{4})-([A-Za-z]{3})-(\d{2}) (\d{2})$/, format: "yyyy-MMM-dd HH" },
{ regex: /^(\d{4})-([A-Za-z]{3})-(\d{2}) (\d{2}):(\d{2})$/, format: "yyyy-MMM-dd HH:mm" },
{ regex: /^(\d{4})-([A-Za-z]{3})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/, format: "yyyy-MMM-dd HH:mm:ss" },
];
for (var i = 0; i < patterns.length; i++){
var pattern = patterns[i];
var match = dateStr.match(pattern.regex);
if(match) {
var parts = pattern.format.split(/[- :]/);
if(parts.indexOf('yyyy') !== -1)
dateComponents.year = +match[parts.indexOf('yyyy')+1];
if(parts.indexOf('MMM') !== -1){
var monthEngName = match[parts.indexOf('MMM')+1]
dateComponents.month = monthNames.indexOf(monthEngName);
}
if(parts.indexOf('MM') !== -1)
dateComponents.month = +match[parts.indexOf('MM')+1] -1;
if(parts.indexOf('dd') !== -1)
dateComponents.day = +match[parts.indexOf('dd')+1];
if(parts.indexOf('HH') !== -1)
dateComponents.hour = +match[parts.indexOf('HH')+1];
if(parts.indexOf('mm') !== -1)
dateComponents.minute = +match[parts.indexOf('mm')+1];
if(parts.indexOf('ss') !== -1)
dateComponents.second = +match[parts.indexOf('ss')+1];
var date = new Date(dateComponents.year, dateComponents.month, dateComponents.day,
dateComponents.hour, dateComponents.minute, dateComponents.second)
return {format:pattern.format, date:date};
}
}
return null;
}
function recoverDateFormat(date, formatString) {
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var pad = function(n) {
return n < 10 ? '0' + n : n.toString();
};
var year = date.getFullYear();
var month = date.getMonth();
var day = date.getDate();
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var monthStr = months[month];
var replacements = {
'yyyy': year,
'MMM': monthStr,
'MM': pad(month + 1),
'dd': pad(day),
'HH': pad(hours),
'mm': pad(minutes),
'ss': pad(seconds)
};
var result = formatString;
result = result.replace(/yyyy/g, replacements['yyyy']);
result = result.replace(/MMM/g, replacements['MMM']);
result = result.replace(/MM/g, replacements['MM']);
result = result.replace(/dd/g, replacements['dd']);
result = result.replace(/HH/g, replacements['HH']);
result = result.replace(/mm/g, replacements['mm']);
result = result.replace(/ss/g, replacements['ss']);
return result;
}
function formatDate(var1, format) {
var isValidFormats = [
'yyyy',
'yyyy-MM',
'yyyy-MM-dd',
'dd-MMM-yyyy',
'yyyy-MM-dd HH',
'dd-MMM-yyyy HH',
'yyyy-MM-dd HH:mm',
'dd-MMM-yyyy HH:mm',
'HH:mm',
'HH:mm:ss'
];
var dateComponent = parseDateComponents(var1);
if(dateComponent==null || isValidFormats.indexOf(format)===-1 || dateComponent.format.indexOf(format)===-1)
return null;
return recoverDateFormat(dateComponent.date, format)
}
console.log(formatDate("2024-02-01 20:00:00", "yyyy-MM-dd HH:mm"));
console.log(formatDate("01-Dec-2024 20:00:00", "dd-MMM-yyyy"));
console.log(formatDate("2024-02-01 20:00:00", "HH:mm:ss"));
console.log(formatDate("2024-02-01 20:00:00", "dd-MMM-yyyy HH:mm"));