编辑代码

//12.截取日期时间
// 对不同格式的日期进行解析,返回格式和创建的Date
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'
    ];
     //获取日期格式并创建Date
    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")); // 2024-02-01 20:00
console.log(formatDate("01-Dec-2024 20:00:00", "dd-MMM-yyyy")); // 01-Dec-2024
console.log(formatDate("2024-02-01 20:00:00", "HH:mm:ss")); // 20:00:00
console.log(formatDate("2024-02-01 20:00:00", "dd-MMM-yyyy HH:mm")); // null(不支持的格式或中英文格式不对应)