elliptical-datetime
Version:
Elliptical phrases to handle natural language dates and times
295 lines (235 loc) • 7.29 kB
JavaScript
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;
}