Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
...
Checking mergeability… Don't worry, you can still create the pull request.
  • 9 commits
  • 7 files changed
  • 0 commit comments
  • 2 contributors
View
2  Makefile
@@ -8,7 +8,7 @@ test:
TZ=America/Vancouver node test/test.js
TZ=CET node test/test.js
-test-minified:
+test-minified: minify
TZ=America/Vancouver node test/test.js ../strftime-min.js
TZ=CET node test/test.js ../strftime-min.js
View
15 Readme.md
@@ -16,7 +16,7 @@ Usage
=====
var strftime = require('strftime')
- console.log(strftime('%B %d, %y %H:%M:%S')) // => April 28, 2011 18:21:08
+ console.log(strftime('%B %d, %Y %H:%M:%S')) // => April 28, 2011 18:21:08
console.log(strftime('%F %T', new Date(1307472705067))) // => 2011-06-07 18:51:45
@@ -35,15 +35,15 @@ If you want to localize it:
AM: 'AM',
PM: 'PM'
}
- console.log(strftime('%B %d, %y %H:%M:%S', it_IT)) // => aprile 28, 2011 18:21:08
- console.log(strftime('%B %d, %y %H:%M:%S', new Date(1307472705067), it_IT)) // => giugno 7, 2011 18:51:45
+ console.log(strftime('%B %d, %Y %H:%M:%S', it_IT)) // => aprile 28, 2011 18:21:08
+ console.log(strftime('%B %d, %Y %H:%M:%S', new Date(1307472705067), it_IT)) // => giugno 7, 2011 18:51:45
And if you don't want to pass a localization object every time you can get a localized `strftime` function like so:
var strftime = require('strftime')
var it_IT = { /* same as above */ }
var strftime_IT = strftime.localizedStrftime(it_IT)
- console.log(strftime_IT('%B %d, %y %H:%M:%S')) // aprile 28, 2011 18:21:08
+ console.log(strftime_IT('%B %d, %Y %H:%M:%S')) // aprile 28, 2011 18:21:08
Time zones can be passed in as an offset from GMT in minutes.
@@ -53,6 +53,13 @@ Time zones can be passed in as an offset from GMT in minutes.
console.log(strftimeTZ('%F %T', new Date(1307472705067), 120)) // => 2011-06-07 20:51:45
+Alternatively you can use the timezone format used by ISO 8601, `+HHMM` or `-HHMM`.
+
+ var strftimeTZ = require('strftime').strftimeTZ
+ console.log(strftimeTZ('', new Date(1307472705067), '-0700')) // => June 07, 11 11:51:45
+ console.log(strftimeTZ('%F %T', new Date(1307472705067), '+0200')) // => 2011-06-07 20:51:45
+
+
Supported Specifiers
====================
View
2  component.json
@@ -3,7 +3,7 @@
"repo": "samsonjs/strftime",
"description": "strftime date formatting",
"keywords": ["strftime", "format", "date", "time"],
- "version": "0.7.0",
+ "version": "0.8.0",
"main": "strftime.js",
"scripts": ["strftime.js"]
}
View
2  package.json
@@ -1,7 +1,7 @@
{
"name": "strftime",
"description": "strftime for JavaScript",
- "version": "0.7.0",
+ "version": "0.8.0",
"homepage": "http://samhuri.net/proj/strftime",
"author": "Sami Samhuri <sami@samhuri.net>",
"contributors": [
View
15 strftime-min.js
@@ -1,7 +1,8 @@
-(function(){function f(d,a,b){return g(d,a,b,!1)}function g(d,a,b,f){a&&!m(a)&&(b=a,a=void 0);a=a||new Date;b=b||n;b.formats=b.formats||{};var h=0;f&&(h=(a.getTimezoneOffset()||0)*6E4,a=new Date(a.getTime()+h));return d.replace(/%([-_0]?.)/g,function(d,i){var c;if(i.length==2){c=i[0];if(c=="-")c="";else if(c=="_")c=" ";else if(c=="0")c="0";else return d;i=i[1]}switch(i){case "A":return b.days[a.getDay()];case "a":return b.shortDays[a.getDay()];case "B":return b.months[a.getMonth()];case "b":return b.shortMonths[a.getMonth()];
-case "C":return e(Math.floor(a.getFullYear()/100),c);case "D":return g(b.formats.D||"%m/%d/%y",a,b);case "d":return e(a.getDate(),c);case "e":return a.getDate();case "F":return g(b.formats.F||"%Y-%m-%d",a,b);case "H":return e(a.getHours(),c);case "h":return b.shortMonths[a.getMonth()];case "I":return e(j(a),c);case "j":return c=new Date(a.getFullYear(),0,1),c=Math.ceil((a.getTime()-c.getTime())/864E5),e(c,3);case "k":return e(a.getHours(),c==null?" ":c);case "L":return e(Math.floor(a.getTime()%1E3),
-3);case "l":return e(j(a),c==null?" ":c);case "M":return e(a.getMinutes(),c);case "m":return e(a.getMonth()+1,c);case "n":return"\n";case "o":return String(a.getDate())+o(a.getDate());case "P":return a.getHours()<12?b.am:b.pm;case "p":return a.getHours()<12?b.AM:b.PM;case "R":return g(b.formats.R||"%H:%M",a,b);case "r":return g(b.formats.r||"%I:%M:%S %p",a,b);case "S":return e(a.getSeconds(),c);case "s":return Math.floor((a.getTime()-h)/1E3);case "T":return g(b.formats.T||"%H:%M:%S",a,b);case "t":return"\t";
-case "U":return e(k(a,"sunday"),c);case "u":return c=a.getDay(),c==0?7:c;case "v":return g(b.formats.v||"%e-%b-%Y",a,b);case "W":return e(k(a,"monday"),c);case "w":return a.getDay();case "Y":return a.getFullYear();case "y":return c=String(a.getFullYear()),c.slice(c.length-2);case "Z":return f?"GMT":(c=a.toString().match(/\((\w+)\)/))&&c[1]||"";case "z":return f?"+0000":(c=a.getTimezoneOffset(),(c<0?"+":"-")+e(Math.abs(c/60))+e(c%60));default:return i}})}function m(d){for(var a=0,b=l.length,a=0;a<
-b;++a)if(typeof d[l[a]]!="function")return!1;return!0}function e(d,a,b){typeof a==="number"&&(b=a,a="0");a==null&&(a="0");b=b||2;d=String(d);if(a)for(;d.length<b;)d=a+d;return d}function j(d){d=d.getHours();d==0?d=12:d>12&&(d-=12);return d}function o(d){var a=d%10;d%=100;if(d>=11&&d<=13||a===0||a>=4)return"th";switch(a){case 1:return"st";case 2:return"nd";case 3:return"rd"}}function k(d,a){var a=a||"sunday",b=d.getDay();a=="monday"&&(b==0?b=6:b--);var e=new Date(d.getFullYear(),0,1);return Math.floor(((d-
-e)/864E5+7-b)/7)}var h;h=typeof module!=="undefined"?module.exports=f:function(){return this||(0,eval)("this")}();h.strftime=f;h.strftimeUTC=f.strftimeUTC=function(d,a,b){return g(d,a,b,!0)};h.localizedStrftime=f.localizedStrftime=function(d){return function(a,b){return f(a,b,d)}};var n={days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),months:"January February March April May June July August September October November December".split(" "),
-shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm"},l=["getTime","getTimezoneOffset","getDay","getDate","getMonth","getFullYear","getYear","getHours","getMinutes","getSeconds"]})();
+(function(){function i(c,a,b){return g(c,a,b)}function g(c,a,b,j){j=j||{};a&&!n(a)&&(b=a,a=void 0);a=a||new Date;b=b||o;b.formats=b.formats||{};var i=a.getTime(),h=j.timezone,e=typeof h;if(j.utc||e=="number"||e=="string")a=p(a);if(h){if(e=="string")var k=h[0]=="-"?-1:1,q=parseInt(h.slice(1,3),10),r=parseInt(h.slice(3,5),10),h=k*60*q+r;e&&(a=new Date(a.getTime()+h*6E4))}return c.replace(/%([-_0]?.)/g,function(c,e){var d;if(e.length==2){d=e[0];if(d=="-")d="";else if(d=="_")d=" ";else if(d=="0")d="0";
+else return c;e=e[1]}switch(e){case "A":return b.days[a.getDay()];case "a":return b.shortDays[a.getDay()];case "B":return b.months[a.getMonth()];case "b":return b.shortMonths[a.getMonth()];case "C":return f(Math.floor(a.getFullYear()/100),d);case "D":return g(b.formats.D||"%m/%d/%y",a,b);case "d":return f(a.getDate(),d);case "e":return a.getDate();case "F":return g(b.formats.F||"%Y-%m-%d",a,b);case "H":return f(a.getHours(),d);case "h":return b.shortMonths[a.getMonth()];case "I":return f(l(a),d);
+case "j":return d=new Date(a.getFullYear(),0,1),d=Math.ceil((a.getTime()-d.getTime())/864E5),f(d,3);case "k":return f(a.getHours(),d==null?" ":d);case "L":return f(Math.floor(i%1E3),3);case "l":return f(l(a),d==null?" ":d);case "M":return f(a.getMinutes(),d);case "m":return f(a.getMonth()+1,d);case "n":return"\n";case "o":return String(a.getDate())+s(a.getDate());case "P":return a.getHours()<12?b.am:b.pm;case "p":return a.getHours()<12?b.AM:b.PM;case "R":return g(b.formats.R||"%H:%M",a,b);case "r":return g(b.formats.r||
+"%I:%M:%S %p",a,b);case "S":return f(a.getSeconds(),d);case "s":return Math.floor(i/1E3);case "T":return g(b.formats.T||"%H:%M:%S",a,b);case "t":return"\t";case "U":return f(m(a,"sunday"),d);case "u":return d=a.getDay(),d==0?7:d;case "v":return g(b.formats.v||"%e-%b-%Y",a,b);case "W":return f(m(a,"monday"),d);case "w":return a.getDay();case "Y":return a.getFullYear();case "y":return d=String(a.getFullYear()),d.slice(d.length-2);case "Z":return j.utc?"GMT":(d=a.toString().match(/\((\w+)\)/))&&d[1]||
+"";case "z":return j.utc?"+0000":(d=typeof h=="number"?h:-a.getTimezoneOffset(),(d<0?"-":"+")+f(Math.abs(d/60))+f(d%60));default:return e}})}function p(c){var a=(c.getTimezoneOffset()||0)*6E4;return new Date(c.getTime()+a)}function n(c){for(var a=0,b=k.length,a=0;a<b;++a)if(typeof c[k[a]]!="function")return!1;return!0}function f(c,a,b){typeof a==="number"&&(b=a,a="0");a==null&&(a="0");b=b||2;c=String(c);if(a)for(;c.length<b;)c=a+c;return c}function l(c){c=c.getHours();c==0?c=12:c>12&&(c-=12);return c}
+function s(c){var a=c%10;c%=100;if(c>=11&&c<=13||a===0||a>=4)return"th";switch(a){case 1:return"st";case 2:return"nd";case 3:return"rd"}}function m(c,a){var a=a||"sunday",b=c.getDay();a=="monday"&&(b==0?b=6:b--);var e=new Date(c.getFullYear(),0,1);return Math.floor(((c-e)/864E5+7-b)/7)}var e;e=typeof module!=="undefined"?module.exports=i:function(){return this||(0,eval)("this")}();var o={days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),
+months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),AM:"AM",PM:"PM",am:"am",pm:"pm"};e.strftime=i;e.strftimeTZ=i.strftimeTZ=function(c,a,b,e){if((typeof b=="number"||typeof b=="string")&&e==null)e=b,b=void 0;return g(c,a,b,{timezone:e})};e.strftimeUTC=i.strftimeUTC=function(c,a,b){return g(c,a,b,{utc:!0})};e.localizedStrftime=i.localizedStrftime=function(c){return function(a,
+b){return g(a,b,c)}};var k=["getTime","getTimezoneOffset","getDay","getDate","getMonth","getFullYear","getYear","getHours","getMinutes","getSeconds"]})();
View
108 strftime.js
@@ -46,7 +46,7 @@
// locale is optional
namespace.strftimeTZ = strftime.strftimeTZ = strftimeTZ;
function strftimeTZ(fmt, d, locale, timezone) {
- if (typeof locale == 'number' && timezone == null) {
+ if ((typeof locale == 'number' || typeof locale == 'string') && timezone == null) {
timezone = locale;
locale = undefined;
}
@@ -88,12 +88,27 @@
// Hang on to this Unix timestamp because we might mess with it directly below.
var timestamp = d.getTime();
- if (options.utc || typeof options.timezone == 'number') {
+ var tz = options.timezone;
+ var tzType = typeof tz;
+
+ if (options.utc || tzType == 'number' || tzType == 'string') {
d = dateToUTC(d);
}
- if (typeof options.timezone == 'number') {
- d = new Date(d.getTime() + (options.timezone * 60000));
+ if (tz) {
+ // ISO 8601 format timezone string, [-+]HHMM
+ //
+ // Convert to the number of minutes and it'll be applied to the date below.
+ if (tzType == 'string') {
+ var sign = tz[0] == '-' ? -1 : 1;
+ var hours = parseInt(tz.slice(1, 3), 10);
+ var mins = parseInt(tz.slice(3, 5), 10);
+ tz = sign * (60 * hours) + mins;
+ }
+
+ if (tzType) {
+ d = new Date(d.getTime() + (tz * 60000));
+ }
}
// Most of the specifiers supported by C's strftime, and some from Ruby.
@@ -101,6 +116,7 @@
// to pad with nothing, space, or zero (respectively).
return fmt.replace(/%([-_0]?.)/g, function(_, c) {
var mod, padding;
+
if (c.length == 2) {
mod = c[0];
// omit padding
@@ -121,65 +137,143 @@
}
c = c[1];
}
+
switch (c) {
+
+ // Examples for new Date(0) in GMT
+
+ // 'Thursday'
case 'A': return locale.days[d.getDay()];
+
+ // 'Thu'
case 'a': return locale.shortDays[d.getDay()];
+
+ // 'January'
case 'B': return locale.months[d.getMonth()];
+
+ // 'Jan'
case 'b': return locale.shortMonths[d.getMonth()];
+
+ // '19'
case 'C': return pad(Math.floor(d.getFullYear() / 100), padding);
+
+ // '01/01/70'
case 'D': return _strftime(locale.formats.D || '%m/%d/%y', d, locale);
+
+ // '01'
case 'd': return pad(d.getDate(), padding);
+
+ // '01'
case 'e': return d.getDate();
+
+ // '1970-01-01'
case 'F': return _strftime(locale.formats.F || '%Y-%m-%d', d, locale);
+
+ // '00'
case 'H': return pad(d.getHours(), padding);
+
+ // 'Jan'
case 'h': return locale.shortMonths[d.getMonth()];
+
+ // '12'
case 'I': return pad(hours12(d), padding);
+
+ // '000'
case 'j':
var y = new Date(d.getFullYear(), 0, 1);
var day = Math.ceil((d.getTime() - y.getTime()) / (1000 * 60 * 60 * 24));
return pad(day, 3);
+
+ // ' 0'
case 'k': return pad(d.getHours(), padding == null ? ' ' : padding);
+
+ // '000'
case 'L': return pad(Math.floor(timestamp % 1000), 3);
+
+ // '12'
case 'l': return pad(hours12(d), padding == null ? ' ' : padding);
+
+ // '00'
case 'M': return pad(d.getMinutes(), padding);
+
+ // '01'
case 'm': return pad(d.getMonth() + 1, padding);
+
+ // '\n'
case 'n': return '\n';
+
+ // '1st'
case 'o': return String(d.getDate()) + ordinal(d.getDate());
+
+ // 'am'
case 'P': return d.getHours() < 12 ? locale.am : locale.pm;
+
+ // 'AM'
case 'p': return d.getHours() < 12 ? locale.AM : locale.PM;
+
+ // '00:00'
case 'R': return _strftime(locale.formats.R || '%H:%M', d, locale);
+
+ // '12:00:00 AM'
case 'r': return _strftime(locale.formats.r || '%I:%M:%S %p', d, locale);
+
+ // '00'
case 'S': return pad(d.getSeconds(), padding);
+
+ // '0'
case 's': return Math.floor(timestamp / 1000);
+
+ // '00:00:00'
case 'T': return _strftime(locale.formats.T || '%H:%M:%S', d, locale);
+
+ // '\t'
case 't': return '\t';
+
+ // '00'
case 'U': return pad(weekNumber(d, 'sunday'), padding);
+
+ // '4'
case 'u':
var day = d.getDay();
return day == 0 ? 7 : day; // 1 - 7, Monday is first day of the week
+
+ // '1-Jan-1970'
case 'v': return _strftime(locale.formats.v || '%e-%b-%Y', d, locale);
+
+ // '00'
case 'W': return pad(weekNumber(d, 'monday'), padding);
+
+ // '4'
case 'w': return d.getDay(); // 0 - 6, Sunday is first day of the week
+
+ // '1970'
case 'Y': return d.getFullYear();
+
+ // '70'
case 'y':
var y = String(d.getFullYear());
return y.slice(y.length - 2);
+
+ // 'GMT'
case 'Z':
if (options.utc) {
return "GMT";
}
else {
- var tz = d.toString().match(/\((\w+)\)/);
- return tz && tz[1] || '';
+ var tzString = d.toString().match(/\((\w+)\)/);
+ return tzString && tzString[1] || '';
}
+
+ // '+0000'
case 'z':
if (options.utc) {
return "+0000";
}
else {
- var off = typeof options.timezone == 'number' ? options.timezone : -d.getTimezoneOffset();
+ var off = typeof tz == 'number' ? tz : -d.getTimezoneOffset();
return (off < 0 ? '-' : '+') + pad(Math.abs(off / 60)) + pad(off % 60);
}
+
default: return c;
}
});
View
7 test/test.js
@@ -39,7 +39,7 @@ assert.fn(lib.localizedStrftime)
ok('Exports')
/// time zones
-if (!process.env.TZ || process.env.TZ == 'America/Vancouver') {
+if (process.env.TZ == 'America/Vancouver') {
testTimezone('P[DS]T')
assert.format('%C', '01', '01', new Date(100, 0, 1))
assert.format('%j', '097', '098', new Date(1365390736236))
@@ -52,7 +52,7 @@ else if (process.env.TZ == 'CET') {
ok('Time zones (' + process.env.TZ + ')')
}
else {
- console.log('(Current timezone has no tests: ' + process.env.TZ + ')')
+ console.log('(Current timezone has no tests: ' + (process.env.TZ || 'none') + ')')
}
/// check all formats in GMT, most coverage
@@ -169,8 +169,11 @@ assert.formatTZ = function(format, expected, tz, time) {
}
assert.formatTZ('%F %r %z', '2011-06-07 06:51:45 PM +0000', 0)
+assert.formatTZ('%F %r %z', '2011-06-07 06:51:45 PM +0000', '+0000')
assert.formatTZ('%F %r %z', '2011-06-07 08:51:45 PM +0200', 120)
+assert.formatTZ('%F %r %z', '2011-06-07 08:51:45 PM +0200', '+0200')
assert.formatTZ('%F %r %z', '2011-06-07 11:51:45 AM -0700', -420)
+assert.formatTZ('%F %r %z', '2011-06-07 11:51:45 AM -0700', '-0700')
ok('Time zone offset')

No commit comments for this range

Something went wrong with that request. Please try again.