/********************************************************************** * * * **********************************************/ /* c8 ignore next 2 */ ((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define) (function(require){ var module={} // make module AMD/node compatible... /*********************************************************************/ var object = require('ig-object') /*********************************************************************/ var DateMixin = module.DateMixin = object.Mixin('DateMixin', 'soft', { timeStamp: function(...args){ return (new this()).getTimeStamp(...args) }, fromTimeStamp: function(ts){ return (new this()).setTimeStamp(ts) }, // convert string time period to milliseconds... str2ms: function(str, dfl){ dfl = dfl || 'ms' // number -- dfl unit... if(typeof(str) == typeof(123)){ var val = str str = dfl // 00:00:00:00:000 format... } else if(str.includes(':')){ var units = str.split(/\s*:\s*/g).reverse() // parse units... var ms = units[0].length == 3 ? parseFloat(units.shift() || 0) : 0 var [s=0, m=0, h=0, d=0] = units // merge... return ((((parseFloat(d || 0)*24 + parseFloat(h || 0))*60 + parseFloat(m || 0))*60 + parseFloat(s || 0))*1000 + ms) // 00set format... } else { var val = parseFloat(str) str = str.trim() // check if a unit is given... str = str == val ? dfl : str } // NOTE: this is a small hack to avoid overcomplicating the // pattern to still match the passed dfl unit... str = ' '+str var c = (/[^a-z](m(illi)?(-)?s(ec(ond(s)?)?)?)$/i.test(str) || /^[0-9]*(\.[0-9]+)?$/.test(str) ) ? 1 : /[^a-z]s(ec(ond(s)?)?)?$/i.test(str) ? 1000 : /[^a-z]m(in(ute(s)?)?)?$/i.test(str) ? 1000*60 : /[^a-z]h(our(s)?)?$/i.test(str) ? 1000*60*60 : /[^a-z]d(ay(s)?)?$/i.test(str) ? 1000*60*60*24 : null return c ? val * c : NaN }, isPeriod: function(str){ return !isNaN(this.str2ms(str)) }, }) // XXX should this be flat??? var DateProtoMixin = module.DateProtoMixin = object.Mixin('DateProtoMixin', 'soft', { toShortDate: function(show_ms){ return '' + this.getFullYear() +'-'+ ('0'+(this.getMonth()+1)).slice(-2) +'-'+ ('0'+this.getDate()).slice(-2) +' '+ ('0'+this.getHours()).slice(-2) +':'+ ('0'+this.getMinutes()).slice(-2) +':'+ ('0'+this.getSeconds()).slice(-2) + (show_ms ? ':'+(('000'+this.getMilliseconds()).slice(-3)) : '') }, getTimeStamp: function(show_ms){ return '' + this.getFullYear() + ('0'+(this.getMonth()+1)).slice(-2) + ('0'+this.getDate()).slice(-2) + ('0'+this.getHours()).slice(-2) + ('0'+this.getMinutes()).slice(-2) + ('0'+this.getSeconds()).slice(-2) + (show_ms ? ('000'+this.getMilliseconds()).slice(-3) : '') }, setTimeStamp: function(ts){ ts = ts.replace(/[^0-9]*/g, '') this.setFullYear(ts.slice(0, 4)) this.setMonth(ts.slice(4, 6)*1-1) this.setDate(ts.slice(6, 8)) this.setHours(ts.slice(8, 10)) this.setMinutes(ts.slice(10, 12)) this.setSeconds(ts.slice(12, 14)) this.setMilliseconds(ts.slice(14, 17) || 0) return this }, }) //--------------------------------------------------------------------- // NOTE: repatching a date should not lead to any side effects as this // does not add any state... // NOTE: this is done differently as there are contexts where there may // be multiple Date objects in different contexts (nw/electron/..) var patchDate = module.patchDate = function(date){ date = date || Date DateMixin(date) DateProtoMixin(date.prototype) return date } //--------------------------------------------------------------------- // patch the root date... patchDate() /********************************************************************** * vim:set ts=4 sw=4 : */ return module })