import dateUtil from '../../utils/date'; export const toDate = function(date) { let _date = new Date(date); // IE patch start (#1422) if (isNaN(_date.getTime()) && typeof date === 'string'){ _date = date.split('-').map(Number); _date[1] += 1; _date = new Date(..._date); } // IE patch end if (isNaN(_date.getTime())) return null; return _date; }; export const formatDate = function(date, format) { date = toDate(date); if (!date) return ''; return dateUtil.format(date, format || 'yyyy-MM-dd'); }; export const parseDate = function(string, format) { return dateUtil.parse(string, format || 'yyyy-MM-dd'); }; export const getDayCountOfMonth = function(year, month) { return new Date(year, month + 1, 0).getDate(); }; export const getFirstDayOfMonth = function(date) { const temp = new Date(date.getTime()); temp.setDate(1); return temp.getDay(); }; export const siblingMonth = function(src, diff) { const temp = new Date(src); // lets copy it so we don't change the original const newMonth = temp.getMonth() + diff; const newMonthDayCount = getDayCountOfMonth(temp.getFullYear(), newMonth); if (newMonthDayCount < temp.getDate()) { temp.setDate(newMonthDayCount); } temp.setMonth(newMonth); return temp; }; export const prevMonth = function(src) { return siblingMonth(src, -1); }; export const nextMonth = function(src) { return siblingMonth(src, 1); }; export const initTimeDate = function() { const date = new Date(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); return date; }; export const formatDateLabels = (function() { /* Formats: yyyy - 4 digit year m - month, numeric, 1 - 12 m - month, numeric, 01 - 12 mmm - month, 3 letters, as in `toLocaleDateString` Mmm - month, 3 letters, capitalize the return from `toLocaleDateString` mmmm - month, full name, as in `toLocaleDateString` Mmmm - month, full name, capitalize the return from `toLocaleDateString` */ const formats = { yyyy: date => date.getFullYear(), m: date => date.getMonth(), mm: date => ('0' + date.getMonth()).slice(-2), mmm: (date, locale) => { const monthName = date.toLocaleDateString(locale, { month: 'long' }); return monthName.slice(0, 3); }, Mmm: (date, locale) => { const monthName = date.toLocaleDateString(locale, { month: 'long' }); return (monthName[0].toUpperCase() + monthName.slice(1).toLowerCase()).slice(0, 3); }, mmmm: (date, locale) => date.toLocaleDateString(locale, { month: 'long' }), Mmmm: (date, locale) => { const monthName = date.toLocaleDateString(locale, { month: 'long' }); return monthName[0].toUpperCase() + monthName.slice(1).toLowerCase(); } }; const formatRegex = new RegExp(['yyyy', 'Mmmm', 'mmmm', 'Mmm', 'mmm', 'mm', 'm'].join('|'), 'g'); return function(locale, format, date) { const componetsRegex = /(\[[^\]]+\])([^\[\]]+)(\[[^\]]+\])/; const components = format.match(componetsRegex).slice(1); const separator = components[1]; const labels = [components[0], components[2]].map(component => { const label = component.replace(/\[[^\]]+\]/, str => { return str.slice(1, -1).replace(formatRegex, match => formats[match](date, locale)); }); return { label: label, type: component.includes('yy') ? 'year' : 'month' }; }); return { separator: separator, labels: labels }; }; })();