types.js/Date.js

157 lines
4.4 KiB
JavaScript
Raw Normal View History

/**********************************************************************
*
*
*
**********************************************/ /* 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', {
hires: function(){
return typeof(process) != 'undefined' ?
performance.timeOrigin + performance.now()
: performance.timing.navigationStart + performance.now() },
hiresTimeStamp: function(){
var t = this.hires()
var date = new this(t)
return date.getTimeStamp(true) + (''+(t-date.getTime())).slice(1) },
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)
// 00sec 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)) },
isDateStr: function(str){
return !isNaN(new Date(str).valueOf()) },
})
// 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 })