date-and-time
Advanced tools
Comparing version 0.1.8 to 0.2.0
/** | ||
* @preserve date-and-time.js (c) 2015 KNOWLEDGECODE | MIT | ||
* @preserve date-and-time.js (c) KNOWLEDGECODE | MIT | ||
*/ | ||
/*global define */ | ||
(function (global) { | ||
'use strict'; | ||
var date = { | ||
month: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], | ||
dayOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], | ||
hour12: { | ||
meridian: ['a.m.', 'p.m.'], | ||
h: function (d) { | ||
var h = d.getHours() || 12; | ||
return h > 12 ? h - 12 : h; | ||
var date = {}, | ||
lang = 'en', | ||
locales = { | ||
en: { | ||
MMMM: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], | ||
MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], | ||
dddd: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], | ||
ddd: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], | ||
dd: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], | ||
A: ['a.m.', 'p.m.'], | ||
formats: { | ||
YYYY: function (d) { return ('000' + d.getFullYear()).slice(-4); }, | ||
YY: function (d) { return this.formats.YYYY(d).slice(2); }, | ||
MMMM: function (d) { return this.MMMM[d.getMonth()]; }, | ||
MMM: function (d) { return this.MMM[d.getMonth()]; }, | ||
M: function (d) { return '' + (d.getMonth() + 1); }, | ||
MM: function (d) { return ('0' + this.formats.M(d)).slice(-2); }, | ||
D: function (d) { return '' + d.getDate(); }, | ||
DD: function (d) { return ('0' + this.formats.D(d)).slice(-2); }, | ||
H: function (d) { return '' + d.getHours(); }, | ||
HH: function (d) { return ('0' + this.formats.H(d)).slice(-2); }, | ||
h: function (d) { | ||
var h = d.getHours() || 12; | ||
return '' + (h > 12 ? h - 12 : h); | ||
}, | ||
hh: function (d) { return ('0' + this.formats.h(d)).slice(-2); }, | ||
A: function (d) { return this.A[d.getHours() > 11 | 0]; }, | ||
m: function (d) { return '' + d.getMinutes(); }, | ||
mm: function (d) { return ('0' + this.formats.m(d)).slice(-2); }, | ||
s: function (d) { return '' + d.getSeconds(); }, | ||
ss: function (d) { return ('0' + this.formats.s(d)).slice(-2); }, | ||
SSS: function (d) { return ('00' + d.getMilliseconds()).slice(-3); }, | ||
SS: function (d) { return this.formats.SSS(d).slice(0, 2); }, | ||
S: function (d) { return this.formats.SSS(d).slice(0, 1); }, | ||
dddd: function (d) { return this.dddd[d.getDay()]; }, | ||
ddd: function (d) { return this.ddd[d.getDay()]; }, | ||
dd: function (d) { return this.dd[d.getDay()]; }, | ||
Z: function (d) { | ||
var offset = d.utc ? 0 : d.getTimezoneOffset(), sign = '-'; | ||
if (offset <= 0) { | ||
sign = '+'; | ||
offset = -offset; | ||
} | ||
return sign + ('000' + ((offset / 60 | 0) * 100 + offset % 60)).slice(-4); | ||
} | ||
}, | ||
A: function (d) { | ||
return this.meridian[d.getHours() > 11 | 0]; | ||
parsers: { | ||
h: function (h, a) { return (h === 12 ? 0 : h) + a * 12; } | ||
} | ||
} | ||
}, | ||
formats = { | ||
YYYY: function (d) { | ||
return ('000' + d.getFullYear()).slice(-4); | ||
}, | ||
YY: function (d) { | ||
return formats.YYYY(d).slice(2); | ||
}, | ||
MMM: function (d) { | ||
return date.month[d.getMonth()]; | ||
}, | ||
M: function (d) { | ||
return String(d.getMonth() + 1); | ||
}, | ||
MM: function (d) { | ||
return ('0' + formats.M(d)).slice(-2); | ||
}, | ||
D: function (d) { | ||
return String(d.getDate()); | ||
}, | ||
DD: function (d) { | ||
return ('0' + formats.D(d)).slice(-2); | ||
}, | ||
H: function (d) { | ||
return String(d.getHours()); | ||
}, | ||
HH: function (d) { | ||
return ('0' + formats.H(d)).slice(-2); | ||
}, | ||
h: function (d) { | ||
return date.hour12.h(d); | ||
}, | ||
hh: function (d) { | ||
return ('0' + formats.h(d)).slice(-2); | ||
}, | ||
A: function (d) { | ||
return date.hour12.A(d); | ||
}, | ||
m: function (d) { | ||
return String(d.getMinutes()); | ||
}, | ||
mm: function (d) { | ||
return ('0' + formats.m(d)).slice(-2); | ||
}, | ||
s: function (d) { | ||
return String(d.getSeconds()); | ||
}, | ||
ss: function (d) { | ||
return ('0' + formats.s(d)).slice(-2); | ||
}, | ||
SSS: function (d) { | ||
return ('00' + d.getMilliseconds()).slice(-3); | ||
}, | ||
SS: function (d) { | ||
return formats.SSS(d).slice(0, 2); | ||
}, | ||
S: function (d) { | ||
return formats.SSS(d).slice(0, 1); | ||
}, | ||
E: function (d) { | ||
return date.dayOfWeek[d.getDay()]; | ||
forEach = function (array, fn) { | ||
for (var i = 0, len = array.length; i < len; i++) { | ||
if (fn(array[i], i) === 0) { | ||
break; | ||
} | ||
} | ||
}, | ||
parse = function (dateString, formatString) { | ||
var i, j, tokens, token, len, len2, index, | ||
vals = dateString.split(/[^\d+]/g), | ||
keys = formatString.split(/[^YYYY|YY|MM?|DD?|HH?|mm?|ss?|SS?S?]/g), | ||
dt = { Y: 0, M: 1, D: 1, H: 0, m: 0, s: 0, S: 0 }; | ||
var offset = 0, k, length, str, | ||
keys = formatString.match(/YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|./g), | ||
dt = { Y: 0, M: 1, D: 1, A: 0, H: 0, h: 0, m: 0, s: 0, S: 0 }; | ||
for (i = 0, len = keys.length; i < len; i++) { | ||
tokens = keys[i].match(/YYYY|YY|MM?|DD?|HH?|mm?|ss?|SS?S?/g) || []; | ||
for (j = 0, len2 = tokens.length; j < len2; j++) { | ||
token = tokens[j]; | ||
index = keys[i].indexOf(token); | ||
if (index >= 0) { | ||
token = token.replace(/^(M|D|H|m|s)$/, '$1$1'); | ||
dt[token.charAt(0)] = (vals[i] || '').slice(index, index + token.length) | 0; | ||
if (token === 'YY') { | ||
dt[token.charAt(0)] += (dt[token.charAt(0)] < 70) ? 2000 : 1900; | ||
forEach(keys, function (key) { | ||
k = key.charAt(0); | ||
length = key.length; | ||
str = dateString.slice(offset); | ||
if (/^(YYYY|YY|MM|DD|HH|hh|mm|ss|SS?S?)$/.test(key)) { | ||
dt[k] = str.slice(0, length) | 0; | ||
if (key === 'YY') { | ||
dt.Y += dt.Y < 70 ? 2000 : 1900; | ||
} | ||
} else if (/^(M|D|H|h|m|s)$/.test(key)) { | ||
str = (str.match(/^\d\d?/) || [''])[0]; | ||
length = str.length; | ||
dt[k] = str | 0; | ||
} else if (/^(MMMM?|A)$/.test(key)) { | ||
forEach(locales[lang][key], function (val, i) { | ||
if (!str.indexOf(val)) { | ||
dt[k] = k === 'M' ? i + 1 : i; | ||
length = val.length; | ||
return 0; | ||
} | ||
} | ||
}); | ||
} | ||
} | ||
offset += length; | ||
}); | ||
return dt; | ||
}, | ||
toH = function (h, a) { | ||
return locales[lang].parsers.h(h, a); | ||
}; | ||
/** | ||
* formatting strings | ||
* @param {Object} dateObj - the target | ||
* @param {String} formatString - the format string | ||
* formatting a date | ||
* @param {Object} dateObj - target date | ||
* @param {String} formatString - format string | ||
* @param {Boolean} [utc] - output as UTC | ||
* @returns {String} the formatted string | ||
*/ | ||
date.format = function (dateObj, formatString) { | ||
var i, len, | ||
tokens = formatString.match(/(YYYY|YY|MMM|MM?|DD?|HH?|hh?|A|mm?|ss?|SS?S?|E|.)/g) || [], | ||
noop = function () { | ||
return null; | ||
}; | ||
date.format = function (dateObj, formatString, utc) { | ||
var tokens = formatString.match(/(\[[^\[\]]*]|\[.*\][^\[]*\]|YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|ddd?d?|.)/g) || [], | ||
d = new Date(dateObj.getTime() + (utc ? dateObj.getTimezoneOffset() * 60000 : 0)), | ||
locale = locales[lang]; | ||
for (i = 0, len = tokens.length; i < len; i++) { | ||
tokens[i] = (formats[tokens[i]] || noop)(dateObj) || tokens[i]; | ||
} | ||
d.utc = utc; | ||
forEach(tokens, function (token, i) { | ||
tokens[i] = (locale.formats[token] || function () {}).call(locale, d) || token.replace(/\[(.*)]/, '$1'); | ||
}); | ||
return tokens.join(''); | ||
@@ -127,14 +120,33 @@ }; | ||
/** | ||
* parsing date strings | ||
* @param {String} dateString - the date string | ||
* @param {String} formatString - the format string | ||
* @returns {Object} the parsed date | ||
* parsing a date string | ||
* @param {String} dateString - date string | ||
* @param {String} formatString - format string | ||
* @param {Boolean} [utc] - input as UTC | ||
* @returns {Object} the constructed date | ||
*/ | ||
date.parse = function (dateString, formatString) { | ||
var dt = parse(dateString, formatString); | ||
return new Date(dt.Y, dt.M - 1, dt.D, dt.H, dt.m, dt.s, dt.S); | ||
date.parse = function (dateString, formatString, utc) { | ||
var dt = parse(dateString, formatString), | ||
dateObj = new Date(dt.Y, dt.M - 1, dt.D, dt.H || toH(dt.h, dt.A), dt.m, dt.s, dt.S); | ||
return utc ? new Date(dateObj.getTime() - dateObj.getTimezoneOffset() * 60000) : dateObj; | ||
}; | ||
/** | ||
* addition ( years ) | ||
* validation | ||
* @param {String} dateString - date string | ||
* @param {String} formatString - format string | ||
* @returns {Boolean} whether the date string is a valid date | ||
*/ | ||
date.isValid = function (dateString, formatString) { | ||
var dt = parse(dateString, formatString), | ||
H = dt.H || toH(dt.h, dt.A), | ||
d = new Date(dt.Y, dt.M - 1, dt.D, H, dt.m, dt.s, dt.S); | ||
return dt.Y === d.getFullYear() && dt.M - 1 === d.getMonth() && dt.D === d.getDate() | ||
&& H === d.getHours() && dt.m === d.getMinutes() && dt.s === d.getSeconds() | ||
&& dt.S === d.getMilliseconds(); | ||
}; | ||
/** | ||
* adding years | ||
* @param {Object} dateObj - the augend | ||
@@ -152,3 +164,3 @@ * @param {Number} years - the addend | ||
/** | ||
* addition ( months ) | ||
* adding months | ||
* @param {Object} dateObj - the augend | ||
@@ -166,3 +178,3 @@ * @param {Number} months - the addend | ||
/** | ||
* addition ( days ) | ||
* adding days | ||
* @param {Object} dateObj - the augend | ||
@@ -173,10 +185,7 @@ * @param {Number} days - the addend | ||
date.addDays = function (dateObj, days) { | ||
var d = new Date(dateObj.getTime()); | ||
d.setDate(d.getDate() + days); | ||
return d; | ||
return new Date(dateObj.getTime() + days * 86400000); | ||
}; | ||
/** | ||
* addition ( hours ) | ||
* adding hours | ||
* @param {Object} dateObj - the augend | ||
@@ -187,10 +196,7 @@ * @param {Number} hours - the addend | ||
date.addHours = function (dateObj, hours) { | ||
var d = new Date(dateObj.getTime()); | ||
d.setHours(d.getHours() + hours); | ||
return d; | ||
return new Date(dateObj.getTime() + hours * 3600000); | ||
}; | ||
/** | ||
* addition ( minutes ) | ||
* adding minutes | ||
* @param {Object} dateObj - the augend | ||
@@ -201,10 +207,7 @@ * @param {Number} minutes - the addend | ||
date.addMinutes = function (dateObj, minutes) { | ||
var d = new Date(dateObj.getTime()); | ||
d.setMinutes(d.getMinutes() + minutes); | ||
return d; | ||
return new Date(dateObj.getTime() + minutes * 60000); | ||
}; | ||
/** | ||
* addition ( seconds ) | ||
* adding seconds | ||
* @param {Object} dateObj - the augend | ||
@@ -215,10 +218,7 @@ * @param {Number} seconds - the addend | ||
date.addSeconds = function (dateObj, seconds) { | ||
var d = new Date(dateObj.getTime()); | ||
d.setSeconds(d.getSeconds() + seconds); | ||
return d; | ||
return new Date(dateObj.getTime() + seconds * 1000); | ||
}; | ||
/** | ||
* addition ( milliseconds ) | ||
* adding milliseconds | ||
* @param {Object} dateObj - the augend | ||
@@ -229,13 +229,10 @@ * @param {Number} milliseconds - the addend | ||
date.addMilliseconds = function (dateObj, milliseconds) { | ||
var d = new Date(dateObj.getTime()); | ||
d.setMilliseconds(d.getMilliseconds() + milliseconds); | ||
return d; | ||
return new Date(dateObj.getTime() + milliseconds); | ||
}; | ||
/** | ||
* subtraction | ||
* subtracting | ||
* @param {Object} date1 - the minuend | ||
* @param {Object} date2 - the subtrahend | ||
* @returns {Object} the date after subtraction | ||
* @returns {Object} the result object after subtraction | ||
*/ | ||
@@ -265,24 +262,55 @@ date.subtract = function (date1, date2) { | ||
/** | ||
* validation | ||
* @param {String} dateString - the date string | ||
* @param {String} formatString - the format string | ||
* @returns {Boolean} whether valid date | ||
* leap year | ||
* @param {Object} dateObj - target date | ||
* @returns {Boolean} whether the year is a leap year | ||
*/ | ||
date.isValid = function (dateString, formatString) { | ||
var dt = parse(dateString, formatString), | ||
d = new Date(dt.Y, dt.M - 1, dt.D, dt.H, dt.m, dt.s, dt.S); | ||
date.isLeapYear = function (dateObj) { | ||
var y = dateObj.getFullYear(); | ||
return (!(y % 4) && !!(y % 100)) || !(y % 400); | ||
}; | ||
return dt.Y === d.getFullYear() && dt.M - 1 === d.getMonth() && dt.D === d.getDate() | ||
&& dt.H === d.getHours() && dt.m === d.getMinutes() && dt.s === d.getSeconds() | ||
&& dt.S === d.getMilliseconds(); | ||
/** | ||
* setting a locale | ||
* @param {String} [code] - language code | ||
* @returns {String} current language code | ||
*/ | ||
date.locale = function (code) { | ||
if (code) { | ||
if (typeof module === 'object' && typeof module.exports === 'object') { | ||
require('./locale/' + code); | ||
} | ||
lang = code; | ||
} | ||
return lang; | ||
}; | ||
/** | ||
* leap year | ||
* @param {Object} dateObj - the target | ||
* @returns {Boolean} whether leap year | ||
* adding a new definition of locale | ||
* @param {String} code - language code | ||
* @param {Object} options - definition of locale | ||
* @returns {void} | ||
*/ | ||
date.isLeapYear = function (dateObj) { | ||
var y = dateObj.getFullYear(); | ||
return (!(y % 4) && !!(y % 100)) || !(y % 400); | ||
date.setLocales = function (code, options) { | ||
var copy = function (src, proto) { | ||
var Locale = function () {}, dst, key; | ||
Locale.prototype = proto; | ||
dst = new Locale(); | ||
for (key in src) { | ||
if (src.hasOwnProperty(key)) { | ||
dst[key] = src[key]; | ||
} | ||
} | ||
return dst; | ||
}, | ||
base = locales[code] || locales.en, | ||
locale = copy(options, base); | ||
if (options.formats) { | ||
locale.formats = copy(options.formats, base.formats); | ||
} | ||
if (options.parsers) { | ||
locale.parsers = copy(options.parsers, base.parsers); | ||
} | ||
locales[code] = locale; | ||
}; | ||
@@ -301,1 +329,2 @@ | ||
}(this)); | ||
/* | ||
date-and-time.js (c) 2015 KNOWLEDGECODE | MIT | ||
date-and-time.js (c) KNOWLEDGECODE | MIT | ||
*/ | ||
(function(k){var c={month:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dayOfWeek:"Sun Mon Tue Wed Thu Fri Sat".split(" "),hour12:{meridian:["a.m.","p.m."],h:function(a){a=a.getHours()||12;return 12<a?a-12:a},A:function(a){return this.meridian[11<a.getHours()|0]}}},d={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return d.YYYY(a).slice(2)},MMM:function(a){return c.month[a.getMonth()]},M:function(a){return String(a.getMonth()+1)},MM:function(a){return("0"+ | ||
d.M(a)).slice(-2)},D:function(a){return String(a.getDate())},DD:function(a){return("0"+d.D(a)).slice(-2)},H:function(a){return String(a.getHours())},HH:function(a){return("0"+d.H(a)).slice(-2)},h:function(a){return c.hour12.h(a)},hh:function(a){return("0"+d.h(a)).slice(-2)},A:function(a){return c.hour12.A(a)},m:function(a){return String(a.getMinutes())},mm:function(a){return("0"+d.m(a)).slice(-2)},s:function(a){return String(a.getSeconds())},ss:function(a){return("0"+d.s(a)).slice(-2)},SSS:function(a){return("00"+ | ||
a.getMilliseconds()).slice(-3)},SS:function(a){return d.SSS(a).slice(0,2)},S:function(a){return d.SSS(a).slice(0,1)},E:function(a){return c.dayOfWeek[a.getDay()]}},f=function(a,p){var b,c,d,e,f,n,g,k=a.split(/[^\d+]/g),l=p.split(/[^YYYY|YY|MM?|DD?|HH?|mm?|ss?|SS?S?]/g),h={Y:0,M:1,D:1,H:0,m:0,s:0,S:0};b=0;for(f=l.length;b<f;b++)for(d=l[b].match(/YYYY|YY|MM?|DD?|HH?|mm?|ss?|SS?S?/g)||[],c=0,n=d.length;c<n;c++)e=d[c],g=l[b].indexOf(e),0<=g&&(e=e.replace(/^(M|D|H|m|s)$/,"$1$1"),h[e.charAt(0)]=(k[b]|| | ||
"").slice(g,g+e.length)|0,"YY"===e&&(h[e.charAt(0)]+=70>h[e.charAt(0)]?2E3:1900));return h};c.format=function(a,c){var b,m,f=c.match(/(YYYY|YY|MMM|MM?|DD?|HH?|hh?|A|mm?|ss?|SS?S?|E|.)/g)||[],e=function(){return null};b=0;for(m=f.length;b<m;b++)f[b]=(d[f[b]]||e)(a)||f[b];return f.join("")};c.parse=function(a,c){var b=f(a,c);return new Date(b.Y,b.M-1,b.D,b.H,b.m,b.s,b.S)};c.addYears=function(a,c){var b=new Date(a.getTime());b.setFullYear(b.getFullYear()+c);return b};c.addMonths=function(a,c){var b= | ||
new Date(a.getTime());b.setMonth(b.getMonth()+c);return b};c.addDays=function(a,c){var b=new Date(a.getTime());b.setDate(b.getDate()+c);return b};c.addHours=function(a,c){var b=new Date(a.getTime());b.setHours(b.getHours()+c);return b};c.addMinutes=function(a,c){var b=new Date(a.getTime());b.setMinutes(b.getMinutes()+c);return b};c.addSeconds=function(a,c){var b=new Date(a.getTime());b.setSeconds(b.getSeconds()+c);return b};c.addMilliseconds=function(a,c){var b=new Date(a.getTime());b.setMilliseconds(b.getMilliseconds()+ | ||
c);return b};c.subtract=function(a,c){var b=a.getTime()-c.getTime();return{toMilliseconds:function(){return b},toSeconds:function(){return b/1E3|0},toMinutes:function(){return b/6E4|0},toHours:function(){return b/36E5|0},toDays:function(){return b/864E5|0}}};c.isValid=function(a,c){var b=f(a,c),d=new Date(b.Y,b.M-1,b.D,b.H,b.m,b.s,b.S);return b.Y===d.getFullYear()&&b.M-1===d.getMonth()&&b.D===d.getDate()&&b.H===d.getHours()&&b.m===d.getMinutes()&&b.s===d.getSeconds()&&b.S===d.getMilliseconds()};c.isLeapYear= | ||
function(a){a=a.getFullYear();return!(a%4)&&!!(a%100)||!(a%400)};"object"===typeof module&&"object"===typeof module.exports?module.exports=c:"function"===typeof define&&define.amd?define([],function(){return c}):k.date=c})(this); | ||
(function(p){var d={},k="en",f={en:{MMMM:"January February March April May June July August September October November December".split(" "),MMM:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dddd:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ddd:"Sun Mon Tue Wed Thu Fri Sat".split(" "),dd:"Su Mo Tu We Th Fr Sa".split(" "),A:["a.m.","p.m."],formats:{YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return this.formats.YYYY(a).slice(2)},MMMM:function(a){return this.MMMM[a.getMonth()]}, | ||
MMM:function(a){return this.MMM[a.getMonth()]},M:function(a){return""+(a.getMonth()+1)},MM:function(a){return("0"+this.formats.M(a)).slice(-2)},D:function(a){return""+a.getDate()},DD:function(a){return("0"+this.formats.D(a)).slice(-2)},H:function(a){return""+a.getHours()},HH:function(a){return("0"+this.formats.H(a)).slice(-2)},h:function(a){a=a.getHours()||12;return""+(12<a?a-12:a)},hh:function(a){return("0"+this.formats.h(a)).slice(-2)},A:function(a){return this.A[11<a.getHours()|0]},m:function(a){return""+ | ||
a.getMinutes()},mm:function(a){return("0"+this.formats.m(a)).slice(-2)},s:function(a){return""+a.getSeconds()},ss:function(a){return("0"+this.formats.s(a)).slice(-2)},SSS:function(a){return("00"+a.getMilliseconds()).slice(-3)},SS:function(a){return this.formats.SSS(a).slice(0,2)},S:function(a){return this.formats.SSS(a).slice(0,1)},dddd:function(a){return this.dddd[a.getDay()]},ddd:function(a){return this.ddd[a.getDay()]},dd:function(a){return this.dd[a.getDay()]},Z:function(a){a=a.utc?0:a.getTimezoneOffset(); | ||
var c="-";0>=a&&(c="+",a=-a);return c+("000"+(100*(a/60|0)+a%60)).slice(-4)}},parsers:{h:function(a,c){return(12===a?0:a)+12*c}}}},l=function(a,c){for(var b=0,g=a.length;b<g&&0!==c(a[b],b);b++);},n=function(a,c){var b=0,g,e,d,q=c.match(/YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|./g),h={Y:0,M:1,D:1,A:0,H:0,h:0,m:0,s:0,S:0};l(q,function(c){g=c.charAt(0);e=c.length;d=a.slice(b);/^(YYYY|YY|MM|DD|HH|hh|mm|ss|SS?S?)$/.test(c)?(h[g]=d.slice(0,e)|0,"YY"===c&&(h.Y+=70>h.Y?2E3:1900)):/^(M|D|H|h|m|s)$/.test(c)?(d= | ||
(d.match(/^\d\d?/)||[""])[0],e=d.length,h[g]=d|0):/^(MMMM?|A)$/.test(c)&&l(f[k][c],function(a,b){if(!d.indexOf(a))return h[g]="M"===g?b+1:b,e=a.length,0});b+=e});return h};d.format=function(a,c,b){var d=c.match(/(\[[^\[\]]*]|\[.*\][^\[]*\]|YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|ddd?d?|.)/g)||[],e=new Date(a.getTime()+(b?6E4*a.getTimezoneOffset():0)),m=f[k];e.utc=b;l(d,function(a,b){d[b]=(m.formats[a]||function(){}).call(m,e)||a.replace(/\[(.*)]/,"$1")});return d.join("")};d.parse=function(a,c,b){a=n(a, | ||
c);a=new Date(a.Y,a.M-1,a.D,a.H||f[k].parsers.h(a.h,a.A),a.m,a.s,a.S);return b?new Date(a.getTime()-6E4*a.getTimezoneOffset()):a};d.isValid=function(a,c){var b=n(a,c),d=b.H||f[k].parsers.h(b.h,b.A),e=new Date(b.Y,b.M-1,b.D,d,b.m,b.s,b.S);return b.Y===e.getFullYear()&&b.M-1===e.getMonth()&&b.D===e.getDate()&&d===e.getHours()&&b.m===e.getMinutes()&&b.s===e.getSeconds()&&b.S===e.getMilliseconds()};d.addYears=function(a,c){var b=new Date(a.getTime());b.setFullYear(b.getFullYear()+c);return b};d.addMonths= | ||
function(a,c){var b=new Date(a.getTime());b.setMonth(b.getMonth()+c);return b};d.addDays=function(a,c){return new Date(a.getTime()+864E5*c)};d.addHours=function(a,c){return new Date(a.getTime()+36E5*c)};d.addMinutes=function(a,c){return new Date(a.getTime()+6E4*c)};d.addSeconds=function(a,c){return new Date(a.getTime()+1E3*c)};d.addMilliseconds=function(a,c){return new Date(a.getTime()+c)};d.subtract=function(a,c){var b=a.getTime()-c.getTime();return{toMilliseconds:function(){return b},toSeconds:function(){return b/ | ||
1E3|0},toMinutes:function(){return b/6E4|0},toHours:function(){return b/36E5|0},toDays:function(){return b/864E5|0}}};d.isLeapYear=function(a){a=a.getFullYear();return!(a%4)&&!!(a%100)||!(a%400)};d.locale=function(a){a&&("object"===typeof module&&"object"===typeof module.exports&&require("./locale/"+a),k=a);return k};d.setLocales=function(a,c){var b=function(a,b){var c=function(){},d;c.prototype=b;c=new c;for(d in a)a.hasOwnProperty(d)&&(c[d]=a[d]);return c},d=f[a]||f.en,e=b(c,d);c.formats&&(e.formats= | ||
b(c.formats,d.formats));c.parsers&&(e.parsers=b(c.parsers,d.parsers));f[a]=e};"object"===typeof module&&"object"===typeof module.exports?module.exports=d:"function"===typeof define&&define.amd?define([],function(){return d}):p.date=d})(this); |
{ | ||
"name": "date-and-time", | ||
"version": "0.1.8", | ||
"description": "Date and time utilities for Node.js and browser", | ||
"version": "0.2.0", | ||
"description": "Minimalism DateTime utility for Node.js and the browser", | ||
"main": "date-and-time.js", | ||
"scripts": { | ||
"test": "mocha test/test.js && mocha-phantomjs test/test.html", | ||
"compile": "./compile" | ||
"test": "./test.sh", | ||
"compile": "./compile.sh" | ||
}, | ||
@@ -31,5 +31,6 @@ "repository": { | ||
"expect.js": "^0.3.1", | ||
"mocha": "^2.2.5", | ||
"mocha-phantomjs": "^3.5.3" | ||
"mocha": "^2.3.4", | ||
"mocha-phantomjs": "^3.6.0", | ||
"phantomjs": "1.9.7-15" | ||
} | ||
} |
278
README.md
# date-and-time [![Circle CI](https://circleci.com/gh/knowledgecode/date-and-time.svg?style=shield)](https://circleci.com/gh/knowledgecode/date-and-time) | ||
This is a date and time utility for Node.js and browser. | ||
This is a Minimalism DateTime utility for Node.js and the browser. | ||
## WHY | ||
Probably the most famous date library is [Moment.js](http://momentjs.com/). That is so great but has been bloated (12k gz). This will be good solution if you are good enough the most basic function and require a small tool. | ||
Probably the most famous DateTime library is [Moment.js](http://momentjs.com/), that is so great but has been bloated (13.8k gz). This will be a good solution if you require a small one. | ||
## Features | ||
- simple and slim. only 1.2k gz | ||
- not extending built-in objects | ||
- Minimalism. only 1.8k gz | ||
- multi language support | ||
- not extending built-in date object | ||
- legacy IE support. IE6+ | ||
@@ -21,5 +22,5 @@ | ||
``` | ||
browser: | ||
the browser: | ||
```html | ||
<script src="./src/date-and-time.min.js"></script> | ||
<script src="date-and-time.min.js"></script> | ||
``` | ||
@@ -32,63 +33,112 @@ | ||
``` | ||
browser: | ||
AMD: | ||
```javascript | ||
var date = window.date; | ||
require(['date-and-time'], function (date) { | ||
}); | ||
``` | ||
the browser: | ||
```javascript | ||
window.date; // global object | ||
``` | ||
## API | ||
### format(date, formatString) | ||
### format(dateObj, formatString[, utc]) | ||
- {object} dateObj - target date | ||
- {string} formatString - format string | ||
- {boolean} [utc] - output as UTC | ||
```javascript | ||
var now = new Date(); | ||
date.format(now, 'YYYY/MM/DD HH:mm:ss'); // => '2015/01/02 23:14:05' | ||
date.format(now, 'E MMM DD YYYY'); // => 'Fri Jan 02 2015' | ||
date.format(now, 'ddd MMM DD YYYY'); // => 'Fri Jan 02 2015' | ||
date.format(now, 'hh:mm A [GMT]Z'); // => '11:14 p.m. GMT-0800' | ||
date.format(now, 'hh:mm A [GMT]Z', true); // => '07:14 a.m. GMT+0000' | ||
``` | ||
| formatString | meaning | examples | | ||
|:-------------|:------------|:-----------| | ||
| YYYY | year | 2015, 1999 | | ||
| YY | year | 15, 99 | | ||
| MMM | month | Jan, Dec | | ||
| MM | month | 01, 12 | | ||
| M | month | 1, 12 | | ||
| DD | day | 02, 31 | | ||
| D | day | 2, 31 | | ||
| E | day of week | Fri, Sun | | ||
| HH | hour-24 | 23, 08 | | ||
| H | hour-24 | 23, 8 | | ||
| A | meridian | a.m., p.m. | | ||
| hh | hour-12 | 11, 08 | | ||
| h | hour-12 | 11, 8 | | ||
| mm | minute | 14, 07 | | ||
| m | minute | 14, 7 | | ||
| ss | second | 05, 10 | | ||
| s | second | 5, 10 | | ||
| SSS | millisecond | 753, 022 | | ||
| SS | millisecond | 75, 02 | | ||
| S | millisecond | 7, 0 | | ||
### parse(dateString, formatString) | ||
| formatString | meaning | example | | ||
|:-------------|:------------|:------------------| | ||
| YYYY | year | 2015, 1999 | | ||
| YY | year | 15, 99 | | ||
| MMMM | month | January, December | | ||
| MMM | month | Jan, Dec | | ||
| MM | month | 01, 12 | | ||
| M | month | 1, 12 | | ||
| DD | day | 02, 31 | | ||
| D | day | 2, 31 | | ||
| dddd | day of week | Friday, Sunday | | ||
| ddd | day of week | Fri, Sun | | ||
| dd | day of week | Fr, Su | | ||
| HH | hour-24 | 23, 08 | | ||
| H | hour-24 | 23, 8 | | ||
| A | meridiem | a.m., p.m. | | ||
| hh | hour-12 | 11, 08 | | ||
| h | hour-12 | 11, 8 | | ||
| mm | minute | 14, 07 | | ||
| m | minute | 14, 7 | | ||
| ss | second | 05, 10 | | ||
| s | second | 5, 10 | | ||
| SSS | millisecond | 753, 022 | | ||
| SS | millisecond | 75, 02 | | ||
| S | millisecond | 7, 0 | | ||
| Z | timezone | +0100, -0800 | | ||
#### NOTE | ||
`[...]` in the `formatString` will be a comment: | ||
```javascript | ||
date.parse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => Date object | ||
date.parse('02-01-2015', 'DD-MM-YYYY'); // => Date object | ||
date.format(new Date(), 'DD-[MM]-YYYY'); // => '02-MM-2015' | ||
date.format(new Date(), '[DD-[MM]-YYYY]'); // => 'DD-[MM]-YYYY' | ||
``` | ||
| formatString | meaning | examples | | ||
|:-------------|:------------|:-----------| | ||
| YYYY | year | 2015, 1999 | | ||
| YY | year | 15, 99 | | ||
| MM | month | 01, 12 | | ||
| M | month | 1, 12 | | ||
| DD | day | 02, 31 | | ||
| D | day | 2, 31 | | ||
| HH | hour-24 | 23, 08 | | ||
| H | hour-24 | 23, 8 | | ||
| mm | minute | 14, 07 | | ||
| m | minute | 14, 7 | | ||
| ss | second | 05, 10 | | ||
| s | second | 5, 10 | | ||
| SSS | millisecond | 753, 022 | | ||
| SS | millisecond | 75, 02 | | ||
| S | millisecond | 7, 0 | | ||
### addYears(date, years) | ||
### parse(dateString, formatString[, utc]) | ||
- {string} dateString - date string | ||
- {string} formatString - format string | ||
- {boolean} [utc] - input as UTC | ||
```javascript | ||
date.parse('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => date object | ||
date.parse('02-01-2015', 'DD-MM-YYYY'); // => date object | ||
date.parse('11:14:05 p.m.', 'hh:mm:ss A'); // => (23:14:05 GMT-0800) | ||
date.parse('11:14:05 p.m.', 'hh:mm:ss A', true); // => (15:14:05 GMT-0800) | ||
``` | ||
| formatString | meaning | example | | ||
|:-------------|:------------|:------------------| | ||
| YYYY | year | 2015, 1999 | | ||
| YY | year | 15, 99 | | ||
| MMMM | month | January, December | | ||
| MMM | month | Jan, Dec | | ||
| MM | month | 01, 12 | | ||
| M | month | 1, 12 | | ||
| DD | day | 02, 31 | | ||
| D | day | 2, 31 | | ||
| HH | hour-24 | 23, 08 | | ||
| H | hour-24 | 23, 8 | | ||
| hh | hour-12 | 11, 08 | | ||
| h | hour-12 | 11, 8 | | ||
| A | meridiem | a.m., p.m. | | ||
| mm | minute | 14, 07 | | ||
| m | minute | 14, 7 | | ||
| ss | second | 05, 10 | | ||
| s | second | 5, 10 | | ||
| SSS | millisecond | 753, 022 | | ||
| SS | millisecond | 75, 02 | | ||
| S | millisecond | 7, 0 | | ||
#### NOTE | ||
When using `hh` or `h` (hour-12), need to use together `A` (meridiem). | ||
### isValid(dateString, formatString) | ||
- {string} dateString - date string | ||
- {string} formatString - format string | ||
```javascript | ||
date.isValid('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => true | ||
date.isValid('02-29-2015', 'DD-MM-YYYY'); // => false | ||
``` | ||
`formatString` is the same as one of `parse`. | ||
### addYears(dateObj, years) | ||
- {object} dateObj - the augend | ||
- {number} years - the addend | ||
```javascript | ||
var now = new Date(); | ||
@@ -98,3 +148,5 @@ var next_year = date.addYears(now, 1); // => Date object | ||
### addMonths(date, months) | ||
### addMonths(dateObj, months) | ||
- {object} dateObj - the augend | ||
- {number} months - the addend | ||
```javascript | ||
@@ -105,3 +157,5 @@ var now = new Date(); | ||
### addDays(date, days) | ||
### addDays(dateObj, days) | ||
- {object} dateObj - the augend | ||
- {number} days - the addend | ||
```javascript | ||
@@ -112,3 +166,5 @@ var now = new Date(); | ||
### addHours(date, hours) | ||
### addHours(dateObj, hours) | ||
- {object} dateObj - the augend | ||
- {number} hours - the addend | ||
```javascript | ||
@@ -119,3 +175,5 @@ var now = new Date(); | ||
### addMinutes(date, minutes) | ||
### addMinutes(dateObj, minutes) | ||
- {object} dateObj - the augend | ||
- {number} minutes - the addend | ||
```javascript | ||
@@ -126,3 +184,5 @@ var now = new Date(); | ||
### addSeconds(date, seconds) | ||
### addSeconds(dateObj, seconds) | ||
- {object} dateObj - the augend | ||
- {number} seconds - the addend | ||
```javascript | ||
@@ -133,3 +193,5 @@ var now = new Date(); | ||
### addMilliseconds(date, milliseconds) | ||
### addMilliseconds(dateObj, milliseconds) | ||
- {object} dateObj - the augend | ||
- {number} milliseconds -the addend | ||
```javascript | ||
@@ -140,22 +202,18 @@ var now = new Date(); | ||
### subtract(date1, date2) | ||
### subtract(dateObj1, dateObj2) | ||
- {object} date1 - the minuend | ||
- {object} date2 - the subtrahend | ||
```javascript | ||
var today = new Date(2015, 0, 2); | ||
var yesterday = new Date(2015, 0, 1); | ||
date.subtract(today, yesterday).toDays(); // => 1 | ||
date.subtract(today, yesterday).toHours(); // => 24 | ||
date.subtract(today, yesterday).toMinutes(); // => 1440 | ||
date.subtract(today, yesterday).toSeconds(); // => 86400 | ||
date.subtract(today, yesterday).toDays(); // => 1 | ||
date.subtract(today, yesterday).toHours(); // => 24 | ||
date.subtract(today, yesterday).toMinutes(); // => 1440 | ||
date.subtract(today, yesterday).toSeconds(); // => 86400 | ||
date.subtract(today, yesterday).toMilliseconds(); // => 86400000 | ||
``` | ||
### isValid(dateString, formatString) | ||
### isLeapYear(dateObj) | ||
- {object} dateObj - target date | ||
```javascript | ||
date.isValid('2015/01/02 23:14:05', 'YYYY/MM/DD HH:mm:ss'); // => true | ||
date.isValid('02-29-2015', 'DD-MM-YYYY'); // => false | ||
``` | ||
`formatString` is the same as one of `parse`. | ||
### isLeapYear(date) | ||
```javascript | ||
var date1 = new Date(2015, 0, 2); | ||
@@ -168,42 +226,55 @@ var date2 = new Date(2012, 0, 2); | ||
## Locale | ||
Months, day of week, and meridian are written in English. If you want to change language, rewrite them. | ||
It supports the following languages for now: | ||
- Arabic (ar) | ||
- Bengali (bn) | ||
- Chinese (zh-cn) | ||
- Chinese (zh-tw) | ||
- English (en) | ||
- French (fr) | ||
- German (de) | ||
- Hindi (hi) | ||
- Italian (it) | ||
- Japanese (ja) | ||
- Korean (ko) | ||
- Portuguese (pt) | ||
- Russian (ru) | ||
- Spanish (es) | ||
Month, day of week, and meridiem are used English by default. If you want to use other languages, can switch to them as follows: | ||
Node.js: | ||
```javascript | ||
var date = require('date-and-time'); | ||
// French | ||
date.month = ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']; | ||
date.dayOfWeek = ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.']; | ||
date.format(new Date(), 'E MMM DD YYYY'); // => ven. janv. 02 2015 | ||
// Japanese | ||
date.dayOfWeek = ['日', '月', '火', '水', '木', '金', '土']; | ||
date.hour12.meridian = ['午前', '午後']; | ||
date.format(new Date(), 'YYYY年MM月DD日(E) Ahh時'); // => 2015年01月02日(金) 午前10時 | ||
date.locale('fr'); // French | ||
date.format(new Date(), 'dddd DD MMMM'); // => 'lundi 11 janvier' | ||
``` | ||
AMD: | ||
```javascript | ||
require(['date-and-time', 'locale/de'], function (date) { | ||
date.locale('de'); // German | ||
date.format(new Date(), 'dddd DD MMMM'); // => 'Montag 11 Januar' | ||
}); | ||
``` | ||
the browser: | ||
```html | ||
<script src="date-and-time.min.js"></script> | ||
<script src="locale/zh-cn.js"></script> | ||
<script> | ||
date.locale('zh-cn'); // Chinese | ||
date.format(new Date(), 'dddd DD MMMM'); // => '星期一 11 一月' | ||
</script> | ||
``` | ||
## For developers in Japan (about [12-hour clock](http://en.wikipedia.org/wiki/12-hour_clock)) | ||
日本では時刻を午前と午後に分ける12時間制の表現が英米式と異なるばかりでなく、それ自体に曖昧さがあり、しばしば混乱が生じます。 | ||
そのため日本のシステム開発の現場では多くの場合24時間制が用いられるかと思いますが、念のため12時間制を用いる必要が生じた場合の対策方法について説明します。 | ||
まず、日本での12時間制についてはWikipediaの[こちらのページ](http://ja.wikipedia.org/wiki/%E5%8D%88%E5%89%8D%E3%81%A8%E5%8D%88%E5%BE%8C)で詳しく解説されています。 | ||
`date-and-time`では英米式の12時間制をデフォルト実装しているため、日本向けにロジックのカスタマイズが必要です。以下に例をご紹介します。 | ||
## Customizing | ||
You can not only switch to other languages, but can customize them as you want: | ||
```javascript | ||
var date = require('date-and-time'); | ||
var now = new Date(); | ||
date.format(now, 'h:m A'); // => '12:34 p.m.' | ||
// 時刻を12時間制に変換するロジックの書き換え | ||
date.hour12.h = function (d) { | ||
var h = d.getHours(); | ||
return h > 11 ? h - 12 : h; | ||
}; | ||
date.setLocales('en', { | ||
A: ['AM', 'PM'] | ||
}); | ||
// 午前/午後を返すロジックの書き換え | ||
date.hour12.A = function (d) { | ||
return this.meridian[d.getHours() > 11 | 0]; | ||
}; | ||
date.format(now, 'h:m A'); // => '12:34 PM' | ||
``` | ||
上記の例はWikipediaで説明されている「日本時計協会」方式です。「日本式」はロジックがより複雑になるため割愛させていただきます。 | ||
## Browser Support | ||
@@ -214,1 +285,2 @@ Chrome, Firefox, Safari, Opera, and Internet Explorer 6+. | ||
MIT | ||
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
49223
18
810
276
4
2
2