UNPKG

elliptical-datetime

Version:

Elliptical phrases to handle natural language dates and times

295 lines (235 loc) 7.29 kB
import _regeneratorRuntime from 'babel-runtime/regenerator'; var _marked = [possibleDates].map(_regeneratorRuntime.mark); import _ from 'lodash'; import moment from 'moment'; // combine a the date components of a Date object and the time components of {hour, minute, second} // date: moment, Date, or {year, month, day} // time: {hour, minute, second} // timezoneOffset = new Date().getTimezoneOffset() from the user's system export function join(date, time, timezoneOffset) { if (timezoneOffset == null) { return moment(date).set(time).toDate(); } else { var mom = moment(date); var yearComponents = { year: mom.year(), month: mom.month(), date: mom.date() }; return moment().utcOffset(-timezoneOffset).set(yearComponents).set(time).toDate(); } } export function negateDuration(duration) { return _.mapValues(duration, function (num) { return -num; }); } export function relativeTime(duration, now) { var newTime = moment(now).add(moment.duration(duration)); return { hour: newTime.hour(), minute: newTime.minute(), second: newTime.second() }; } export function absoluteTime(absolute) { return { hour: absolute.hour, minute: absolute.minute || 0, second: absolute.second || 0 }; } export function ambiguousTime(ambiguousTime, ampm) { // special case for 24:00 if (ambiguousTime.hour === 24 && (ampm || ambiguousTime.minute || ambiguousTime.second)) { return null; } // special case for 0:00 if (ambiguousTime.hour === 0 && ampm) { return null; } var hour = ampmHourToHour(ambiguousTime.hour, ampm); if (ampm === 'am' && (hour > 12 || hour < 0) || ampm === 'pm' && (hour < 12 || hour > 23)) { return null; } return { hour: hour, minute: ambiguousTime.minute || 0, second: ambiguousTime.second || 0 }; } function ampmHourToHour(hour, ampm) { if (ampm) { if (hour === 12) { return ampm === 'am' ? 0 : 12; } else { return ampm === 'am' ? hour : hour + 12; } } else { if (hour === 24) { return 0; } else { return hour; } } } // export function coerceAmbiguousTime (ambiguousTime, range) { // if (_.inRange(ambiguousTime.hour, ...range)) { // return ambiguousTime // } else { // return {hour: ambiguousTime.hour < 12 ? ambiguousTime.hour + 12 : ambiguousTime.hour - 12, minute: ambiguousTime.minute, second: ambiguousTime.second} // } // } export function absoluteDate(absolute) { return moment(absolute).toDate(); } export function absoluteDay(absolute) { return { month: absolute.month == null ? moment().month() : absolute.month, day: absolute.day == null ? moment.day() : absolute.day }; } export function relativeDate(duration) { var now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return moment(now).add(moment.duration(duration)).toDate(); } export function relativeDay(duration) { var now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var newMoment = moment(now).year(2010).add(moment.duration(duration)); // not leap year return { month: newMoment.month(), day: newMoment.date() }; } export function validateDay() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, month = _ref.month, day = _ref.day, _ref$year = _ref.year, year = _ref$year === undefined ? 2012 : _ref$year; //leap year if (_.isUndefined(month) || _.isUndefined(day)) return true; var dateMoment = moment({ year: year, month: month, day: day }); return dateMoment.month() === month; } export function possibleDates(obj, referenceDate) { var _arr, _i, i, _arr2, _i2, _i3, _arr3, _i4, j, _arr4, _i5, _i6, _arr5, _i7, _i8, _arr6, _i9, _i10; return _regeneratorRuntime.wrap(function possibleDates$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!obj.date) { _context.next = 60; break; } if (!obj._ambiguousWeek) { _context.next = 13; break; } _arr = [0, 7, -7, 14, -14]; _i = 0; case 4: if (!(_i < _arr.length)) { _context.next = 11; break; } i = _arr[_i]; _context.next = 8; return moment(obj.date).add(i, 'days').toDate(); case 8: _i++; _context.next = 4; break; case 11: _context.next = 58; break; case 13: if (!obj._ambiguousYear) { _context.next = 44; break; } if (!obj._ambiguousMonth) { _context.next = 33; break; } _arr2 = [0, 1, -1]; _i2 = 0; case 17: if (!(_i2 < _arr2.length)) { _context.next = 31; break; } _i3 = _arr2[_i2]; _arr3 = [0, 1, -1]; _i4 = 0; case 21: if (!(_i4 < _arr3.length)) { _context.next = 28; break; } j = _arr3[_i4]; _context.next = 25; return moment(obj.date).add(_i3, 'years').add(j, 'months').toDate(); case 25: _i4++; _context.next = 21; break; case 28: _i2++; _context.next = 17; break; case 31: _context.next = 42; break; case 33: _arr4 = [0, 1, -1]; _i5 = 0; case 35: if (!(_i5 < _arr4.length)) { _context.next = 42; break; } _i6 = _arr4[_i5]; _context.next = 39; return moment(obj.date).add(_i6, 'years').toDate(); case 39: _i5++; _context.next = 35; break; case 42: _context.next = 58; break; case 44: if (!obj._ambiguousCentury) { _context.next = 56; break; } _arr5 = [0, 100, -100]; _i7 = 0; case 47: if (!(_i7 < _arr5.length)) { _context.next = 54; break; } _i8 = _arr5[_i7]; _context.next = 51; return moment(obj.date).add(_i8, 'years').toDate(); case 51: _i7++; _context.next = 47; break; case 54: _context.next = 58; break; case 56: _context.next = 58; return obj.date; case 58: _context.next = 69; break; case 60: _arr6 = [0, 1, -1]; _i9 = 0; case 62: if (!(_i9 < _arr6.length)) { _context.next = 69; break; } _i10 = _arr6[_i9]; _context.next = 66; return moment(referenceDate).add(_i10, 'days').toDate(); case 66: _i9++; _context.next = 62; break; case 69: case 'end': return _context.stop(); } } }, _marked[0], this); } export function timeLessThan(a, b) { return a.hour < b.hour || a.hour === b.hour && a.minute < b.minute || a.hour === b.hour && a.minute === b.minute && a.second < b.second; }