UNPKG

@fav/type.to-date

Version:

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

60 lines (47 loc) 1.43 kB
'use strict'; 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;