diff --git a/PLUGINS.md b/PLUGINS.md index f12265e..0b8d0dd 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -380,6 +380,45 @@ In the first example above, if you want `parseTZ()` to parse the time as PST, yo date.parse('Nov 7 2021 1:59:59 -0800', 'MMM D YYYY H:mm:ss Z'); // => 2021-11-07T09:59:59Z ``` +#### Token Extension + +This plugin also adds tokens for time zone name to the formatter. + +**formatter:** + +| token | meaning | output examples | +|:------|:----------------------------|:----------------------| +| z | time zone name abbreviation | PST, EST | +| zz | time zone name | Pacific Standard Time | + +The `z` and `zz` are lowercase. Also, currently it does not support output other than English. + +**parser:** + +There is no change. + +```javascript +const date = require('date-and-time'); +// Import "timezone" plugin. +const timezone = require('date-and-time/plugin/timezone'); + +// Apply "timezone" plugin to the library. +date.plugin(timezone); + +const d1 = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); +date.format(d1, 'MMMM DD YYYY H:mm:ss.SSS zz'); +// March 14 2021 1:59:59.999 Pacific Standard Time + +date.format(d1, 'MMMM DD YYYY H:mm:ss.SSS zz', true); +// March 14 2021 9:59:59.999 Coordinated Universal Time + +date.formatTZ(d1, 'MMMM DD YYYY H:mm:ss.SSS z', 'Asia/Tokyo'); +// March 14 2021 18:59:59.999 JST + +// Transforms the date string from EST (Eastern Standard Time) to PDT (Pacific Daylight Time). +date.transform('2021-11-07T03:59:59 UTC-0500', 'YYYY-MM-DD[T]HH:mm:ss [UTC]Z', 'MMMM D YYYY H:mm:ss z'); +// November 7 2021 1:59:59 PDT +``` --- ### two-digit-year diff --git a/README.md b/README.md index 78ec675..ead0c7e 100644 --- a/README.md +++ b/README.md @@ -25,16 +25,16 @@ npm i date-and-time ## Recent Changes +- 3.4.0 + - Added `zz` (time zone name) and `z` (time zone name abbreviation) tokens to the `timezone` plugin. + - Fixed an issue where token extensions by other plugins were not reflected in functions provided by the `timezone` plugin. + - 3.3.0 - Refactored `format()`, `isValid()`, and `preparse()`, further improved performance. - 3.2.0 - Refactored `compile()`, `format()`, and `preparse()`, slightly improved performance. -- 3.1.1 - - Fixed an issue where `format()` could output incorrect UTC times in locales with daylight savings time. - - Refactored `formatTZ()` of `timezone` plugin. - ## Usage - ES Modules: @@ -179,12 +179,14 @@ Available tokens and their meanings are as follows: You can also use the following tokens by importing plugins. See [PLUGINS.md](./PLUGINS.md) for details. -| token | meaning | examples of output | -|:------|:-------------------------------------|:-------------------| -| DDD | ordinal notation of date | 1st, 2nd, 3rd | -| AA | meridiem (uppercase with ellipsis) | A.M., P.M. | -| a | meridiem (lowercase) | am, pm | -| aa | meridiem (lowercase with ellipsis) | a.m., p.m. | +| token | meaning | examples of output | +|:------|:-------------------------------------|:----------------------| +| DDD | ordinal notation of date | 1st, 2nd, 3rd | +| AA | meridiem (uppercase with ellipsis) | A.M., P.M. | +| a | meridiem (lowercase) | am, pm | +| aa | meridiem (lowercase with ellipsis) | a.m., p.m. | +| z | time zone name abbreviation | PST, EST | +| zz | time zone name | Pacific Standard Time | #### Note 1. Comments diff --git a/date-and-time.d.ts b/date-and-time.d.ts index 2c977dc..e85a8b2 100644 --- a/date-and-time.d.ts +++ b/date-and-time.d.ts @@ -296,7 +296,7 @@ export type Extension = { export function extend(extension: Extension): void; /** Plugin installer */ -export type Plugin = (proto: unknown, localized_proto?: unknown) => string; +export type Plugin = (proto: unknown, date?: unknown) => string; /** * Importing plugins diff --git a/date-and-time.js b/date-and-time.js index b6915fb..560c794 100644 --- a/date-and-time.js +++ b/date-and-time.js @@ -142,7 +142,6 @@ _formatter: _formatter, _parser: _parser }, - localized_proto, date; /** @@ -177,6 +176,7 @@ u.getMilliseconds = u.getUTCMilliseconds; u.getDay = u.getUTCDay; u.getTimezoneOffset = function () { return 0; }; + u.getTimezoneName = function () { return 'UTC'; }; return u; } return dateObj; @@ -453,7 +453,6 @@ } }; - localized_proto = extend(proto); date = extend(proto); /** @@ -474,8 +473,8 @@ var formatter = extend(_formatter, extension.formatter, true, res); var parser = extend(_parser, extension.parser, true, res); - date._formatter = localized_proto._formatter = formatter; - date._parser = localized_proto._parser = parser; + date._formatter = formatter; + date._parser = parser; for (var plugin in plugins) { date.extend(plugins[plugin]); @@ -512,7 +511,7 @@ var install = typeof plugin === 'function' ? plugin : date.plugin[plugin]; if (install) { - date.extend(plugins[install(proto, localized_proto)] || {}); + date.extend(plugins[install(proto, date)] || {}); } }; diff --git a/date-and-time.min.js b/date-and-time.min.js index 6990dd6..3444bc1 100644 --- a/date-and-time.min.js +++ b/date-and-time.min.js @@ -1,4 +1,4 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).date=t()}(this,(function(){"use strict"; /** * @preserve date-and-time (c) KNOWLEDGECODE | MIT - */var e,t,n={},r={},i="en",u={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:["AM","PM"]},s={YYYY:function(e){return("000"+e.getFullYear()).slice(-4)},YY:function(e){return("0"+e.getFullYear()).slice(-2)},Y:function(e){return""+e.getFullYear()},MMMM:function(e){return this.res.MMMM[e.getMonth()]},MMM:function(e){return this.res.MMM[e.getMonth()]},MM:function(e){return("0"+(e.getMonth()+1)).slice(-2)},M:function(e){return""+(e.getMonth()+1)},DD:function(e){return("0"+e.getDate()).slice(-2)},D:function(e){return""+e.getDate()},HH:function(e){return("0"+e.getHours()).slice(-2)},H:function(e){return""+e.getHours()},A:function(e){return this.res.A[e.getHours()>11|0]},hh:function(e){return("0"+(e.getHours()%12||12)).slice(-2)},h:function(e){return""+(e.getHours()%12||12)},mm:function(e){return("0"+e.getMinutes()).slice(-2)},m:function(e){return""+e.getMinutes()},ss:function(e){return("0"+e.getSeconds()).slice(-2)},s:function(e){return""+e.getSeconds()},SSS:function(e){return("00"+e.getMilliseconds()).slice(-3)},SS:function(e){return("0"+(e.getMilliseconds()/10|0)).slice(-2)},S:function(e){return""+(e.getMilliseconds()/100|0)},dddd:function(e){return this.res.dddd[e.getDay()]},ddd:function(e){return this.res.ddd[e.getDay()]},dd:function(e){return this.res.dd[e.getDay()]},Z:function(e){var t=e.getTimezoneOffset()/.6|0;return(t>0?"-":"+")+("000"+Math.abs(t-(t%100*.4|0))).slice(-4)},ZZ:function(e){var t=e.getTimezoneOffset(),n=Math.abs(t);return(t>0?"-":"+")+("0"+(n/60|0)).slice(-2)+":"+("0"+n%60).slice(-2)},post:function(e){return e},res:u},o={YYYY:function(e){return this.exec(/^\d{4}/,e)},Y:function(e){return this.exec(/^\d{1,4}/,e)},MMMM:function(e){var t=this.find(this.res.MMMM,e);return t.value++,t},MMM:function(e){var t=this.find(this.res.MMM,e);return t.value++,t},MM:function(e){return this.exec(/^\d\d/,e)},M:function(e){return this.exec(/^\d\d?/,e)},DD:function(e){return this.exec(/^\d\d/,e)},D:function(e){return this.exec(/^\d\d?/,e)},HH:function(e){return this.exec(/^\d\d/,e)},H:function(e){return this.exec(/^\d\d?/,e)},A:function(e){return this.find(this.res.A,e)},hh:function(e){return this.exec(/^\d\d/,e)},h:function(e){return this.exec(/^\d\d?/,e)},mm:function(e){return this.exec(/^\d\d/,e)},m:function(e){return this.exec(/^\d\d?/,e)},ss:function(e){return this.exec(/^\d\d/,e)},s:function(e){return this.exec(/^\d\d?/,e)},SSS:function(e){return this.exec(/^\d{1,3}/,e)},SS:function(e){var t=this.exec(/^\d\d?/,e);return t.value*=10,t},S:function(e){var t=this.exec(/^\d/,e);return t.value*=100,t},Z:function(e){var t=this.exec(/^[+-]\d{2}[0-5]\d/,e);return t.value=-60*(t.value/100|0)-t.value%100,t},ZZ:function(e){var t=/^([+-])(\d{2}):([0-5]\d)/.exec(e)||["","","",""];return{value:0-(60*(t[1]+t[2]|0)+(t[1]+t[3]|0)),length:t[0].length}},h12:function(e,t){return(12===e?0:e)+12*t},exec:function(e,t){var n=(e.exec(t)||[""])[0];return{value:0|n,length:n.length}},find:function(e,t){for(var n,r=-1,i=0,u=0,s=e.length;ui&&(r=u,i=n.length);return{value:r,length:i}},pre:function(e){return e},res:u},c=function(e,t,n,r){var i,u={};for(i in e)u[i]=e[i];for(i in t||{})!!n^!!u[i]||(u[i]=t[i]);return r&&(u.res=r),u},a={_formatter:s,_parser:o};return a.compile=function(e){return[e].concat(e.match(/\[(?:[^[\]]|\[[^[\]]*])*]|([A-Za-z])\1*|\.{3}|./g)||[])},a.format=function(e,n,r){for(var i,u=this||t,s="string"==typeof n?u.compile(n):n,o=u._formatter,c=function(){if(r){var t=new Date(e.getTime());return t.getFullYear=t.getUTCFullYear,t.getMonth=t.getUTCMonth,t.getDate=t.getUTCDate,t.getHours=t.getUTCHours,t.getMinutes=t.getUTCMinutes,t.getSeconds=t.getUTCSeconds,t.getMilliseconds=t.getUTCMilliseconds,t.getDay=t.getUTCDay,t.getTimezoneOffset=function(){return 0},t}return e}(),a=/^\[(.*)\]$/,d="",f=1,l=s.length;f9999||r.M<1||r.M>12||r.D<1||r.D>new Date(r.Y,r.M,0).getDate()||r.H<0||r.H>23||r.m<0||r.m>59||r.s<0||r.s>59||r.S<0||r.S>999||r.Z<-840||r.Z>720)},a.transform=function(e,n,r,i){const u=this||t;return u.format(u.parse(e,n),r,i)},a.addYears=function(e,n,r){return(this||t).addMonths(e,12*n,r)},a.addMonths=function(e,n,r){var i=new Date(e.getTime());if(r){if(i.setUTCMonth(i.getUTCMonth()+n),i.getUTCDate()11|0]},hh:function(e){return("0"+(e.getHours()%12||12)).slice(-2)},h:function(e){return""+(e.getHours()%12||12)},mm:function(e){return("0"+e.getMinutes()).slice(-2)},m:function(e){return""+e.getMinutes()},ss:function(e){return("0"+e.getSeconds()).slice(-2)},s:function(e){return""+e.getSeconds()},SSS:function(e){return("00"+e.getMilliseconds()).slice(-3)},SS:function(e){return("0"+(e.getMilliseconds()/10|0)).slice(-2)},S:function(e){return""+(e.getMilliseconds()/100|0)},dddd:function(e){return this.res.dddd[e.getDay()]},ddd:function(e){return this.res.ddd[e.getDay()]},dd:function(e){return this.res.dd[e.getDay()]},Z:function(e){var t=e.getTimezoneOffset()/.6|0;return(t>0?"-":"+")+("000"+Math.abs(t-(t%100*.4|0))).slice(-4)},ZZ:function(e){var t=e.getTimezoneOffset(),n=Math.abs(t);return(t>0?"-":"+")+("0"+(n/60|0)).slice(-2)+":"+("0"+n%60).slice(-2)},post:function(e){return e},res:i},o={YYYY:function(e){return this.exec(/^\d{4}/,e)},Y:function(e){return this.exec(/^\d{1,4}/,e)},MMMM:function(e){var t=this.find(this.res.MMMM,e);return t.value++,t},MMM:function(e){var t=this.find(this.res.MMM,e);return t.value++,t},MM:function(e){return this.exec(/^\d\d/,e)},M:function(e){return this.exec(/^\d\d?/,e)},DD:function(e){return this.exec(/^\d\d/,e)},D:function(e){return this.exec(/^\d\d?/,e)},HH:function(e){return this.exec(/^\d\d/,e)},H:function(e){return this.exec(/^\d\d?/,e)},A:function(e){return this.find(this.res.A,e)},hh:function(e){return this.exec(/^\d\d/,e)},h:function(e){return this.exec(/^\d\d?/,e)},mm:function(e){return this.exec(/^\d\d/,e)},m:function(e){return this.exec(/^\d\d?/,e)},ss:function(e){return this.exec(/^\d\d/,e)},s:function(e){return this.exec(/^\d\d?/,e)},SSS:function(e){return this.exec(/^\d{1,3}/,e)},SS:function(e){var t=this.exec(/^\d\d?/,e);return t.value*=10,t},S:function(e){var t=this.exec(/^\d/,e);return t.value*=100,t},Z:function(e){var t=this.exec(/^[+-]\d{2}[0-5]\d/,e);return t.value=-60*(t.value/100|0)-t.value%100,t},ZZ:function(e){var t=/^([+-])(\d{2}):([0-5]\d)/.exec(e)||["","","",""];return{value:0-(60*(t[1]+t[2]|0)+(t[1]+t[3]|0)),length:t[0].length}},h12:function(e,t){return(12===e?0:e)+12*t},exec:function(e,t){var n=(e.exec(t)||[""])[0];return{value:0|n,length:n.length}},find:function(e,t){for(var n,r=-1,i=0,u=0,o=e.length;ui&&(r=u,i=n.length);return{value:r,length:i}},pre:function(e){return e},res:i},s=function(e,t,n,r){var i,u={};for(i in e)u[i]=e[i];for(i in t||{})!!n^!!u[i]||(u[i]=t[i]);return r&&(u.res=r),u},c={_formatter:u,_parser:o};return c.compile=function(e){return[e].concat(e.match(/\[(?:[^[\]]|\[[^[\]]*])*]|([A-Za-z])\1*|\.{3}|./g)||[])},c.format=function(t,n,r){for(var i,u=this||e,o="string"==typeof n?u.compile(n):n,s=u._formatter,c=function(){if(r){var e=new Date(t.getTime());return e.getFullYear=e.getUTCFullYear,e.getMonth=e.getUTCMonth,e.getDate=e.getUTCDate,e.getHours=e.getUTCHours,e.getMinutes=e.getUTCMinutes,e.getSeconds=e.getUTCSeconds,e.getMilliseconds=e.getUTCMilliseconds,e.getDay=e.getUTCDay,e.getTimezoneOffset=function(){return 0},e.getTimezoneName=function(){return"UTC"},e}return t}(),a=/^\[(.*)\]$/,d="",f=1,l=o.length;f9999||r.M<1||r.M>12||r.D<1||r.D>new Date(r.Y,r.M,0).getDate()||r.H<0||r.H>23||r.m<0||r.m>59||r.s<0||r.s>59||r.S<0||r.S>999||r.Z<-840||r.Z>720)},c.transform=function(t,n,r,i){const u=this||e;return u.format(u.parse(t,n),r,i)},c.addYears=function(t,n,r){return(this||e).addMonths(t,12*n,r)},c.addMonths=function(t,n,r){var i=new Date(t.getTime());if(r){if(i.setUTCMonth(i.getUTCMonth()+n),i.getUTCDate()11|0]},hh:function(e){return("0"+(e.getHours()%12||12)).slice(-2)},h:function(e){return""+(e.getHours()%12||12)},mm:function(e){return("0"+e.getMinutes()).slice(-2)},m:function(e){return""+e.getMinutes()},ss:function(e){return("0"+e.getSeconds()).slice(-2)},s:function(e){return""+e.getSeconds()},SSS:function(e){return("00"+e.getMilliseconds()).slice(-3)},SS:function(e){return("0"+(e.getMilliseconds()/10|0)).slice(-2)},S:function(e){return""+(e.getMilliseconds()/100|0)},dddd:function(e){return this.res.dddd[e.getDay()]},ddd:function(e){return this.res.ddd[e.getDay()]},dd:function(e){return this.res.dd[e.getDay()]},Z:function(e){var t=e.getTimezoneOffset()/.6|0;return(t>0?"-":"+")+("000"+Math.abs(t-(t%100*.4|0))).slice(-4)},ZZ:function(e){var t=e.getTimezoneOffset(),n=Math.abs(t);return(t>0?"-":"+")+("0"+(n/60|0)).slice(-2)+":"+("0"+n%60).slice(-2)},post:function(e){return e},res:u},o={YYYY:function(e){return this.exec(/^\d{4}/,e)},Y:function(e){return this.exec(/^\d{1,4}/,e)},MMMM:function(e){var t=this.find(this.res.MMMM,e);return t.value++,t},MMM:function(e){var t=this.find(this.res.MMM,e);return t.value++,t},MM:function(e){return this.exec(/^\d\d/,e)},M:function(e){return this.exec(/^\d\d?/,e)},DD:function(e){return this.exec(/^\d\d/,e)},D:function(e){return this.exec(/^\d\d?/,e)},HH:function(e){return this.exec(/^\d\d/,e)},H:function(e){return this.exec(/^\d\d?/,e)},A:function(e){return this.find(this.res.A,e)},hh:function(e){return this.exec(/^\d\d/,e)},h:function(e){return this.exec(/^\d\d?/,e)},mm:function(e){return this.exec(/^\d\d/,e)},m:function(e){return this.exec(/^\d\d?/,e)},ss:function(e){return this.exec(/^\d\d/,e)},s:function(e){return this.exec(/^\d\d?/,e)},SSS:function(e){return this.exec(/^\d{1,3}/,e)},SS:function(e){var t=this.exec(/^\d\d?/,e);return t.value*=10,t},S:function(e){var t=this.exec(/^\d/,e);return t.value*=100,t},Z:function(e){var t=this.exec(/^[+-]\d{2}[0-5]\d/,e);return t.value=-60*(t.value/100|0)-t.value%100,t},ZZ:function(e){var t=/^([+-])(\d{2}):([0-5]\d)/.exec(e)||["","","",""];return{value:0-(60*(t[1]+t[2]|0)+(t[1]+t[3]|0)),length:t[0].length}},h12:function(e,t){return(12===e?0:e)+12*t},exec:function(e,t){var n=(e.exec(t)||[""])[0];return{value:0|n,length:n.length}},find:function(e,t){for(var n,r=-1,i=0,u=0,s=e.length;ui&&(r=u,i=n.length);return{value:r,length:i}},pre:function(e){return e},res:u},a=function(e,t,n,r){var i,u={};for(i in e)u[i]=e[i];for(i in t||{})!!n^!!u[i]||(u[i]=t[i]);return r&&(u.res=r),u},c={_formatter:s,_parser:o};c.compile=function(e){return[e].concat(e.match(/\[(?:[^[\]]|\[[^[\]]*])*]|([A-Za-z])\1*|\.{3}|./g)||[])},c.format=function(e,n,r){for(var i,u=this||t,s="string"==typeof n?u.compile(n):n,o=u._formatter,a=function(){if(r){var t=new Date(e.getTime());return t.getFullYear=t.getUTCFullYear,t.getMonth=t.getUTCMonth,t.getDate=t.getUTCDate,t.getHours=t.getUTCHours,t.getMinutes=t.getUTCMinutes,t.getSeconds=t.getUTCSeconds,t.getMilliseconds=t.getUTCMilliseconds,t.getDay=t.getUTCDay,t.getTimezoneOffset=function(){return 0},t}return e}(),c=/^\[(.*)\]$/,d="",f=1,l=s.length;f9999||r.M<1||r.M>12||r.D<1||r.D>new Date(r.Y,r.M,0).getDate()||r.H<0||r.H>23||r.m<0||r.m>59||r.s<0||r.s>59||r.S<0||r.S>999||r.Z<-840||r.Z>720)},c.transform=function(e,n,r,i){const u=this||t;return u.format(u.parse(e,n),r,i)},c.addYears=function(e,n,r){return(this||t).addMonths(e,12*n,r)},c.addMonths=function(e,n,r){var i=new Date(e.getTime());if(r){if(i.setUTCMonth(i.getUTCMonth()+n),i.getUTCDate()11|0]},hh:function(e){return("0"+(e.getHours()%12||12)).slice(-2)},h:function(e){return""+(e.getHours()%12||12)},mm:function(e){return("0"+e.getMinutes()).slice(-2)},m:function(e){return""+e.getMinutes()},ss:function(e){return("0"+e.getSeconds()).slice(-2)},s:function(e){return""+e.getSeconds()},SSS:function(e){return("00"+e.getMilliseconds()).slice(-3)},SS:function(e){return("0"+(e.getMilliseconds()/10|0)).slice(-2)},S:function(e){return""+(e.getMilliseconds()/100|0)},dddd:function(e){return this.res.dddd[e.getDay()]},ddd:function(e){return this.res.ddd[e.getDay()]},dd:function(e){return this.res.dd[e.getDay()]},Z:function(e){var t=e.getTimezoneOffset()/.6|0;return(t>0?"-":"+")+("000"+Math.abs(t-(t%100*.4|0))).slice(-4)},ZZ:function(e){var t=e.getTimezoneOffset(),n=Math.abs(t);return(t>0?"-":"+")+("0"+(n/60|0)).slice(-2)+":"+("0"+n%60).slice(-2)},post:function(e){return e},res:i},s={YYYY:function(e){return this.exec(/^\d{4}/,e)},Y:function(e){return this.exec(/^\d{1,4}/,e)},MMMM:function(e){var t=this.find(this.res.MMMM,e);return t.value++,t},MMM:function(e){var t=this.find(this.res.MMM,e);return t.value++,t},MM:function(e){return this.exec(/^\d\d/,e)},M:function(e){return this.exec(/^\d\d?/,e)},DD:function(e){return this.exec(/^\d\d/,e)},D:function(e){return this.exec(/^\d\d?/,e)},HH:function(e){return this.exec(/^\d\d/,e)},H:function(e){return this.exec(/^\d\d?/,e)},A:function(e){return this.find(this.res.A,e)},hh:function(e){return this.exec(/^\d\d/,e)},h:function(e){return this.exec(/^\d\d?/,e)},mm:function(e){return this.exec(/^\d\d/,e)},m:function(e){return this.exec(/^\d\d?/,e)},ss:function(e){return this.exec(/^\d\d/,e)},s:function(e){return this.exec(/^\d\d?/,e)},SSS:function(e){return this.exec(/^\d{1,3}/,e)},SS:function(e){var t=this.exec(/^\d\d?/,e);return t.value*=10,t},S:function(e){var t=this.exec(/^\d/,e);return t.value*=100,t},Z:function(e){var t=this.exec(/^[+-]\d{2}[0-5]\d/,e);return t.value=-60*(t.value/100|0)-t.value%100,t},ZZ:function(e){var t=/^([+-])(\d{2}):([0-5]\d)/.exec(e)||["","","",""];return{value:0-(60*(t[1]+t[2]|0)+(t[1]+t[3]|0)),length:t[0].length}},h12:function(e,t){return(12===e?0:e)+12*t},exec:function(e,t){var n=(e.exec(t)||[""])[0];return{value:0|n,length:n.length}},find:function(e,t){for(var n,r=-1,i=0,u=0,s=e.length;ui&&(r=u,i=n.length);return{value:r,length:i}},pre:function(e){return e},res:i},o=function(e,t,n,r){var i,u={};for(i in e)u[i]=e[i];for(i in t||{})!!n^!!u[i]||(u[i]=t[i]);return r&&(u.res=r),u},a={_formatter:u,_parser:s};a.compile=function(e){return[e].concat(e.match(/\[(?:[^[\]]|\[[^[\]]*])*]|([A-Za-z])\1*|\.{3}|./g)||[])},a.format=function(t,n,r){for(var i,u=this||e,s="string"==typeof n?u.compile(n):n,o=u._formatter,a=function(){if(r){var e=new Date(t.getTime());return e.getFullYear=e.getUTCFullYear,e.getMonth=e.getUTCMonth,e.getDate=e.getUTCDate,e.getHours=e.getUTCHours,e.getMinutes=e.getUTCMinutes,e.getSeconds=e.getUTCSeconds,e.getMilliseconds=e.getUTCMilliseconds,e.getDay=e.getUTCDay,e.getTimezoneOffset=function(){return 0},e.getTimezoneName=function(){return"UTC"},e}return t}(),c=/^\[(.*)\]$/,d="",f=1,l=s.length;f9999||r.M<1||r.M>12||r.D<1||r.D>new Date(r.Y,r.M,0).getDate()||r.H<0||r.H>23||r.m<0||r.m>59||r.s<0||r.s>59||r.S<0||r.S>999||r.Z<-840||r.Z>720)},a.transform=function(t,n,r,i){const u=this||e;return u.format(u.parse(t,n),r,i)},a.addYears=function(t,n,r){return(this||e).addMonths(t,12*n,r)},a.addMonths=function(t,n,r){var i=new Date(t.getTime());if(r){if(i.setUTCMonth(i.getUTCMonth()+n),i.getUTCDate()=6" } @@ -705,10 +713,11 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -725,7 +734,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/decamelize": { "version": "4.0.0", @@ -771,10 +781,11 @@ } }, "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -1641,32 +1652,32 @@ } }, "node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -1697,18 +1708,6 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2132,9 +2131,9 @@ } }, "node_modules/rollup": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -2148,22 +2147,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.17.2", - "@rollup/rollup-android-arm64": "4.17.2", - "@rollup/rollup-darwin-arm64": "4.17.2", - "@rollup/rollup-darwin-x64": "4.17.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", - "@rollup/rollup-linux-arm-musleabihf": "4.17.2", - "@rollup/rollup-linux-arm64-gnu": "4.17.2", - "@rollup/rollup-linux-arm64-musl": "4.17.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", - "@rollup/rollup-linux-riscv64-gnu": "4.17.2", - "@rollup/rollup-linux-s390x-gnu": "4.17.2", - "@rollup/rollup-linux-x64-gnu": "4.17.2", - "@rollup/rollup-linux-x64-musl": "4.17.2", - "@rollup/rollup-win32-arm64-msvc": "4.17.2", - "@rollup/rollup-win32-ia32-msvc": "4.17.2", - "@rollup/rollup-win32-x64-msvc": "4.17.2", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, @@ -2226,10 +2225,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -2448,9 +2448,9 @@ } }, "node_modules/tsd": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.0.tgz", - "integrity": "sha512-yjBiQ5n8OMv/IZOuhDjBy0ZLCoJ7rky/RxRh5W4sJ0oNNCU/kf6s3puPAkGNi59PptDdkcpUm+RsKSdjR2YbNg==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.1.tgz", + "integrity": "sha512-sSL84A0SFwx2xGMWrxlGaarKFSQszWjJS2vgNDDLwatytzg2aq6ShlwHsBYxRNmjzXISODwMva5ZOdAg/4AoOA==", "dev": true, "license": "MIT", "dependencies": { @@ -2492,10 +2492,11 @@ } }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -2587,10 +2588,11 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -2751,128 +2753,117 @@ "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" - }, - "dependencies": { - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - } } }, "@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", - "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", - "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", - "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", - "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", - "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", - "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", - "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", - "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", - "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", - "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "dev": true, "optional": true }, @@ -2929,9 +2920,9 @@ "dev": true }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-escapes": { @@ -3113,9 +3104,9 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "requires": { "ms": "2.1.2" @@ -3160,9 +3151,9 @@ } }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true }, "diff-sequences": { @@ -3799,31 +3790,31 @@ } }, "mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", "dev": true, "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "dependencies": { "escape-string-regexp": { @@ -3838,15 +3829,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4149,27 +4131,27 @@ "dev": true }, "rollup": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.17.2", - "@rollup/rollup-android-arm64": "4.17.2", - "@rollup/rollup-darwin-arm64": "4.17.2", - "@rollup/rollup-darwin-x64": "4.17.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", - "@rollup/rollup-linux-arm-musleabihf": "4.17.2", - "@rollup/rollup-linux-arm64-gnu": "4.17.2", - "@rollup/rollup-linux-arm64-musl": "4.17.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", - "@rollup/rollup-linux-riscv64-gnu": "4.17.2", - "@rollup/rollup-linux-s390x-gnu": "4.17.2", - "@rollup/rollup-linux-x64-gnu": "4.17.2", - "@rollup/rollup-linux-x64-musl": "4.17.2", - "@rollup/rollup-win32-arm64-msvc": "4.17.2", - "@rollup/rollup-win32-ia32-msvc": "4.17.2", - "@rollup/rollup-win32-x64-msvc": "4.17.2", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "@types/estree": "1.0.5", "fsevents": "~2.3.2" } @@ -4199,9 +4181,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -4372,9 +4354,9 @@ "dev": true }, "tsd": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.0.tgz", - "integrity": "sha512-yjBiQ5n8OMv/IZOuhDjBy0ZLCoJ7rky/RxRh5W4sJ0oNNCU/kf6s3puPAkGNi59PptDdkcpUm+RsKSdjR2YbNg==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.1.tgz", + "integrity": "sha512-sSL84A0SFwx2xGMWrxlGaarKFSQszWjJS2vgNDDLwatytzg2aq6ShlwHsBYxRNmjzXISODwMva5ZOdAg/4AoOA==", "dev": true, "requires": { "@tsd/typescript": "~5.4.3", @@ -4403,9 +4385,9 @@ } }, "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "wrap-ansi": { @@ -4479,9 +4461,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, "yargs-unparser": { diff --git a/package.json b/package.json index 4c7d68e..fefedfe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "date-and-time", - "version": "3.3.0", + "version": "3.4.0", "description": "A Minimalist DateTime utility for Node.js and the browser", "main": "date-and-time.js", "module": "esm/date-and-time.es.js", @@ -51,8 +51,8 @@ "devDependencies": { "@rollup/plugin-terser": "^0.4.4", "expect.js": "^0.3.1", - "mocha": "^10.4.0", - "rollup": "^4.17.2", - "tsd": "^0.31.0" + "mocha": "^10.6.0", + "rollup": "^4.18.0", + "tsd": "^0.31.1" } } diff --git a/plugin/day-of-week.d.ts b/plugin/day-of-week.d.ts index e5d0ea7..267d284 100644 --- a/plugin/day-of-week.d.ts +++ b/plugin/day-of-week.d.ts @@ -1 +1 @@ -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/meridiem.d.ts b/plugin/meridiem.d.ts index e5d0ea7..267d284 100644 --- a/plugin/meridiem.d.ts +++ b/plugin/meridiem.d.ts @@ -1 +1 @@ -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/microsecond.d.ts b/plugin/microsecond.d.ts index e5d0ea7..267d284 100644 --- a/plugin/microsecond.d.ts +++ b/plugin/microsecond.d.ts @@ -1 +1 @@ -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/ordinal.d.ts b/plugin/ordinal.d.ts index e5d0ea7..267d284 100644 --- a/plugin/ordinal.d.ts +++ b/plugin/ordinal.d.ts @@ -1 +1 @@ -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/timespan.d.ts b/plugin/timespan.d.ts index 02f14b9..ca22f21 100644 --- a/plugin/timespan.d.ts +++ b/plugin/timespan.d.ts @@ -21,4 +21,4 @@ declare module '../date-and-time' { export function timeSpan(date1: Date, date2: Date): TimeSpanResult; } -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/timezone.d.ts b/plugin/timezone.d.ts index fd572b8..73c7ed9 100644 --- a/plugin/timezone.d.ts +++ b/plugin/timezone.d.ts @@ -76,4 +76,4 @@ declare module '../date-and-time' { export function transformTZ(dateString: string, compiledObj1: string[], compiledObj2: string[], timeZone?: string): string; } -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/plugin/timezone.js b/plugin/timezone.js index 4989e6d..da236a0 100644 --- a/plugin/timezone.js +++ b/plugin/timezone.js @@ -9,12 +9,7 @@ * @preserve timezone */ - var plugin = function (date, localized_date) { - var options = { - year: 'numeric', month: 'numeric', day: 'numeric', - hour: 'numeric', minute: 'numeric', second: 'numeric' - }; - var pattern = date.compile('M/D/Y, h:mm:ss A'); + var plugin = function (proto, date) { var timeZones = { africa: { abidjan: [0, -968], @@ -461,41 +456,173 @@ wallis: [43200, 41524] } }; + var timeZoneNames = { + 'Acre Standard Time': 'ACT', 'Acre Summer Time': 'ACST', 'Afghanistan Time': 'AFT', + 'Alaska Daylight Time': 'AKDT', 'Alaska Standard Time': 'AKST', 'Almaty Standard Time': 'ALMT', + 'Almaty Summer Time': 'ALMST', 'Amazon Standard Time': 'AMT', 'Amazon Summer Time': 'AMST', + 'Anadyr Standard Time': 'ANAT', 'Anadyr Summer Time': 'ANAST', 'Apia Daylight Time': 'WSDT', + 'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': 'AQTT', + 'Aqtobe Standard Time': 'AQTT', 'Aqtobe Summer Time': 'AQST', 'Arabian Daylight Time': 'ADT', + 'Arabian Standard Time': 'AST', 'Argentina Standard Time': 'ART', 'Argentina Summer Time': 'ARST', + 'Armenia Standard Time': 'AMT', 'Armenia Summer Time': 'AMST', 'Atlantic Daylight Time': 'ADT', + 'Atlantic Standard Time': 'AST', 'Australian Central Daylight Time': 'ACDT', 'Australian Central Standard Time': 'ACST', + 'Australian Central Western Daylight Time': 'ACWDT', 'Australian Central Western Standard Time': 'ACWST', 'Australian Eastern Daylight Time': 'AEDT', + 'Australian Eastern Standard Time': 'AEST', 'Australian Western Daylight Time': 'AWDT', 'Australian Western Standard Time': 'AWST', + 'Azerbaijan Standard Time': 'AZT', 'Azerbaijan Summer Time': 'AZST', 'Azores Standard Time': 'AZOT', + 'Azores Summer Time': 'AZOST', 'Bangladesh Standard Time': 'BST', 'Bangladesh Summer Time': 'BDST', + 'Bhutan Time': 'BTT', 'Bolivia Time': 'BOT', 'Brasilia Standard Time': 'BRT', + 'Brasilia Summer Time': 'BRST', 'British Summer Time': 'BST', 'Brunei Darussalam Time': 'BNT', + 'Cape Verde Standard Time': 'CVT', 'Casey Time': 'CAST', 'Central Africa Time': 'CAT', + 'Central Daylight Time': 'CDT', 'Central European Standard Time': 'CET', 'Central European Summer Time': 'CEST', + 'Central Indonesia Time': 'WITA', 'Central Standard Time': 'CST', 'Chamorro Standard Time': 'ChST', + 'Chatham Daylight Time': 'CHADT', 'Chatham Standard Time': 'CHAST', 'Chile Standard Time': 'CLT', + 'Chile Summer Time': 'CLST', 'China Daylight Time': 'CDT', 'China Standard Time': 'CST', + 'Choibalsan Standard Time': 'CHOT', 'Choibalsan Summer Time': 'CHOST', 'Christmas Island Time': 'CXT', + 'Chuuk Time': 'CHUT', 'Cocos Islands Time': 'CCT', 'Colombia Standard Time': 'COT', + 'Colombia Summer Time': 'COST', 'Cook Islands Half Summer Time': 'CKHST', 'Cook Islands Standard Time': 'CKT', + 'Coordinated Universal Time': 'UTC', 'Cuba Daylight Time': 'CDT', 'Cuba Standard Time': 'CST', + 'Davis Time': 'DAVT', 'Dumont-d’Urville Time': 'DDUT', 'East Africa Time': 'EAT', + 'East Greenland Standard Time': 'EGST', 'East Greenland Summer Time': 'EGST', 'East Kazakhstan Time': 'ALMT', + 'East Timor Time': 'TLT', 'Easter Island Standard Time': 'EAST', 'Easter Island Summer Time': 'EASST', + 'Eastern Daylight Time': 'EDT', 'Eastern European Standard Time': 'EET', 'Eastern European Summer Time': 'EEST', + 'Eastern Indonesia Time': 'WIT', 'Eastern Standard Time': 'EST', 'Ecuador Time': 'ECT', + 'Falkland Islands Standard Time': 'FKST', 'Falkland Islands Summer Time': 'FKDT', 'Fernando de Noronha Standard Time': 'FNT', + 'Fernando de Noronha Summer Time': 'FNST', 'Fiji Standard Time': 'FJT', 'Fiji Summer Time': 'FJST', + 'French Guiana Time': 'GFT', 'French Southern & Antarctic Time': 'TFT', 'Further-eastern European Time': 'FET', + 'GMT': 'GMT', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT', + 'Georgia Standard Time': 'GET', 'Georgia Summer Time': 'GEST', 'Gilbert Islands Time': 'GILT', + 'Greenwich Mean Time': 'GMT', 'Guam Standard Time': 'ChST', 'Gulf Standard Time': 'GST', + 'Guyana Time': 'GYT', 'Hawaii-Aleutian Daylight Time': 'HADT', 'Hawaii-Aleutian Standard Time': 'HAST', + 'Hong Kong Standard Time': 'HKT', 'Hong Kong Summer Time': 'HKST', 'Hovd Standard Time': 'HOVT', + 'Hovd Summer Time': 'HOVST', 'India Standard Time': 'IST', 'Indian Ocean Time': 'IOT', + 'Indochina Time': 'ICT', 'Iran Daylight Time': 'IRDT', 'Iran Standard Time': 'IRST', + 'Irish Standard Time': 'IST', 'Irkutsk Standard Time': 'IRKT', 'Irkutsk Summer Time': 'IRKST', + 'Israel Daylight Time': 'IDT', 'Israel Standard Time': 'IST', 'Japan Standard Time': 'JST', + 'Korean Daylight Time': 'KDT', 'Korean Standard Time': 'KST', 'Kosrae Time': 'KOST', + 'Krasnoyarsk Standard Time': 'KRAT', 'Krasnoyarsk Summer Time': 'KRAST', 'Kyrgyzstan Time': 'KGT', + 'Lanka Time': 'LKT', 'Line Islands Time': 'LINT', 'Lord Howe Daylight Time': 'LHDT', + 'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': 'CDST', + 'Magadan Standard Time': 'MAGT', 'Magadan Summer Time': 'MAGST', 'Malaysia Time': 'MYT', + 'Maldives Time': 'MVT', 'Marquesas Time': 'MART', 'Marshall Islands Time': 'MHT', + 'Mauritius Standard Time': 'MUT', 'Mauritius Summer Time': 'MUST', 'Mawson Time': 'MAWT', + 'Mexican Pacific Daylight Time': 'PDT', 'Mexican Pacific Standard Time': 'PST', 'Moscow Standard Time': 'MSK', + 'Moscow Summer Time': 'MSD', 'Mountain Daylight Time': 'MDT', 'Mountain Standard Time': 'MST', + 'Myanmar Time': 'MMT', 'Nauru Time': 'NRT', 'Nepal Time': 'NPT', + 'New Caledonia Standard Time': 'NCT', 'New Caledonia Summer Time': 'NCST', 'New Zealand Daylight Time': 'NZDT', + 'New Zealand Standard Time': 'NZST', 'Newfoundland Daylight Time': 'NDT', 'Newfoundland Standard Time': 'NST', + 'Niue Time': 'NUT', 'Norfolk Island Daylight Time': 'NFDT', 'Norfolk Island Standard Time': 'NFT', + 'North Mariana Islands Time': 'ChST', 'Novosibirsk Standard Time': 'NOVT', 'Novosibirsk Summer Time': 'NOVST', + 'Omsk Standard Time': 'OMST', 'Omsk Summer Time': 'OMSST', 'Pacific Daylight Time': 'PDT', + 'Pacific Standard Time': 'PST', 'Pakistan Standard Time': 'PKT', 'Pakistan Summer Time': 'PKST', + 'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': 'PYST', + 'Paraguay Summer Time': 'PYST', 'Peru Standard Time': 'PET', 'Peru Summer Time': 'PEST', + 'Petropavlovsk-Kamchatski Standard Time': 'PETT', 'Petropavlovsk-Kamchatski Summer Time': 'PETST', 'Philippine Standard Time': 'PST', + 'Philippine Summer Time': 'PHST', 'Phoenix Islands Time': 'PHOT', 'Pitcairn Time': 'PIT', + 'Ponape Time': 'PONT', 'Pyongyang Time': 'KST', 'Qyzylorda Standard Time': 'QYZT', + 'Qyzylorda Summer Time': 'QYZST', 'Rothera Time': 'ROOTT', 'Réunion Time': 'RET', + 'Sakhalin Standard Time': 'SAKT', 'Sakhalin Summer Time': 'SAKST', 'Samara Standard Time': 'SAMT', + 'Samara Summer Time': 'SAMST', 'Samoa Standard Time': 'SST', 'Seychelles Time': 'SCT', + 'Singapore Standard Time': 'SGT', 'Solomon Islands Time': 'SBT', 'South Africa Standard Time': 'SAST', + 'South Georgia Time': 'GST', 'St. Pierre & Miquelon Daylight Time': 'PMDT', 'St. Pierre & Miquelon Standard Time': 'PMST', + 'Suriname Time': 'SRT', 'Syowa Time': 'SYOT', 'Tahiti Time': 'TAHT', + 'Taipei Daylight Time': 'TDT', 'Taipei Standard Time': 'CST', 'Tajikistan Time': 'TJT', + 'Tokelau Time': 'TKT', 'Tonga Standard Time': 'TOT', 'Tonga Summer Time': 'TOST', + 'Turkmenistan Standard Time': 'TMT', 'Tuvalu Time': 'TVT', 'Ulaanbaatar Standard Time': 'ULAT', + 'Ulaanbaatar Summer Time': 'ULAST', 'Uruguay Standard Time': 'UYT', 'Uruguay Summer Time': 'UYST', + 'Uzbekistan Standard Time': 'UZT', 'Uzbekistan Summer Time': 'UZST', 'Vanuatu Standard Time': 'VUT', + 'Vanuatu Summer Time': 'VUST', 'Venezuela Time': 'VET', 'Vladivostok Standard Time': 'VLAT', + 'Vladivostok Summer Time': 'VLAST', 'Volgograd Standard Time': 'VOLT', 'Volgograd Summer Time': 'VOLST', + 'Vostok Time': 'VOST', 'Wake Island Time': 'WAKT', 'Wallis & Futuna Time': 'WFT', + 'West Africa Standard Time': 'WAT', 'West Africa Summer Time': 'WAST', 'West Greenland Standard Time': 'WGST', + 'West Greenland Summer Time': 'WGST', 'West Kazakhstan Time': 'AQTT', 'Western Argentina Standard Time': 'ART', + 'Western Argentina Summer Time': 'ARST', 'Western European Standard Time': 'WET', 'Western European Summer Time': 'WEST', + 'Western Indonesia Time': 'WIB', 'Yakutsk Standard Time': 'YAKT', 'Yakutsk Summer Time': 'YAKST', + 'Yekaterinburg Standard Time': 'YEKT', 'Yekaterinburg Summer Time': 'YEKST', 'Yukon Time': 'YT' + }; + var options = { + hour12: false, weekday: 'short', year: 'numeric', month: 'numeric', day: 'numeric', + hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3 + }; var formatTZ = function (dateObj, arg, timeZone) { - options.timeZone = 'UTC'; - var utcObj = date.parse(new Intl.DateTimeFormat('en-US', options).format(dateObj), pattern); - utcObj.setMilliseconds(dateObj.getMilliseconds()); + var parts = (function () { + options.timeZone = timeZone || undefined; + var array = new Intl.DateTimeFormat('en-US', options).formatToParts(dateObj); + var values = {}; - options.timeZone = timeZone; - var dateObj2 = date.parse(new Intl.DateTimeFormat('en-US', options).format(dateObj), pattern); - dateObj2.setMilliseconds(dateObj.getMilliseconds()); + for (var i = 0, len = array.length; i < len; i++) { + var type = array[i].type; + var value = array[i].value; - dateObj2.getTimezoneOffset = function () { return (utcObj.getTime() - dateObj2.getTime()) / 60000 | 0; }; + switch (type) { + case 'weekday': + values[type] = 'SunMonTueWedThuFriSat'.indexOf(value) / 3; + break; + case 'year': + case 'month': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'fractionalSecond': + values[type] = value | 0; + } + } + return values; + }()); - return localized_date.format(dateObj2, arg); + return date.format({ + getFullYear: function () { return parts.year; }, + getMonth: function () { return parts.month - 1; }, + getDate: function () { return parts.day; }, + getHours: function () { return parts.hour; }, + getMinutes: function () { return parts.minute; }, + getSeconds: function () { return parts.second; }, + getMilliseconds: function () { return parts.fractionalSecond; }, + getDay: function () { return parts.weekday; }, + getTime: function () { return dateObj.getTime(); }, + getTimezoneOffset: function () { + return (dateObj.getTime() - Date.UTC( + parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day, + parts.hour, parts.minute, parts.second, parts.fractionalSecond + )) / 60000 | 0; + }, + getTimezoneName: function () { return timeZone || undefined; } + }, arg); }; var parseTZ = function (dateString, arg, timeZone) { - var pattern2 = typeof arg === 'string' ? date.compile(arg) : arg; - var dateObj = localized_date.parse(dateString, pattern2, !!timeZone); + var pattern = typeof arg === 'string' ? date.compile(arg) : arg; + var dateObj = date.parse(dateString, pattern, !!timeZone); + + var hasZ = function (array) { + for (var i = 1, len = array.length; i < len; i++) { + if (!array[i].indexOf('Z')) { + return true; + } + } + return false; + }; - if (!timeZone || ~date._parser.find(pattern2, 'ZZ').value || timeZone.toLowerCase() === 'utc') { + if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC') { return dateObj; } - options.timeZone = timeZone; - var dateTimeFormat = new Intl.DateTimeFormat('en-US', options); - var dateString2 = date.format(dateObj, pattern, true); - var offset = (function () { - var keys = timeZone.toLowerCase().split('/'); + var getOffset = function (timeZoneName) { + var keys = (timeZoneName || '').toLowerCase().split('/'); var value = timeZones[keys[0]] || {}; for (var i = 1, len = keys.length; i < len; i++) { value = value[keys[i]] || {}; } return Array.isArray(value) ? value : []; - })(); + }; + + options.timeZone = 'UTC'; + var dateString2 = new Intl.DateTimeFormat('en-US', options).format(dateObj); + options.timeZone = timeZone || undefined; + var dateTimeFormat = new Intl.DateTimeFormat('en-US', options); + var offset = getOffset(timeZone); var comparer = function (d) { - return dateString2 === dateTimeFormat.format(d).replace(/[\u202f]/, ' '); + return dateString2 === dateTimeFormat.format(d); }; for (var j = 0, len2 = offset.length; j < len2; j++) { @@ -507,12 +634,36 @@ return new Date(NaN); }; var transformTZ = function (dateString, arg1, arg2, timeZone) { - return formatTZ(localized_date.parse(dateString, arg1), arg2, timeZone); + return formatTZ(date.parse(dateString, arg1), arg2, timeZone); }; var name = 'timezone'; - date.plugin(name, { + var getName = function (d) { + var parts = new Intl.DateTimeFormat('en-US', { + timeZone: typeof d.getTimezoneName === 'function' ? d.getTimezoneName() : undefined, + timeZoneName: 'long' + }).formatToParts(d.getTime()); + + for (var i = 0, len = parts.length; i < len; i++) { + if (parts[i].type === 'timeZoneName') { + return parts[i].value; + } + } + return ''; + }; + + proto.plugin(name, { + formatter: { + z: function (d) { + var name = getName(d); + return timeZoneNames[name] || ''; + }, + zz: function (d) { + var name = getName(d); + return /^GMT[+-].+$/.test(name) ? '' : name; + } + }, extender: { formatTZ: formatTZ, parseTZ: parseTZ, diff --git a/plugin/two-digit-year.d.ts b/plugin/two-digit-year.d.ts index e5d0ea7..267d284 100644 --- a/plugin/two-digit-year.d.ts +++ b/plugin/two-digit-year.d.ts @@ -1 +1 @@ -export default function (date: unknown, localized_date?: unknown): string; +export default function (proto: unknown, date?: unknown): string; diff --git a/src/index.js b/src/index.js index 0f9b1f6..2a74369 100644 --- a/src/index.js +++ b/src/index.js @@ -136,7 +136,6 @@ var locales = {}, _formatter: _formatter, _parser: _parser }, - localized_proto, date; /** @@ -171,6 +170,7 @@ proto.format = function (dateObj, arg, utc) { u.getMilliseconds = u.getUTCMilliseconds; u.getDay = u.getUTCDay; u.getTimezoneOffset = function () { return 0; }; + u.getTimezoneName = function () { return 'UTC'; }; return u; } return dateObj; @@ -447,7 +447,6 @@ proto.plugin = function (name, plugin) { } }; -localized_proto = extend(proto); date = extend(proto); /** @@ -468,8 +467,8 @@ date.locale = function (locale) { var formatter = extend(_formatter, extension.formatter, true, res); var parser = extend(_parser, extension.parser, true, res); - date._formatter = localized_proto._formatter = formatter; - date._parser = localized_proto._parser = parser; + date._formatter = formatter; + date._parser = parser; for (var plugin in plugins) { date.extend(plugins[plugin]); @@ -506,8 +505,8 @@ date.plugin = function (plugin) { var install = typeof plugin === 'function' ? plugin : date.plugin[plugin]; if (install) { - date.extend(plugins[install(proto, localized_proto)] || {}); + date.extend(plugins[install(proto, date)] || {}); } }; -export default date; +export default date; \ No newline at end of file diff --git a/src/plugin/timezone.js b/src/plugin/timezone.js index 7be2204..8be2a1b 100644 --- a/src/plugin/timezone.js +++ b/src/plugin/timezone.js @@ -3,12 +3,7 @@ * @preserve timezone */ -var plugin = function (date, localized_date) { - var options = { - year: 'numeric', month: 'numeric', day: 'numeric', - hour: 'numeric', minute: 'numeric', second: 'numeric' - }; - var pattern = date.compile('M/D/Y, h:mm:ss A'); +var plugin = function (proto, date) { var timeZones = { africa: { abidjan: [0, -968], @@ -455,41 +450,173 @@ var plugin = function (date, localized_date) { wallis: [43200, 41524] } }; + var timeZoneNames = { + 'Acre Standard Time': 'ACT', 'Acre Summer Time': 'ACST', 'Afghanistan Time': 'AFT', + 'Alaska Daylight Time': 'AKDT', 'Alaska Standard Time': 'AKST', 'Almaty Standard Time': 'ALMT', + 'Almaty Summer Time': 'ALMST', 'Amazon Standard Time': 'AMT', 'Amazon Summer Time': 'AMST', + 'Anadyr Standard Time': 'ANAT', 'Anadyr Summer Time': 'ANAST', 'Apia Daylight Time': 'WSDT', + 'Apia Standard Time': 'WSST', 'Aqtau Standard Time': 'AQTT', 'Aqtau Summer Time': 'AQTT', + 'Aqtobe Standard Time': 'AQTT', 'Aqtobe Summer Time': 'AQST', 'Arabian Daylight Time': 'ADT', + 'Arabian Standard Time': 'AST', 'Argentina Standard Time': 'ART', 'Argentina Summer Time': 'ARST', + 'Armenia Standard Time': 'AMT', 'Armenia Summer Time': 'AMST', 'Atlantic Daylight Time': 'ADT', + 'Atlantic Standard Time': 'AST', 'Australian Central Daylight Time': 'ACDT', 'Australian Central Standard Time': 'ACST', + 'Australian Central Western Daylight Time': 'ACWDT', 'Australian Central Western Standard Time': 'ACWST', 'Australian Eastern Daylight Time': 'AEDT', + 'Australian Eastern Standard Time': 'AEST', 'Australian Western Daylight Time': 'AWDT', 'Australian Western Standard Time': 'AWST', + 'Azerbaijan Standard Time': 'AZT', 'Azerbaijan Summer Time': 'AZST', 'Azores Standard Time': 'AZOT', + 'Azores Summer Time': 'AZOST', 'Bangladesh Standard Time': 'BST', 'Bangladesh Summer Time': 'BDST', + 'Bhutan Time': 'BTT', 'Bolivia Time': 'BOT', 'Brasilia Standard Time': 'BRT', + 'Brasilia Summer Time': 'BRST', 'British Summer Time': 'BST', 'Brunei Darussalam Time': 'BNT', + 'Cape Verde Standard Time': 'CVT', 'Casey Time': 'CAST', 'Central Africa Time': 'CAT', + 'Central Daylight Time': 'CDT', 'Central European Standard Time': 'CET', 'Central European Summer Time': 'CEST', + 'Central Indonesia Time': 'WITA', 'Central Standard Time': 'CST', 'Chamorro Standard Time': 'ChST', + 'Chatham Daylight Time': 'CHADT', 'Chatham Standard Time': 'CHAST', 'Chile Standard Time': 'CLT', + 'Chile Summer Time': 'CLST', 'China Daylight Time': 'CDT', 'China Standard Time': 'CST', + 'Choibalsan Standard Time': 'CHOT', 'Choibalsan Summer Time': 'CHOST', 'Christmas Island Time': 'CXT', + 'Chuuk Time': 'CHUT', 'Cocos Islands Time': 'CCT', 'Colombia Standard Time': 'COT', + 'Colombia Summer Time': 'COST', 'Cook Islands Half Summer Time': 'CKHST', 'Cook Islands Standard Time': 'CKT', + 'Coordinated Universal Time': 'UTC', 'Cuba Daylight Time': 'CDT', 'Cuba Standard Time': 'CST', + 'Davis Time': 'DAVT', 'Dumont-d’Urville Time': 'DDUT', 'East Africa Time': 'EAT', + 'East Greenland Standard Time': 'EGST', 'East Greenland Summer Time': 'EGST', 'East Kazakhstan Time': 'ALMT', + 'East Timor Time': 'TLT', 'Easter Island Standard Time': 'EAST', 'Easter Island Summer Time': 'EASST', + 'Eastern Daylight Time': 'EDT', 'Eastern European Standard Time': 'EET', 'Eastern European Summer Time': 'EEST', + 'Eastern Indonesia Time': 'WIT', 'Eastern Standard Time': 'EST', 'Ecuador Time': 'ECT', + 'Falkland Islands Standard Time': 'FKST', 'Falkland Islands Summer Time': 'FKDT', 'Fernando de Noronha Standard Time': 'FNT', + 'Fernando de Noronha Summer Time': 'FNST', 'Fiji Standard Time': 'FJT', 'Fiji Summer Time': 'FJST', + 'French Guiana Time': 'GFT', 'French Southern & Antarctic Time': 'TFT', 'Further-eastern European Time': 'FET', + 'GMT': 'GMT', 'Galapagos Time': 'GALT', 'Gambier Time': 'GAMT', + 'Georgia Standard Time': 'GET', 'Georgia Summer Time': 'GEST', 'Gilbert Islands Time': 'GILT', + 'Greenwich Mean Time': 'GMT', 'Guam Standard Time': 'ChST', 'Gulf Standard Time': 'GST', + 'Guyana Time': 'GYT', 'Hawaii-Aleutian Daylight Time': 'HADT', 'Hawaii-Aleutian Standard Time': 'HAST', + 'Hong Kong Standard Time': 'HKT', 'Hong Kong Summer Time': 'HKST', 'Hovd Standard Time': 'HOVT', + 'Hovd Summer Time': 'HOVST', 'India Standard Time': 'IST', 'Indian Ocean Time': 'IOT', + 'Indochina Time': 'ICT', 'Iran Daylight Time': 'IRDT', 'Iran Standard Time': 'IRST', + 'Irish Standard Time': 'IST', 'Irkutsk Standard Time': 'IRKT', 'Irkutsk Summer Time': 'IRKST', + 'Israel Daylight Time': 'IDT', 'Israel Standard Time': 'IST', 'Japan Standard Time': 'JST', + 'Korean Daylight Time': 'KDT', 'Korean Standard Time': 'KST', 'Kosrae Time': 'KOST', + 'Krasnoyarsk Standard Time': 'KRAT', 'Krasnoyarsk Summer Time': 'KRAST', 'Kyrgyzstan Time': 'KGT', + 'Lanka Time': 'LKT', 'Line Islands Time': 'LINT', 'Lord Howe Daylight Time': 'LHDT', + 'Lord Howe Standard Time': 'LHST', 'Macao Standard Time': 'CST', 'Macao Summer Time': 'CDST', + 'Magadan Standard Time': 'MAGT', 'Magadan Summer Time': 'MAGST', 'Malaysia Time': 'MYT', + 'Maldives Time': 'MVT', 'Marquesas Time': 'MART', 'Marshall Islands Time': 'MHT', + 'Mauritius Standard Time': 'MUT', 'Mauritius Summer Time': 'MUST', 'Mawson Time': 'MAWT', + 'Mexican Pacific Daylight Time': 'PDT', 'Mexican Pacific Standard Time': 'PST', 'Moscow Standard Time': 'MSK', + 'Moscow Summer Time': 'MSD', 'Mountain Daylight Time': 'MDT', 'Mountain Standard Time': 'MST', + 'Myanmar Time': 'MMT', 'Nauru Time': 'NRT', 'Nepal Time': 'NPT', + 'New Caledonia Standard Time': 'NCT', 'New Caledonia Summer Time': 'NCST', 'New Zealand Daylight Time': 'NZDT', + 'New Zealand Standard Time': 'NZST', 'Newfoundland Daylight Time': 'NDT', 'Newfoundland Standard Time': 'NST', + 'Niue Time': 'NUT', 'Norfolk Island Daylight Time': 'NFDT', 'Norfolk Island Standard Time': 'NFT', + 'North Mariana Islands Time': 'ChST', 'Novosibirsk Standard Time': 'NOVT', 'Novosibirsk Summer Time': 'NOVST', + 'Omsk Standard Time': 'OMST', 'Omsk Summer Time': 'OMSST', 'Pacific Daylight Time': 'PDT', + 'Pacific Standard Time': 'PST', 'Pakistan Standard Time': 'PKT', 'Pakistan Summer Time': 'PKST', + 'Palau Time': 'PWT', 'Papua New Guinea Time': 'PGT', 'Paraguay Standard Time': 'PYST', + 'Paraguay Summer Time': 'PYST', 'Peru Standard Time': 'PET', 'Peru Summer Time': 'PEST', + 'Petropavlovsk-Kamchatski Standard Time': 'PETT', 'Petropavlovsk-Kamchatski Summer Time': 'PETST', 'Philippine Standard Time': 'PST', + 'Philippine Summer Time': 'PHST', 'Phoenix Islands Time': 'PHOT', 'Pitcairn Time': 'PIT', + 'Ponape Time': 'PONT', 'Pyongyang Time': 'KST', 'Qyzylorda Standard Time': 'QYZT', + 'Qyzylorda Summer Time': 'QYZST', 'Rothera Time': 'ROOTT', 'Réunion Time': 'RET', + 'Sakhalin Standard Time': 'SAKT', 'Sakhalin Summer Time': 'SAKST', 'Samara Standard Time': 'SAMT', + 'Samara Summer Time': 'SAMST', 'Samoa Standard Time': 'SST', 'Seychelles Time': 'SCT', + 'Singapore Standard Time': 'SGT', 'Solomon Islands Time': 'SBT', 'South Africa Standard Time': 'SAST', + 'South Georgia Time': 'GST', 'St. Pierre & Miquelon Daylight Time': 'PMDT', 'St. Pierre & Miquelon Standard Time': 'PMST', + 'Suriname Time': 'SRT', 'Syowa Time': 'SYOT', 'Tahiti Time': 'TAHT', + 'Taipei Daylight Time': 'TDT', 'Taipei Standard Time': 'CST', 'Tajikistan Time': 'TJT', + 'Tokelau Time': 'TKT', 'Tonga Standard Time': 'TOT', 'Tonga Summer Time': 'TOST', + 'Turkmenistan Standard Time': 'TMT', 'Tuvalu Time': 'TVT', 'Ulaanbaatar Standard Time': 'ULAT', + 'Ulaanbaatar Summer Time': 'ULAST', 'Uruguay Standard Time': 'UYT', 'Uruguay Summer Time': 'UYST', + 'Uzbekistan Standard Time': 'UZT', 'Uzbekistan Summer Time': 'UZST', 'Vanuatu Standard Time': 'VUT', + 'Vanuatu Summer Time': 'VUST', 'Venezuela Time': 'VET', 'Vladivostok Standard Time': 'VLAT', + 'Vladivostok Summer Time': 'VLAST', 'Volgograd Standard Time': 'VOLT', 'Volgograd Summer Time': 'VOLST', + 'Vostok Time': 'VOST', 'Wake Island Time': 'WAKT', 'Wallis & Futuna Time': 'WFT', + 'West Africa Standard Time': 'WAT', 'West Africa Summer Time': 'WAST', 'West Greenland Standard Time': 'WGST', + 'West Greenland Summer Time': 'WGST', 'West Kazakhstan Time': 'AQTT', 'Western Argentina Standard Time': 'ART', + 'Western Argentina Summer Time': 'ARST', 'Western European Standard Time': 'WET', 'Western European Summer Time': 'WEST', + 'Western Indonesia Time': 'WIB', 'Yakutsk Standard Time': 'YAKT', 'Yakutsk Summer Time': 'YAKST', + 'Yekaterinburg Standard Time': 'YEKT', 'Yekaterinburg Summer Time': 'YEKST', 'Yukon Time': 'YT' + }; + var options = { + hour12: false, weekday: 'short', year: 'numeric', month: 'numeric', day: 'numeric', + hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3 + }; var formatTZ = function (dateObj, arg, timeZone) { - options.timeZone = 'UTC'; - var utcObj = date.parse(new Intl.DateTimeFormat('en-US', options).format(dateObj), pattern); - utcObj.setMilliseconds(dateObj.getMilliseconds()); + var parts = (function () { + options.timeZone = timeZone || undefined; + var array = new Intl.DateTimeFormat('en-US', options).formatToParts(dateObj); + var values = {}; - options.timeZone = timeZone; - var dateObj2 = date.parse(new Intl.DateTimeFormat('en-US', options).format(dateObj), pattern); - dateObj2.setMilliseconds(dateObj.getMilliseconds()); + for (var i = 0, len = array.length; i < len; i++) { + var type = array[i].type; + var value = array[i].value; - dateObj2.getTimezoneOffset = function () { return (utcObj.getTime() - dateObj2.getTime()) / 60000 | 0; }; + switch (type) { + case 'weekday': + values[type] = 'SunMonTueWedThuFriSat'.indexOf(value) / 3; + break; + case 'year': + case 'month': + case 'day': + case 'hour': + case 'minute': + case 'second': + case 'fractionalSecond': + values[type] = value | 0; + } + } + return values; + }()); - return localized_date.format(dateObj2, arg); + return date.format({ + getFullYear: function () { return parts.year; }, + getMonth: function () { return parts.month - 1; }, + getDate: function () { return parts.day; }, + getHours: function () { return parts.hour; }, + getMinutes: function () { return parts.minute; }, + getSeconds: function () { return parts.second; }, + getMilliseconds: function () { return parts.fractionalSecond; }, + getDay: function () { return parts.weekday; }, + getTime: function () { return dateObj.getTime(); }, + getTimezoneOffset: function () { + return (dateObj.getTime() - Date.UTC( + parts.year, parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1), parts.day, + parts.hour, parts.minute, parts.second, parts.fractionalSecond + )) / 60000 | 0; + }, + getTimezoneName: function () { return timeZone || undefined; } + }, arg); }; var parseTZ = function (dateString, arg, timeZone) { - var pattern2 = typeof arg === 'string' ? date.compile(arg) : arg; - var dateObj = localized_date.parse(dateString, pattern2, !!timeZone); + var pattern = typeof arg === 'string' ? date.compile(arg) : arg; + var dateObj = date.parse(dateString, pattern, !!timeZone); + + var hasZ = function (array) { + for (var i = 1, len = array.length; i < len; i++) { + if (!array[i].indexOf('Z')) { + return true; + } + } + return false; + }; - if (!timeZone || ~date._parser.find(pattern2, 'ZZ').value || timeZone.toLowerCase() === 'utc') { + if (!timeZone || hasZ(pattern) || timeZone.toUpperCase() === 'UTC') { return dateObj; } - options.timeZone = timeZone; - var dateTimeFormat = new Intl.DateTimeFormat('en-US', options); - var dateString2 = date.format(dateObj, pattern, true); - var offset = (function () { - var keys = timeZone.toLowerCase().split('/'); + var getOffset = function (timeZoneName) { + var keys = (timeZoneName || '').toLowerCase().split('/'); var value = timeZones[keys[0]] || {}; for (var i = 1, len = keys.length; i < len; i++) { value = value[keys[i]] || {}; } return Array.isArray(value) ? value : []; - })(); + }; + + options.timeZone = 'UTC'; + var dateString2 = new Intl.DateTimeFormat('en-US', options).format(dateObj); + options.timeZone = timeZone || undefined; + var dateTimeFormat = new Intl.DateTimeFormat('en-US', options); + var offset = getOffset(timeZone); var comparer = function (d) { - return dateString2 === dateTimeFormat.format(d).replace(/[\u202f]/, ' '); + return dateString2 === dateTimeFormat.format(d); }; for (var j = 0, len2 = offset.length; j < len2; j++) { @@ -501,12 +628,36 @@ var plugin = function (date, localized_date) { return new Date(NaN); }; var transformTZ = function (dateString, arg1, arg2, timeZone) { - return formatTZ(localized_date.parse(dateString, arg1), arg2, timeZone); + return formatTZ(date.parse(dateString, arg1), arg2, timeZone); }; var name = 'timezone'; - date.plugin(name, { + var getName = function (d) { + var parts = new Intl.DateTimeFormat('en-US', { + timeZone: typeof d.getTimezoneName === 'function' ? d.getTimezoneName() : undefined, + timeZoneName: 'long' + }).formatToParts(d.getTime()); + + for (var i = 0, len = parts.length; i < len; i++) { + if (parts[i].type === 'timeZoneName') { + return parts[i].value; + } + } + return ''; + }; + + proto.plugin(name, { + formatter: { + z: function (d) { + var name = getName(d); + return timeZoneNames[name] || ''; + }, + zz: function (d) { + var name = getName(d); + return /^GMT[+-].+$/.test(name) ? '' : name; + } + }, extender: { formatTZ: formatTZ, parseTZ: parseTZ, @@ -516,4 +667,4 @@ var plugin = function (date, localized_date) { return name; }; -export default plugin; +export default plugin; \ No newline at end of file diff --git a/test/combination.js b/test/combination.js index c51824f..be95a9f 100644 --- a/test/combination.js +++ b/test/combination.js @@ -4,11 +4,11 @@ var expect = global.expect || require('expect.js'), date = global.date || require('date-and-time'), - en = typeof require === 'function' ? require('../locale/en') : 'en', - es = typeof require === 'function' ? require('../locale/es') : 'es', - ja = typeof require === 'function' ? require('../locale/ja') : 'ja'; + en = typeof require === 'function' ? require('date-and-time/locale/en') : 'en', + es = typeof require === 'function' ? require('date-and-time/locale/es') : 'es', + ja = typeof require === 'function' ? require('date-and-time/locale/ja') : 'ja'; - describe('locale change, then revert, format', function () { + describe('Change locale and revert, then format', function () { before(function () { date.locale(ja); date.locale(en); @@ -499,7 +499,7 @@ }); }); - describe('locale change, then revert, parse', function () { + describe('Change locale and revert, then parse', function () { before(function () { date.locale(ja); date.locale(en); @@ -889,7 +889,7 @@ }); }); - describe('locale change, then revert, extend', function () { + describe('Change locale and revert, then extend', function () { before(function () { date.locale(ja); date.locale(en); @@ -937,7 +937,7 @@ 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', // 12 - 18 'de la noche', 'de la noche', 'de la noche', 'de la noche', 'de la noche']; // 19 - 23 - describe('locale change to ja, then change to es, format', function () { + describe('Change the local to ja, then es, then format', function () { before(function () { date.locale(ja); date.locale(es); @@ -985,7 +985,7 @@ }); }); - describe('locale change to ja, then change to es, parse', function () { + describe('Change the locale to ja, then es, then parse', function () { before(function () { date.locale(ja); date.locale(es); @@ -1024,16 +1024,16 @@ var two_digit_year = 'two-digit-year'; if (typeof require === 'function') { - day_of_week = require('../plugin/day-of-week'); - meridiem = require('../plugin/meridiem'); - microsecond = require('../plugin/microsecond'); - ordinal = require('../plugin/ordinal'); - timespan = require('../plugin/timespan'); - timezone = require('../plugin/timezone'); - two_digit_year = require('../plugin/two-digit-year'); + day_of_week = require('date-and-time/plugin/day-of-week'); + meridiem = require('date-and-time/plugin/meridiem'); + microsecond = require('date-and-time/plugin/microsecond'); + ordinal = require('date-and-time/plugin/ordinal'); + timespan = require('date-and-time/plugin/timespan'); + timezone = require('date-and-time/plugin/timezone'); + two_digit_year = require('date-and-time/plugin/two-digit-year'); } - describe('multiple plugins install, format', function () { + describe('Install multiple plugins, then format', function () { before(function () { date.plugin(day_of_week); date.plugin(meridiem); @@ -1525,7 +1525,7 @@ }); }); - describe('multiple plugins install, parse', function () { + describe('Install multiple plugins, then parse', function () { before(function () { date.plugin(day_of_week); date.plugin(meridiem); @@ -1916,7 +1916,7 @@ }); }); - describe('multiple plugins install, extend', function () { + describe('Install multiple plugins, then extend', function () { before(function () { date.plugin(day_of_week); date.plugin(meridiem); @@ -1955,7 +1955,7 @@ A = ['AM', 'PM']; - describe('multiple locale change and multiple plugins', function () { + describe('Multiple locale changes and multiple plugin installations', function () { before(function () { date.locale(es); date.plugin(day_of_week); @@ -2535,7 +2535,7 @@ }); }); - describe('appling locale change to plugins', function () { + describe('Applying locale changes to plugins', function () { before(function () { date.locale(es); date.plugin(day_of_week); @@ -2794,4 +2794,42 @@ }); }); -}(this)); + describe('Applying other plugins to formatTZ, parseTZ and transformTZ', function () { + before(function () { + date.plugin(meridiem); + date.plugin(timezone); + }); + + it('formatTZ UTC-8', function () { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY h:mm:ss.SSS AA [UTC]Z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 A.M. UTC-0800'); + }); + + it('parseTZ UTC+10.5 (Start of DST)', function () { + // Oct 3 2021 3:00:00.000 => 2021-10-02T16:30:00.000Z + var dateString = 'Oct 3 2021 3:00:00.000 A.M.'; + var formatString = 'MMM D YYYY h:mm:ss.SSS AA'; + var tz = 'Australia/Adelaide'; // UTC+10.5 DST + var dateObj = new Date(Date.UTC(2021, 9, 2, 16, 30, 0, 0)); + + expect(date.parseTZ(dateString, formatString, tz).getTime()).to.equal(dateObj.getTime()); + }); + + it('transformTZ PDT to JST', function () { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY h:mm:ss.SSS AA'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 7:00:00.000 P.M.'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + }); + +}(this)); \ No newline at end of file diff --git a/test/esm/combination.mjs b/test/esm/combination.mjs index 74ebfe5..8a9679f 100644 --- a/test/esm/combination.mjs +++ b/test/esm/combination.mjs @@ -17,7 +17,7 @@ import two_digit_year from 'date-and-time/plugin/two-digit-year'; import expect from 'expect.js'; -describe('locale change, then revert, format', () => { +describe('Change locale and revert, then format', () => { before(() => { locale(ja); locale(en); @@ -508,7 +508,7 @@ describe('locale change, then revert, format', () => { }); }); -describe('locale change, then revert, parse', () => { +describe('Change locale and revert, then parse', () => { before(() => { locale(ja); locale(en); @@ -898,7 +898,7 @@ describe('locale change, then revert, parse', () => { }); }); -describe('locale change, then revert, extend', () => { +describe('Change locale and revert, then extend', () => { before(() => { locale(ja); locale(en); @@ -939,7 +939,7 @@ const es_A = ['de la mañana', 'de la mañana', 'de la mañana', 'de la mañana' 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', 'de la tarde', // 12 - 18 'de la noche', 'de la noche', 'de la noche', 'de la noche', 'de la noche']; // 19 - 23 -describe('locale change to ja, then change to es, format', () => { +describe('Change the local to ja, then es, then format', () => { before(() => { locale(ja); locale(es); @@ -987,7 +987,7 @@ describe('locale change to ja, then change to es, format', () => { }); }); -describe('locale change to ja, then change to es, parse', () => { +describe('Change the locale to ja, then es, then parse', () => { before(() => { locale(ja); locale(es); @@ -1017,7 +1017,7 @@ describe('locale change to ja, then change to es, parse', () => { }); }); -describe('multiple plugins install, format', () => { +describe('Install multiple plugins, then format', () => { before(() => { plugin(day_of_week); plugin(meridiem); @@ -1499,7 +1499,7 @@ describe('multiple plugins install, format', () => { }); }); -describe('multiple locale change and multiple plugins', () => { +describe('Install multiple plugins, then parse', () => { let timeSpan, formatTZ, parseTZ; before(() => { @@ -2088,7 +2088,7 @@ describe('multiple locale change and multiple plugins', () => { }); }); -describe('appling locale change to timezone plugins', () => { +describe('Applying locale changes to plugins', () => { let formatTZ, parseTZ; before(() => { @@ -2350,3 +2350,41 @@ describe('appling locale change to timezone plugins', () => { locale(en); }); }); + +describe('Applying other plugins to formatTZ, parseTZ and transformTZ', () => { + before(() => { + date.plugin(meridiem); + date.plugin(timezone); + }); + + it('formatTZ UTC-8', () => { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY h:mm:ss.SSS AA [UTC]Z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 A.M. UTC-0800'); + }); + + it('parseTZ UTC+10.5 (Start of DST)', () => { + // Oct 3 2021 3:00:00.000 => 2021-10-02T16:30:00.000Z + var dateString = 'Oct 3 2021 3:00:00.000 A.M.'; + var formatString = 'MMM D YYYY h:mm:ss.SSS AA'; + var tz = 'Australia/Adelaide'; // UTC+10.5 DST + var dateObj = new Date(Date.UTC(2021, 9, 2, 16, 30, 0, 0)); + + expect(date.parseTZ(dateString, formatString, tz).getTime()).to.equal(dateObj.getTime()); + }); + + it('transformTZ PDT to JST', () => { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY h:mm:ss.SSS AA'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 7:00:00.000 P.M.'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); +}); diff --git a/test/esm/plugin/timezone.mjs b/test/esm/plugin/timezone.mjs index 072f2d5..a8cb0dd 100644 --- a/test/esm/plugin/timezone.mjs +++ b/test/esm/plugin/timezone.mjs @@ -281,4 +281,364 @@ describe('timezone', () => { // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); }); + + describe('additional tokens', () => { + it('formatTZ PST', () => { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 PST'); + }); + + it('formatTZ PDT (Start of DST)', () => { + // 2021-03-14T10:00:00.000Z => March 14 2021 3:00:00.000 + var dateObj = new Date(Date.UTC(2021, 2, 14, 10, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 3:00:00.000 PDT'); + }); + + it('formatTZ PDT (End of DST)', () => { + // 2021-11-07T08:59:59.999Z => November 7 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 10, 7, 8, 59, 59, 999)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:59:59.999 PDT'); + }); + + it('formatTZ PST', () => { + // 2021-11-07T09:00:00.000Z => November 7 2021 1:00:00.000 + var dateObj = new Date(Date.UTC(2021, 10, 7, 9, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:00:00.000 PST'); + }); + + it('formatTZ JST', () => { + // 2021-03-14T09:59:59.999Z => March 14 2021 18:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 18:59:59.999 JST'); + }); + + it('formatTZ Pacific Standard Time', () => { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 Pacific Standard Time'); + }); + + it('formatTZ Pacific Daylight Time (Start of DST)', () => { + // 2021-03-14T10:00:00.000Z => March 14 2021 3:00:00.000 + var dateObj = new Date(Date.UTC(2021, 2, 14, 10, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 3:00:00.000 Pacific Daylight Time'); + }); + + it('formatTZ Pacific Daylight Time (End of DST)', () => { + // 2021-11-07T08:59:59.999Z => November 7 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 10, 7, 8, 59, 59, 999)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:59:59.999 Pacific Daylight Time'); + }); + + it('formatTZ Pacific Standard Time', () => { + // 2021-11-07T09:00:00.000Z => November 7 2021 1:00:00.000 + var dateObj = new Date(Date.UTC(2021, 10, 7, 9, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:00:00.000 Pacific Standard Time'); + }); + + it('formatTZ Japan Standard Time', () => { + // 2021-03-14T09:59:59.999Z => March 14 2021 18:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 18:59:59.999 Japan Standard Time'); + }); + + it('transformTZ EST to PST', () => { + var dateString1 = '2021-11-07T04:00:00.000 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'November 7 2021 1:00:00.000 PST'; + + // 2021-11-07T04:00:00.000 UTC-0500 => November 7 2021 1:00:00.000 PST + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to PDT (End of DST)', () => { + var dateString1 = '2021-11-07T03:59:59.999 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'November 7 2021 1:59:59.999 PDT'; + + // 2021-11-07T03:59:59.999 UTC-0500 => November 7 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to PST', () => { + var dateString1 = '2021-03-14T05:59:59.999 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'March 14 2021 1:59:59.999 PST'; + + // 2021-03-14T05:59:59.999 UTC-0400 => March 14 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to PDT (Start of DST)', () => { + var dateString1 = '2021-03-14T06:00:00.000 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'March 14 2021 3:00:00.000 PDT'; + + // 2021-03-14T06:00:00.000 UTC-0400 => March 14 2021 3:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PST to JST', () => { + var dateString1 = '2021-03-14T01:59:59.999 UTC-0800'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 18:59:59.999 JST'; + + // 2021-03-14T01:59:59.999 UTC-0800 => March 14 2021 18:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PDT to JST', () => { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 19:00:00.000 JST'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ UTC to JST', () => { + var dateString1 = '2021-03-14T03:00:00.000 UTC+0000'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 12:00:00.000 JST'; + + // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to Pacific Standard Time', () => { + var dateString1 = '2021-11-07T04:00:00.000 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'November 7 2021 1:00:00.000 Pacific Standard Time'; + + // 2021-11-07T04:00:00.000 UTC-0500 => November 7 2021 1:00:00.000 PST + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to Pacific Daylight Time (End of DST)', () => { + var dateString1 = '2021-11-07T03:59:59.999 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'November 7 2021 1:59:59.999 Pacific Daylight Time'; + + // 2021-11-07T03:59:59.999 UTC-0500 => November 7 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to Pacific Standard Time', () => { + var dateString1 = '2021-03-14T05:59:59.999 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'March 14 2021 1:59:59.999 Pacific Standard Time'; + + // 2021-03-14T05:59:59.999 UTC-0400 => March 14 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to Pacific Daylight Time (Start of DST)', () => { + var dateString1 = '2021-03-14T06:00:00.000 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'March 14 2021 3:00:00.000 Pacific Daylight Time'; + + // 2021-03-14T06:00:00.000 UTC-0400 => March 14 2021 3:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PST to Japan Standard Time', () => { + var dateString1 = '2021-03-14T01:59:59.999 UTC-0800'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 18:59:59.999 Japan Standard Time'; + + // 2021-03-14T01:59:59.999 UTC-0800 => March 14 2021 18:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PDT to Japan Standard Time', () => { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 19:00:00.000 Japan Standard Time'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ UTC to Japan Standard Time', () => { + var dateString1 = '2021-03-14T03:00:00.000 UTC+0000'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 12:00:00.000 Japan Standard Time'; + + // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + }); + + describe('format', () => { + before(() => { + process.env.TZ = 'America/Los_Angeles'; + }); + + it('"z" equals to "PST"', () => { + // Before the start of daylight saving time + var now = new Date(2024, 2, 10, 1, 59, 59, 999); + expect(date.format(now, 'z')).to.equal('PST'); + }); + + it('"z" equals to "PDT"', () => { + // Daylight saving time started + var now = new Date(2024, 2, 10, 2, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PDT"', () => { + // Before the end of daylight saving time + var now = new Date(2024, 10, 3, 1, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PST"', () => { + // Daylight saving time ends + var now = new Date(2024, 10, 3, 2, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PST'); + }); + + it('"zz" equals to "Pacific Standard Time"', () => { + // Before the start of daylight saving time + var now = new Date(2024, 2, 10, 1, 59, 59, 999); + expect(date.format(now, 'zz')).to.equal('Pacific Standard Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', () => { + // Daylight saving time started + var now = new Date(2024, 2, 10, 2, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', () => { + // Before the end of daylight saving time + var now = new Date(2024, 10, 3, 1, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Standard Time"', () => { + // Daylight saving time ends + var now = new Date(2024, 10, 3, 2, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Standard Time'); + }); + }); + + describe('transform', () => { + before(() => { + process.env.TZ = 'America/Los_Angeles'; + }); + + it('"z" equals to "PST"', () => { + // Before the start of daylight saving time + expect(date.transform('10 March 2024, 01:59:59.999', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PST'); + }); + + it('"z" equals to "PDT"', () => { + // Daylight saving time started + expect(date.transform('10 March 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PDT"', () => { + // Before the end of daylight saving time + expect(date.transform('3 November 2024, 01:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PST"', () => { + // Daylight saving time ends + expect(date.transform('3 November 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PST'); + }); + + it('"zz" equals to "Pacific Standard Time"', () => { + // Before the start of daylight saving time + expect(date.transform('10 March 2024, 01:59:59.999', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Standard Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', () => { + // Daylight saving time started + expect(date.transform('10 March 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', () => { + // Before the end of daylight saving time + expect(date.transform('3 November 2024, 01:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Standard Time"', () => { + // Daylight saving time ends + expect(date.transform('3 November 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Standard Time'); + }); + }); }); diff --git a/test/plugin/timezone.js b/test/plugin/timezone.js index ea8f83d..a4a2975 100644 --- a/test/plugin/timezone.js +++ b/test/plugin/timezone.js @@ -290,6 +290,366 @@ // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); }); + + describe('additional tokens', function () { + it('formatTZ PST', function () { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 PST'); + }); + + it('formatTZ PDT (Start of DST)', function () { + // 2021-03-14T10:00:00.000Z => March 14 2021 3:00:00.000 + var dateObj = new Date(Date.UTC(2021, 2, 14, 10, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 3:00:00.000 PDT'); + }); + + it('formatTZ PDT (End of DST)', function () { + // 2021-11-07T08:59:59.999Z => November 7 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 10, 7, 8, 59, 59, 999)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:59:59.999 PDT'); + }); + + it('formatTZ PST', function () { + // 2021-11-07T09:00:00.000Z => November 7 2021 1:00:00.000 + var dateObj = new Date(Date.UTC(2021, 10, 7, 9, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:00:00.000 PST'); + }); + + it('formatTZ JST', function () { + // 2021-03-14T09:59:59.999Z => March 14 2021 18:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 18:59:59.999 JST'); + }); + + it('formatTZ Pacific Standard Time', function () { + // 2021-03-14T09:59:59.999Z => March 14 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 1:59:59.999 Pacific Standard Time'); + }); + + it('formatTZ Pacific Daylight Time (Start of DST)', function () { + // 2021-03-14T10:00:00.000Z => March 14 2021 3:00:00.000 + var dateObj = new Date(Date.UTC(2021, 2, 14, 10, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 3:00:00.000 Pacific Daylight Time'); + }); + + it('formatTZ Pacific Daylight Time (End of DST)', function () { + // 2021-11-07T08:59:59.999Z => November 7 2021 1:59:59.999 + var dateObj = new Date(Date.UTC(2021, 10, 7, 8, 59, 59, 999)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:59:59.999 Pacific Daylight Time'); + }); + + it('formatTZ Pacific Standard Time', function () { + // 2021-11-07T09:00:00.000Z => November 7 2021 1:00:00.000 + var dateObj = new Date(Date.UTC(2021, 10, 7, 9, 0, 0, 0)); + var formatString = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('November 7 2021 1:00:00.000 Pacific Standard Time'); + }); + + it('formatTZ Japan Standard Time', function () { + // 2021-03-14T09:59:59.999Z => March 14 2021 18:59:59.999 + var dateObj = new Date(Date.UTC(2021, 2, 14, 9, 59, 59, 999)); + var formatString = 'MMMM DD YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; + + expect(date.formatTZ(dateObj, formatString, tz)).to.equal('March 14 2021 18:59:59.999 Japan Standard Time'); + }); + + it('transformTZ EST to PST', function () { + var dateString1 = '2021-11-07T04:00:00.000 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'November 7 2021 1:00:00.000 PST'; + + // 2021-11-07T04:00:00.000 UTC-0500 => November 7 2021 1:00:00.000 PST + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to PDT (End of DST)', function () { + var dateString1 = '2021-11-07T03:59:59.999 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'November 7 2021 1:59:59.999 PDT'; + + // 2021-11-07T03:59:59.999 UTC-0500 => November 7 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to PST', function () { + var dateString1 = '2021-03-14T05:59:59.999 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'March 14 2021 1:59:59.999 PST'; + + // 2021-03-14T05:59:59.999 UTC-0400 => March 14 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to PDT (Start of DST)', function () { + var dateString1 = '2021-03-14T06:00:00.000 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'March 14 2021 3:00:00.000 PDT'; + + // 2021-03-14T06:00:00.000 UTC-0400 => March 14 2021 3:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PST to JST', function () { + var dateString1 = '2021-03-14T01:59:59.999 UTC-0800'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 18:59:59.999 JST'; + + // 2021-03-14T01:59:59.999 UTC-0800 => March 14 2021 18:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PDT to JST', function () { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 19:00:00.000 JST'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ UTC to JST', function () { + var dateString1 = '2021-03-14T03:00:00.000 UTC+0000'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS z'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 12:00:00.000 JST'; + + // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to Pacific Standard Time', function () { + var dateString1 = '2021-11-07T04:00:00.000 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'November 7 2021 1:00:00.000 Pacific Standard Time'; + + // 2021-11-07T04:00:00.000 UTC-0500 => November 7 2021 1:00:00.000 PST + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EST to Pacific Daylight Time (End of DST)', function () { + var dateString1 = '2021-11-07T03:59:59.999 UTC-0500'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'November 7 2021 1:59:59.999 Pacific Daylight Time'; + + // 2021-11-07T03:59:59.999 UTC-0500 => November 7 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to Pacific Standard Time', function () { + var dateString1 = '2021-03-14T05:59:59.999 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-8 + + var dateString2 = 'March 14 2021 1:59:59.999 Pacific Standard Time'; + + // 2021-03-14T05:59:59.999 UTC-0400 => March 14 2021 1:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ EDT to Pacific Daylight Time (Start of DST)', function () { + var dateString1 = '2021-03-14T06:00:00.000 UTC-0400'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'America/Los_Angeles'; // UTC-7 DST + + var dateString2 = 'March 14 2021 3:00:00.000 Pacific Daylight Time'; + + // 2021-03-14T06:00:00.000 UTC-0400 => March 14 2021 3:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PST to Japan Standard Time', function () { + var dateString1 = '2021-03-14T01:59:59.999 UTC-0800'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 18:59:59.999 Japan Standard Time'; + + // 2021-03-14T01:59:59.999 UTC-0800 => March 14 2021 18:59:59.999 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ PDT to Japan Standard Time', function () { + var dateString1 = '2021-03-14T03:00:00.000 UTC-0700'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 19:00:00.000 Japan Standard Time'; + + // 2021-03-14T03:00:00.000 UTC-0700 => March 14 2021 19:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + + it('transformTZ UTC to Japan Standard Time', function () { + var dateString1 = '2021-03-14T03:00:00.000 UTC+0000'; + var formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS [UTC]Z'; + var formatString2 = 'MMMM D YYYY H:mm:ss.SSS zz'; + var tz = 'Asia/Tokyo'; // UTC+9 + + var dateString2 = 'March 14 2021 12:00:00.000 Japan Standard Time'; + + // 2021-03-14T03:00:00.000 UTC+0000 => March 14 2021 12:00:00.000 + expect(date.transformTZ(dateString1, formatString1, formatString2, tz)).to.equal(dateString2); + }); + }); + + describe('format', function () { + before(function () { + process.env.TZ = 'America/Los_Angeles'; + }); + + it('"z" equals to "PST"', function () { + // Before the start of daylight saving time + var now = new Date(2024, 2, 10, 1, 59, 59, 999); + expect(date.format(now, 'z')).to.equal('PST'); + }); + + it('"z" equals to "PDT"', function () { + // Daylight saving time started + var now = new Date(2024, 2, 10, 2, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PDT"', function () { + // Before the end of daylight saving time + var now = new Date(2024, 10, 3, 1, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PST"', function () { + // Daylight saving time ends + var now = new Date(2024, 10, 3, 2, 0, 0, 0); + expect(date.format(now, 'z')).to.equal('PST'); + }); + + it('"zz" equals to "Pacific Standard Time"', function () { + // Before the start of daylight saving time + var now = new Date(2024, 2, 10, 1, 59, 59, 999); + expect(date.format(now, 'zz')).to.equal('Pacific Standard Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', function () { + // Daylight saving time started + var now = new Date(2024, 2, 10, 2, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', function () { + // Before the end of daylight saving time + var now = new Date(2024, 10, 3, 1, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Standard Time"', function () { + // Daylight saving time ends + var now = new Date(2024, 10, 3, 2, 0, 0, 0); + expect(date.format(now, 'zz')).to.equal('Pacific Standard Time'); + }); + }); + + describe('transform', function () { + before(function () { + process.env.TZ = 'America/Los_Angeles'; + }); + + it('"z" equals to "PST"', function () { + // Before the start of daylight saving time + expect(date.transform('10 March 2024, 01:59:59.999', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PST'); + }); + + it('"z" equals to "PDT"', function () { + // Daylight saving time started + expect(date.transform('10 March 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PDT"', function () { + // Before the end of daylight saving time + expect(date.transform('3 November 2024, 01:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PDT'); + }); + + it('"z" equals to "PST"', function () { + // Daylight saving time ends + expect(date.transform('3 November 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'z')).to.equal('PST'); + }); + + it('"zz" equals to "Pacific Standard Time"', function () { + // Before the start of daylight saving time + expect(date.transform('10 March 2024, 01:59:59.999', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Standard Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', function () { + // Daylight saving time started + expect(date.transform('10 March 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Daylight Time"', function () { + // Before the end of daylight saving time + expect(date.transform('3 November 2024, 01:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Daylight Time'); + }); + + it('"zz" equals to "Pacific Standard Time"', function () { + // Daylight saving time ends + expect(date.transform('3 November 2024, 02:00:00.000', 'D MMMM YYYY, HH:mm:ss.SSS', 'zz')).to.equal('Pacific Standard Time'); + }); + }); }); }(this));