forked from enviPath/enviPy
100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isDate;
|
|
|
|
var _assertString = require('./util/assertString');
|
|
|
|
var _assertString2 = _interopRequireDefault(_assertString);
|
|
|
|
var _isISO = require('./isISO8601');
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function getTimezoneOffset(str) {
|
|
var iso8601Parts = str.match(_isISO.iso8601);
|
|
var timezone = void 0,
|
|
sign = void 0,
|
|
hours = void 0,
|
|
minutes = void 0;
|
|
if (!iso8601Parts) {
|
|
str = str.toLowerCase();
|
|
timezone = str.match(/(?:\s|gmt\s*)(-|\+)(\d{1,4})(\s|$)/);
|
|
if (!timezone) {
|
|
return str.indexOf('gmt') !== -1 ? 0 : null;
|
|
}
|
|
sign = timezone[1];
|
|
var offset = timezone[2];
|
|
if (offset.length === 3) {
|
|
offset = '0' + offset;
|
|
}
|
|
if (offset.length <= 2) {
|
|
hours = 0;
|
|
minutes = parseInt(offset, 10);
|
|
} else {
|
|
hours = parseInt(offset.slice(0, 2), 10);
|
|
minutes = parseInt(offset.slice(2, 4), 10);
|
|
}
|
|
} else {
|
|
timezone = iso8601Parts[21];
|
|
if (!timezone) {
|
|
// if no hour/minute was provided, the date is GMT
|
|
return !iso8601Parts[12] ? 0 : null;
|
|
}
|
|
if (timezone === 'z' || timezone === 'Z') {
|
|
return 0;
|
|
}
|
|
sign = iso8601Parts[22];
|
|
if (timezone.indexOf(':') !== -1) {
|
|
hours = parseInt(iso8601Parts[23], 10);
|
|
minutes = parseInt(iso8601Parts[24], 10);
|
|
} else {
|
|
hours = 0;
|
|
minutes = parseInt(iso8601Parts[23], 10);
|
|
}
|
|
}
|
|
return (hours * 60 + minutes) * (sign === '-' ? 1 : -1);
|
|
}
|
|
|
|
function isDate(str) {
|
|
(0, _assertString2.default)(str);
|
|
var normalizedDate = new Date(Date.parse(str));
|
|
if (isNaN(normalizedDate)) {
|
|
return false;
|
|
}
|
|
|
|
// normalizedDate is in the user's timezone. Apply the input
|
|
// timezone offset to the date so that the year and day match
|
|
// the input
|
|
var timezoneOffset = getTimezoneOffset(str);
|
|
if (timezoneOffset !== null) {
|
|
var timezoneDifference = normalizedDate.getTimezoneOffset() - timezoneOffset;
|
|
normalizedDate = new Date(normalizedDate.getTime() + 60000 * timezoneDifference);
|
|
}
|
|
|
|
var day = String(normalizedDate.getDate());
|
|
var dayOrYear = void 0,
|
|
dayOrYearMatches = void 0,
|
|
year = void 0;
|
|
// check for valid double digits that could be late days
|
|
// check for all matches since a string like '12/23' is a valid date
|
|
// ignore everything with nearby colons
|
|
dayOrYearMatches = str.match(/(^|[^:\d])[23]\d([^T:\d]|$)/g);
|
|
if (!dayOrYearMatches) {
|
|
return true;
|
|
}
|
|
dayOrYear = dayOrYearMatches.map(function (digitString) {
|
|
return digitString.match(/\d+/g)[0];
|
|
}).join('/');
|
|
|
|
year = String(normalizedDate.getFullYear()).slice(-2);
|
|
if (dayOrYear === day || dayOrYear === year) {
|
|
return true;
|
|
} else if (dayOrYear === '' + day / year || dayOrYear === '' + year / day) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
module.exports = exports['default']; |