@fav/type.to-date
Version:
Convert a string in various date format to a date object.
59 lines (48 loc) • 1.71 kB
JavaScript
;
var isString = require('@fav/type.is-string');
var isValidDate = require('@fav/type.is-valid-date');
function fromRfc2822(text) {
if (!isString(text)) {
return null;
}
/* eslint-disable max-len */
var result = /^\s*(Mon,\s*|Tue,\s*|Wed,\s*|Thu,\s*|Fri,\s*|Sat,\s*|Sun,\s*|)([0-9]{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+([0-9]{4,})\s+([0-9]{2}):([0-9]{2}):([0-9]{2})\s+([\+\-])([0-9]{2})([0-9]{2})\s*$/.exec(text);
/* eslint-enable max-len */
if (!result) {
return null;
}
var year = parseInt(result[4], 10);
var month;
switch (result[3]) {
case 'Jan': { month = 0; break; }
case 'Feb': { month = 1; break; }
case 'Mar': { month = 2; break; }
case 'Apr': { month = 3; break; }
case 'May': { month = 4; break; }
case 'Jun': { month = 5; break; }
case 'Jul': { month = 6; break; }
case 'Aug': { month = 7; break; }
case 'Sep': { month = 8; break; }
case 'Oct': { month = 9; break; }
case 'Nov': { month = 10; break; }
case 'Dec': { month = 11; break; }
}
var day = parseInt(result[2], 10);
var hour = parseInt(result[5], 10);
var minute = parseInt(result[6], 10);
var second = parseInt(result[7], 10);
var zoneSign = result[8] === '-' ? -1 : 1;
var zoneHour = parseInt(result[9], 10) * zoneSign;
var zoneMinute = parseInt(result[10], 10) * zoneSign;
var tz = new Date().getTimezoneOffset();
var tzMinute = tz % 60;
var tzHour = (tz - tzMinute) / 60;
hour -= zoneHour + tzHour;
minute -= zoneMinute + tzMinute;
var date = new Date(year, month, day, hour, minute, second);
if (!isValidDate(date)) {
return null;
}
return date;
}
module.exports = fromRfc2822;