date-and-time
Advanced tools
Comparing version 0.10.0 to 0.11.0
@@ -156,19 +156,32 @@ /** | ||
/** | ||
* compiling a format string for the parser | ||
* @param {string} formatString - a format string | ||
* @returns {Array.<string>} a compiled object | ||
*/ | ||
date.compile = function (formatString) { | ||
var re = /([A-Za-z])\1*|./g, keys, pattern = [formatString]; | ||
formatString = formatString.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]/g, function (str) { | ||
return str.replace(/./g, ' ').slice(2); | ||
}); | ||
while ((keys = re.exec(formatString))) { | ||
pattern[pattern.length] = keys[0]; | ||
} | ||
return pattern; | ||
}; | ||
/** | ||
* pre-parsing a date string | ||
* @param {string} dateString - a date string | ||
* @param {string} formatString - a format string | ||
* @param {string|Array.<string>} arg - a format string or a compiled object | ||
* @returns {Object} a date structure | ||
*/ | ||
date.preparse = function (dateString, formatString) { | ||
var parser = locales[lang].parser, | ||
re = /([A-Za-z])\1*|./g, | ||
keys, token, result, offset = 0, | ||
date.preparse = function (dateString, arg) { | ||
var parser = locales[lang].parser, token, result, offset = 0, | ||
pattern = typeof arg === 'string' ? date.compile(arg) : arg, formatString = pattern[0], | ||
dt = { Y: 1970, M: 1, D: 1, H: 0, A: 0, h: 0, m: 0, s: 0, S: 0, _index: 0, _length: 0, _match: 0 }; | ||
dateString = parser.pre(dateString); | ||
formatString = formatString.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]/g, function (str) { | ||
return str.replace(/./g, ' ').slice(2); | ||
}); | ||
while ((keys = re.exec(formatString))) { | ||
token = keys[0]; | ||
for (var i = 1, len = pattern.length; i < len; i++) { | ||
token = pattern[i]; | ||
if (parser[token]) { | ||
@@ -196,8 +209,8 @@ result = parser[token](dateString.slice(offset), formatString); | ||
* validation | ||
* @param {Object|string} arg - a date structure or a date string | ||
* @param {string} [formatString] - a format string | ||
* @param {Object|string} arg1 - a date structure or a date string | ||
* @param {string|Array.<string>} [arg2] - a format string or a compiled object | ||
* @returns {boolean} whether the date string is a valid date | ||
*/ | ||
date.isValid = function (arg, formatString) { | ||
var dt = typeof arg === 'string' ? date.preparse(arg, formatString) : arg, | ||
date.isValid = function (arg1, arg2) { | ||
var dt = typeof arg1 === 'string' ? date.preparse(arg1, arg2) : arg1, | ||
last = [31, 28 + date.isLeapYear(dt.Y) | 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][dt.M - 1]; | ||
@@ -215,8 +228,8 @@ | ||
* @param {string} dateString - a date string | ||
* @param {string} formatString - a format string | ||
* @param {string|Array.<string>} arg - a format string or a compiled object | ||
* @param {boolean} [utc] - input as UTC | ||
* @returns {Date} a constructed date | ||
*/ | ||
date.parse = function (dateString, formatString, utc) { | ||
var dt = date.preparse(dateString, formatString), dateObj; | ||
date.parse = function (dateString, arg, utc) { | ||
var dt = date.preparse(dateString, arg), dateObj; | ||
@@ -223,0 +236,0 @@ if (date.isValid(dt)) { |
/* | ||
date-and-time.js (c) KNOWLEDGECODE | MIT | ||
*/ | ||
(function(p){var d={},l={},g={},h="en",q={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."]},r={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return("0"+a.getFullYear()).slice(-2)}, | ||
(function(r){var b={},m={},k={},h="en",t={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."]},u={YYYY:function(a){return("000"+a.getFullYear()).slice(-4)},YY:function(a){return("0"+a.getFullYear()).slice(-2)}, | ||
Y:function(a){return""+a.getFullYear()},MMMM:function(a){return this.res.MMMM[a.getMonth()]},MMM:function(a){return this.res.MMM[a.getMonth()]},MM:function(a){return("0"+(a.getMonth()+1)).slice(-2)},M:function(a){return""+(a.getMonth()+1)},DD:function(a){return("0"+a.getDate()).slice(-2)},D:function(a){return""+a.getDate()},HH:function(a){return("0"+a.getHours()).slice(-2)},H:function(a){return""+a.getHours()},A:function(a){return this.res.A[11<a.getHours()|0]},hh:function(a){return("0"+(a.getHours()% | ||
12||12)).slice(-2)},h:function(a){return""+(a.getHours()%12||12)},mm:function(a){return("0"+a.getMinutes()).slice(-2)},m:function(a){return""+a.getMinutes()},ss:function(a){return("0"+a.getSeconds()).slice(-2)},s:function(a){return""+a.getSeconds()},SSS:function(a){return("00"+a.getMilliseconds()).slice(-3)},SS:function(a){return("0"+(a.getMilliseconds()/10|0)).slice(-2)},S:function(a){return""+(a.getMilliseconds()/100|0)},dddd:function(a){return this.res.dddd[a.getDay()]},ddd:function(a){return this.res.ddd[a.getDay()]}, | ||
dd:function(a){return this.res.dd[a.getDay()]},Z:function(a){a=a.utc?0:a.getTimezoneOffset()/.6;return(0<a?"-":"+")+("000"+Math.abs(a-a%100*.4)).slice(-4)},post:function(a){return a}},t={YYYY:function(a){return this.exec(/^\d{4}/,a)},YY:function(a){a=this.exec(/^\d\d/,a);a.value+=70>a.value?2E3:100>a.value?1900:0;return a},Y:function(a){return this.exec(/^\d{1,4}/,a)},MMMM:function(a){a=this.find(this.res.MMMM,a);a.value++;return a},MMM:function(a){a=this.find(this.res.MMM,a);a.value++;return a}, | ||
dd:function(a){return this.res.dd[a.getDay()]},Z:function(a){a=a.utc?0:a.getTimezoneOffset()/.6;return(0<a?"-":"+")+("000"+Math.abs(a-a%100*.4)).slice(-4)},post:function(a){return a}},w={YYYY:function(a){return this.exec(/^\d{4}/,a)},YY:function(a){a=this.exec(/^\d\d/,a);a.value+=70>a.value?2E3:100>a.value?1900:0;return a},Y:function(a){return this.exec(/^\d{1,4}/,a)},MMMM:function(a){a=this.find(this.res.MMMM,a);a.value++;return a},MMM:function(a){a=this.find(this.res.MMM,a);a.value++;return a}, | ||
MM:function(a){return this.exec(/^\d\d/,a)},M:function(a){return this.exec(/^\d\d?/,a)},DD:function(a){return this.exec(/^\d\d/,a)},D:function(a){return this.exec(/^\d\d?/,a)},HH:function(a){return this.exec(/^\d\d/,a)},H:function(a){return this.exec(/^\d\d?/,a)},A:function(a){return this.find(this.res.A,a)},hh:function(a){return this.exec(/^\d\d/,a)},h:function(a){return this.exec(/^\d\d?/,a)},mm:function(a){return this.exec(/^\d\d/,a)},m:function(a){return this.exec(/^\d\d?/,a)},ss:function(a){return this.exec(/^\d\d/, | ||
a)},s:function(a){return this.exec(/^\d\d?/,a)},SSS:function(a){return this.exec(/^\d{1,3}/,a)},SS:function(a){a=this.exec(/^\d\d?/,a);a.value*=10;return a},S:function(a){a=this.exec(/^\d/,a);a.value*=100;return a},h12:function(a,c){return(12===a?0:a)+12*c},exec:function(a,c){var b=(a.exec(c)||[""])[0];return{value:b|0,length:b.length}},find:function(a,c){for(var b=-1,d=0,e=0,k=a.length,f;e<k;e++)f=a[e],!c.indexOf(f)&&f.length>d&&(b=e,d=f.length);return{value:b,length:d}},pre:function(a){return a}}, | ||
n=function(a,c,b){var d=function(a,b,c){var d=function(a){a&&(this.res=a)};d.prototype=a;d.prototype.constructor=d;a=new d(c);for(var e in b||{})b.hasOwnProperty(e)&&(c=b[e],a[e]=c.slice?c.slice():c);return a},e={res:d(c.res,b.res)};e.formatter=d(c.formatter,b.formatter,e.res);e.parser=d(c.parser,b.parser,e.res);l[a]=e};d.format=function(a,c,b){var m=d.addMinutes(a,b?a.getTimezoneOffset():0),e=l[h].formatter;m.utc=b;return c.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]|([A-Za-z])\1*|./g,function(a){return e[a]? | ||
e.post(e[a](m,c)):a.replace(/\[(.*)]/,"$1")})};d.preparse=function(a,c){var b=l[h].parser,d=/([A-Za-z])\1*|./g,e,k=0,f={Y:1970,M:1,D:1,H:0,A:0,h:0,m:0,s:0,S:0,_index:0,_length:0,_match:0};a=b.pre(a);for(c=c.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]/g,function(a){return a.replace(/./g," ").slice(2)});e=d.exec(c);)if(e=e[0],b[e]){var g=b[e](a.slice(k),c);if(!g.length)break;k+=g.length;f[e.charAt(0)]=g.value;f._match++}else if(e===a.charAt(k)||" "===e)k++;else break;f.H=f.H||b.h12(f.h,f.A);f._index=k;f._length= | ||
a.length;return f};d.isValid=function(a,c){var b="string"===typeof a?d.preparse(a,c):a,g=[31,28+d.isLeapYear(b.Y)|0,31,30,31,30,31,31,30,31,30,31][b.M-1];return!(1>b._index||1>b._length||b._index-b._length||1>b._match||1>b.Y||9999<b.Y||1>b.M||12<b.M||1>b.D||b.D>g||23<b.H||0>b.H||59<b.m||0>b.m||59<b.s||0>b.s||999<b.S||0>b.S)};d.parse=function(a,c,b){a=d.preparse(a,c);return d.isValid(a)?(a.M-=100>a.Y?22801:1,b=b?new Date(Date.UTC(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)):new Date(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)): | ||
new Date(NaN)};d.addYears=function(a,c){return d.addMonths(a,12*c)};d.addMonths=function(a,c){var b=new Date(a.getTime());b.setMonth(b.getMonth()+c);return b};d.addDays=function(a,c){var b=new Date(a.getTime());b.setDate(b.getDate()+c);return b};d.addHours=function(a,c){return d.addMilliseconds(a,36E5*c)};d.addMinutes=function(a,c){return d.addMilliseconds(a,6E4*c)};d.addSeconds=function(a,c){return d.addMilliseconds(a,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){return!(a%4)&&!!(a%100)||!(a%400)};d.isSameDay=function(a,c){return d.format(a,"YYYYMMDD")===d.format(c,"YYYYMMDD")};d.locale=function(a,c){c?n(a,{res:q,formatter:r,parser:t},c):a&&(h=a);return h};d.extend=function(a){n(h,l[h],a)};d.plugin=function(a, | ||
c){g[a]=g[a]||c;!c&&g[a]&&d.extend(g[a])};d.locale(h,{});"object"===typeof module&&"object"===typeof module.exports?module.exports=d:"function"===typeof define&&define.amd?define([],function(){return d}):p.date=d})(this); | ||
a)},s:function(a){return this.exec(/^\d\d?/,a)},SSS:function(a){return this.exec(/^\d{1,3}/,a)},SS:function(a){a=this.exec(/^\d\d?/,a);a.value*=10;return a},S:function(a){a=this.exec(/^\d/,a);a.value*=100;return a},h12:function(a,d){return(12===a?0:a)+12*d},exec:function(a,d){var c=(a.exec(d)||[""])[0];return{value:c|0,length:c.length}},find:function(a,d){for(var c=-1,b=0,e=0,v=a.length,f;e<v;e++)f=a[e],!d.indexOf(f)&&f.length>b&&(c=e,b=f.length);return{value:c,length:b}},pre:function(a){return a}}, | ||
n=function(a,d,c){var b=function(a,c,d){var b=function(a){a&&(this.res=a)};b.prototype=a;b.prototype.constructor=b;a=new b(d);for(var e in c||{})c.hasOwnProperty(e)&&(d=c[e],a[e]=d.slice?d.slice():d);return a},e={res:b(d.res,c.res)};e.formatter=b(d.formatter,c.formatter,e.res);e.parser=b(d.parser,c.parser,e.res);m[a]=e};b.format=function(a,d,c){var g=b.addMinutes(a,c?a.getTimezoneOffset():0),e=m[h].formatter;g.utc=c;return d.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]|([A-Za-z])\1*|./g,function(a){return e[a]? | ||
e.post(e[a](g,d)):a.replace(/\[(.*)]/,"$1")})};b.compile=function(a){var d=/([A-Za-z])\1*|./g,c,b=[a];for(a=a.replace(/\[[^\[\]]*]|\[.*\][^\[]*\]/g,function(a){return a.replace(/./g," ").slice(2)});c=d.exec(a);)b[b.length]=c[0];return b};b.preparse=function(a,d){var c=m[h].parser,g=0,e="string"===typeof d?b.compile(d):d,k=e[0],f={Y:1970,M:1,D:1,H:0,A:0,h:0,m:0,s:0,S:0,_index:0,_length:0,_match:0};a=c.pre(a);for(var p=1,n=e.length;p<n;p++){var l=e[p];if(c[l]){var q=c[l](a.slice(g),k);if(!q.length)break; | ||
g+=q.length;f[l.charAt(0)]=q.value;f._match++}else if(l===a.charAt(g)||" "===l)g++;else break}f.H=f.H||c.h12(f.h,f.A);f._index=g;f._length=a.length;return f};b.isValid=function(a,d){var c="string"===typeof a?b.preparse(a,d):a,g=[31,28+b.isLeapYear(c.Y)|0,31,30,31,30,31,31,30,31,30,31][c.M-1];return!(1>c._index||1>c._length||c._index-c._length||1>c._match||1>c.Y||9999<c.Y||1>c.M||12<c.M||1>c.D||c.D>g||23<c.H||0>c.H||59<c.m||0>c.m||59<c.s||0>c.s||999<c.S||0>c.S)};b.parse=function(a,d,c){a=b.preparse(a, | ||
d);return b.isValid(a)?(a.M-=100>a.Y?22801:1,c=c?new Date(Date.UTC(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)):new Date(a.Y,a.M,a.D,a.H,a.m,a.s,a.S)):new Date(NaN)};b.addYears=function(a,d){return b.addMonths(a,12*d)};b.addMonths=function(a,b){var c=new Date(a.getTime());c.setMonth(c.getMonth()+b);return c};b.addDays=function(a,b){var c=new Date(a.getTime());c.setDate(c.getDate()+b);return c};b.addHours=function(a,d){return b.addMilliseconds(a,36E5*d)};b.addMinutes=function(a,d){return b.addMilliseconds(a,6E4* | ||
d)};b.addSeconds=function(a,d){return b.addMilliseconds(a,1E3*d)};b.addMilliseconds=function(a,b){return new Date(a.getTime()+b)};b.subtract=function(a,b){var c=a.getTime()-b.getTime();return{toMilliseconds:function(){return c},toSeconds:function(){return c/1E3|0},toMinutes:function(){return c/6E4|0},toHours:function(){return c/36E5|0},toDays:function(){return c/864E5|0}}};b.isLeapYear=function(a){return!(a%4)&&!!(a%100)||!(a%400)};b.isSameDay=function(a,d){return b.format(a,"YYYYMMDD")===b.format(d, | ||
"YYYYMMDD")};b.locale=function(a,b){b?n(a,{res:t,formatter:u,parser:w},b):a&&(h=a);return h};b.extend=function(a){n(h,m[h],a)};b.plugin=function(a,d){k[a]=k[a]||d;!d&&k[a]&&b.extend(k[a])};b.locale(h,{});"object"===typeof module&&"object"===typeof module.exports?module.exports=b:"function"===typeof define&&define.amd?define([],function(){return b}):r.date=b})(this); |
{ | ||
"name": "date-and-time", | ||
"version": "0.10.0", | ||
"version": "0.11.0", | ||
"description": "A Minimalist DateTime utility for Node.js and the browser", | ||
@@ -5,0 +5,0 @@ "main": "date-and-time.js", |
@@ -109,3 +109,3 @@ # Plugins | ||
- It is not able to add new alphabet's token to the parser. | ||
- To the parser, it is not able to add new alphabet's token. | ||
@@ -115,3 +115,3 @@ ```javascript | ||
'YYY' // This is OK because a `Y` token is existing in the parser. | ||
'SSS' // This is modifying, not adding because the same token is existing. | ||
'SSS' // This is modifying, not adding. Because the same token is existing. | ||
``` | ||
@@ -192,2 +192,19 @@ | ||
### WIP | ||
--- | ||
## Direct Replacement | ||
All you are enough to change a bit the default behavior of this library? You are not going to write a plugin? Of course, you could replace the default behavior directly like this: | ||
```javascript | ||
date.format(new Date(), 'hh:mm A'); // => 11:20 p.m. | ||
// Replace the words that a.m./p.m. to AM/PM. | ||
date.extend({ res: { A: ['AM', 'PM'] } }); | ||
date.format(new Date(), 'hh:mm A'); // => 11:20 PM | ||
``` | ||
### Hint | ||
The `extend()` can be regarded as an unnamed `plugin()`. |
@@ -5,3 +5,3 @@ # date-and-time | ||
This library is just a function collection for manipulating JS date and time. It's tiny, simple, easy to learn. | ||
This library is a minimalist collection of functions for manipulating JS date and time. It's tiny, simple, easy to learn. | ||
@@ -15,5 +15,5 @@ ## Why | ||
- Minimalist. Less than 2k. (minified and gzipped) | ||
- Extensible. Plugin system support. | ||
- Multi language support. | ||
- Universal / Isomorphic. Wherever JS runtime works. | ||
- Multi language support. | ||
- Not extending built-in Date object. | ||
- Older browser support. Even works on IE6. :) | ||
@@ -37,2 +37,27 @@ | ||
- 0.11.0 | ||
- Added a `compile()` function that precompiling a date string for the parser. In case of processing many date string with one format, by using this function, you could be able to get results faster than before. | ||
```javascript | ||
// We have passed a string format at the 2nd parameter every time when calling the parse() function. | ||
date.parse('Mar. 22 2019 2:54:21 p.m.', 'MMM. D YYYY h:m:s A'); | ||
date.parse('Jul. 27 2019 4:15:24 a.m.', 'MMM. D YYYY h:m:s A'); | ||
date.parse('Dec. 25 2019 3:51:11 a.m.', 'MMM. D YYYY h:m:s A'); | ||
// You can precompile the string format. | ||
const pattern = date.compile('MMM. D YYYY h:m:s A'); | ||
// The parse() will be able to finish faster than passing the format string every time. | ||
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern); | ||
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern); | ||
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern); | ||
``` | ||
```javascript | ||
const pattern = date.compile('MMM. D YYYY h:m:s A'); | ||
// The isValid() will also too. | ||
date.isValid('Mar. 22 2019 2:54:21 p.m.', pattern); | ||
``` | ||
- 0.10.0 | ||
@@ -56,4 +81,4 @@ - The `YYYY` token has come to require 4 digits in the `parse()`, the `preparse()` and the `isValid()` (**Breaking Change**). | ||
```javascript | ||
date.parse('31-12-123', 'DD-MM-Y'); // good | ||
date.parse('31-12-3', 'DD-MM-Y'); // good | ||
date.parse('31-12-123', 'DD-MM-Y'); // Good | ||
date.parse('31-12-3', 'DD-MM-Y'); // Good | ||
``` | ||
@@ -170,7 +195,25 @@ | ||
### parse(dateString, formatString[, utc]) | ||
### compile(formatString) | ||
- Compiling a format string for the parser. | ||
- @param {**string**} formatString - a format string | ||
- @returns {**Array.\<string\>**} a compiled object | ||
```javascript | ||
const pattern = date.compile('MMM. D YYYY h:m:s A'); | ||
date.parse('Mar. 22 2019 2:54:21 p.m.', pattern); | ||
date.parse('Jul. 27 2019 4:15:24 a.m.', pattern); | ||
date.parse('Dec. 25 2019 3:51:11 a.m.', pattern); | ||
``` | ||
If you are going to call the `parse()` or the `isValid()` many times with one string format, recommended to precompile and reuse it for performance. | ||
--- | ||
### parse(dateString, arg[, utc]) | ||
- Parsing a date string. | ||
- @param {**string**} dateString - a date string | ||
- @param {**string**} formatString - a format string | ||
- @param {**string|Array.\<string\>**} arg - a format string or a compiled object | ||
- @param {**boolean**} [utc] - input as UTC | ||
@@ -299,7 +342,7 @@ - @returns {**Date**} a constructed date | ||
### preparse(dateString, formatString) | ||
### preparse(dateString, arg) | ||
- Pre-parsing a date string. | ||
- @param {**string**} dateString - a date string | ||
- @param {**string**} formatString - a format string | ||
- @param {**string|Array.\<string\>**} arg - a format string or a compiled object | ||
- @returns {**Object**} a date structure | ||
@@ -328,11 +371,11 @@ | ||
This object shows a parsing result. You will be able to tell from it how the date string was parsed(, or why the parsing was failed). | ||
This object shows a parsing result. You would be able to tell from it how the date string was parsed(, or why the parsing was failed). | ||
--- | ||
### isValid(arg[, formatString]) | ||
### isValid(arg1[, arg2]) | ||
- Validation. | ||
- @param {**Object**|**string**} arg - a date structure or a date string | ||
- @param {**string**} [formatString] - a format string | ||
- @param {**Object|string**} arg1 - a date structure or a date string | ||
- @param {**string|Array.\<string\>**} [arg2] - a format string or a compiled object | ||
- @returns {**boolean**} whether the date string is a valid date | ||
@@ -339,0 +382,0 @@ |
112333
42
1813
587