zhaobing’
1 year ago
3 changed files with 195 additions and 40 deletions
@ -0,0 +1,139 @@ |
|||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
const moment = require('moment'); |
||||
|
|
||||
|
let momentToDateTimeString = function (momentDT, format) { |
||||
|
let utcFormat = 'YYYY-MM-DDTHH:mm:ss.SSSZ'; |
||||
|
let formatString = format || utcFormat; |
||||
|
let datetimeString = formatString == utcFormat ? momentDT.toISOString() : momentDT.format(formatString); |
||||
|
return datetimeString; |
||||
|
}; |
||||
|
|
||||
|
let getRangeByPeriod = function (period, format) { |
||||
|
let formatString = format || 'YYYY-MM-DD HH:mm:ss.SSS'; |
||||
|
try { |
||||
|
let range = null, start = null, end = null, momentDT = null; |
||||
|
let now = momentToDateTimeString(moment(), formatString); |
||||
|
switch (period) { |
||||
|
case 'LAST_MONTH': |
||||
|
momentDT = moment().subtract(1, 'months').startOf('month'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
momentDT = moment().startOf('month'); |
||||
|
end = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $gte: start, $lt: end }; |
||||
|
break; |
||||
|
case 'THIS_MONTH': |
||||
|
momentDT = moment().startOf('month'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $between: [start, now] }; |
||||
|
break; |
||||
|
case 'LAST_WEEK': |
||||
|
momentDT = moment().subtract(1, 'weeks').startOf('isoWeek'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
momentDT = moment().startOf('isoWeek'); |
||||
|
end = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $gte: start, $lt: end }; |
||||
|
break; |
||||
|
case 'THIS_WEEK': |
||||
|
momentDT = moment().startOf('isoWeek'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $between: [start, now] }; |
||||
|
break; |
||||
|
case 'LAST_DAY': |
||||
|
momentDT = moment().subtract(1, 'days').startOf('day'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
momentDT = moment().startOf('day'); |
||||
|
end = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $gte: start, $lt: end }; |
||||
|
break; |
||||
|
case 'THIS_DAY': |
||||
|
momentDT = moment().startOf('day'); |
||||
|
start = momentToDateTimeString(momentDT, formatString); |
||||
|
range = { $between: [start, now] }; |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
}; |
||||
|
return range; |
||||
|
} catch (err) { |
||||
|
throw err; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
let getRange = function (operate, number, period, format, upToNow = false, inquery = true) { |
||||
|
if (!['add', 'subtract'].includes(operate) || !['year', 'month', 'isoWeek', 'week', 'day'].includes(period)) return null; |
||||
|
|
||||
|
let formatString = format || 'YYYY-MM-DD HH:mm:ss.SSS'; |
||||
|
try { |
||||
|
let range = null, start = null, end = null |
||||
|
let periodX = period == 'isoWeek' ? 'weeks' : `${period}s`; |
||||
|
let now = moment().format(formatString); |
||||
|
switch (operate) { |
||||
|
case 'subtract': |
||||
|
start = moment().subtract(number, periodX).startOf(period).format(formatString); |
||||
|
if (upToNow) { |
||||
|
range = inquery ? { $between: [start, now] } : { start, end: now }; |
||||
|
} else { |
||||
|
end = inquery |
||||
|
? moment().subtract(number - 1, periodX).startOf(period).format(formatString) |
||||
|
: moment().subtract(number, periodX).endOf(period).format(formatString); |
||||
|
range = inquery ? { $gte: start, $lt: end } : { start, end }; |
||||
|
} |
||||
|
break; |
||||
|
case 'add': |
||||
|
start = moment().add(number, periodX).startOf(period).format(formatString); |
||||
|
if (upToNow) { |
||||
|
range = inquery ? { $between: [start, now] } : { start, end: now }; |
||||
|
} else { |
||||
|
end = inquery |
||||
|
? moment().add(number + 1, periodX).startOf(period).format(formatString) |
||||
|
: moment().add(number, periodX).endOf(period).format(formatString); |
||||
|
range = inquery ? { $gte: start, $lt: end } : { start, end }; |
||||
|
} |
||||
|
break; |
||||
|
default: |
||||
|
start = moment().startOf('day').format(formatString); |
||||
|
range = inquery ? { $between: [start, now] } : { start, end: now }; |
||||
|
break; |
||||
|
}; |
||||
|
return range; |
||||
|
} catch (err) { |
||||
|
throw err; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 将datetime转换为UTC时间格式 |
||||
|
* @param {datetimeString || Moment} datetime 时间字符串或者Moment对象 |
||||
|
* @returns {string} "YYYY-MM-DDTHH:mm:ss.SSSZ"格式的时间字符串 |
||||
|
*/ |
||||
|
let toUTCString = function (datetime) { |
||||
|
let utcString = moment(datetime).toISOString(); |
||||
|
return utcString; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 将datetime转换为中国标准时间格式,时间默认精确到秒 |
||||
|
* @param {datetimeString || Moment} datetime 时间字符串或者Moment对象 |
||||
|
* @returns {string} "YYYY-MM-DD HH:mm:ss"格式的时间字符串 |
||||
|
*/ |
||||
|
let toCSTString = function (datetime, format) { |
||||
|
let formatString = format || 'YYYY-MM-DD HH:mm:ss'; |
||||
|
let cstString = moment(datetime).format(formatString); |
||||
|
return cstString; |
||||
|
}; |
||||
|
|
||||
|
module.exports = { |
||||
|
entry: (app, router, opts) => { |
||||
|
const timer = { |
||||
|
getRangeByPeriod, |
||||
|
getRange, |
||||
|
toUTCString, |
||||
|
toCSTString |
||||
|
}; |
||||
|
|
||||
|
app.fs = app.fs || {}; |
||||
|
app.fs.timer = timer; |
||||
|
} |
||||
|
}; |
Loading…
Reference in new issue