@fav/type.to-date
Version:
Convert a string in various date format to a date object.
60 lines (47 loc) • 1.43 kB
JavaScript
;
var isString = require('@fav/type.is-string');
var isValidDate = require('@fav/type.is-valid-date');
var newDate = require('./new-date');
function fromRfc3339(text) {
if (!isString(text)) {
return null;
}
/* eslint-disable max-len */
var result = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]+)?(Z|([\+\-])([0-9]{2}):([0-9]{2}))$/.exec(text);
/* eslint-enable max-len */
if (!result) {
return null;
}
var year = parseInt(result[1], 10);
var month = parseInt(result[2], 10);
var day = parseInt(result[3], 10);
var hour = parseInt(result[4], 10);
var minute = parseInt(result[5], 10);
var second = parseInt(result[6], 10);
var millis;
if (result[7]) {
millis = result[7].slice(1, 4);
millis += '000'.slice(millis.length);
millis = parseInt(millis, 10);
} else {
millis = 0;
}
var zone = result[8];
if (zone !== 'Z') {
var zoneSign = (result[9] === '-') ? -1 : 1;
hour -= parseInt(result[10], 10) * zoneSign;
minute -= parseInt(result[11], 10) * zoneSign;
}
var tz = newDate().getTimezoneOffset();
var tzMinute = tz % 60;
var tzHour = (tz - tzMinute) / 60;
hour -= tzHour;
minute -= tzMinute;
var date = newDate(year, month - 1, day, hour, minute, second, millis);
/* istanbul ignore if */
if (!isValidDate(date)) {
return null;
}
return date;
}
module.exports = fromRfc3339;