UNPKG

@fav/type.to-date

Version:

Convert a string in various date format to a date object.

59 lines (48 loc) 1.71 kB
'use strict'; 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;