1 var pad = require('../number/pad');
2 var lpad = require('../string/lpad');
3 var i18n = require('./i18n_');
4 var dayOfTheYear = require('./dayOfTheYear');
5 var timezoneOffset = require('./timezoneOffset');
6 var timezoneAbbr = require('./timezoneAbbr');
7 var weekOfTheYear = require('./weekOfTheYear');
22 * format date based on strftime format
24 function strftime(date, format, localeData){
25 localeData = localeData || i18n;
26 var reToken = /%([a-z%])/gi;
28 function makeIterator(fn) {
29 return function(match, token){
30 return fn(date, token, localeData);
35 .replace(reToken, makeIterator(expandCombinations))
36 .replace(reToken, makeIterator(convertToken));
40 function expandCombinations(date, token, l10n){
41 if (token in _combinations) {
42 var expanded = _combinations[token];
43 return expanded === 'locale'? l10n[token] : expanded;
50 function convertToken(date, token, l10n){
53 return l10n.days_abbr[date.getDay()];
55 return l10n.days[date.getDay()];
58 return l10n.months_abbr[date.getMonth()];
60 return l10n.months[date.getMonth()];
62 return pad(Math.floor(date.getFullYear() / 100), 2);
64 return pad(date.getDate(), 2);
66 return pad(date.getDate(), 2, ' ');
68 return pad(date.getHours(), 2);
70 return pad(date.getHours() % 12, 2);
72 return pad(dayOfTheYear(date), 3);
74 return lpad(date.getHours() % 12, 2);
76 return pad(date.getMilliseconds(), 3);
78 return pad(date.getMonth() + 1, 2);
80 return pad(date.getMinutes(), 2);
84 return date.getHours() >= 12? l10n.pm : l10n.am;
86 return convertToken(date, 'p', l10n).toLowerCase();
88 return date.getTime() / 1000;
90 return pad(date.getSeconds(), 2);
94 var day = date.getDay();
95 return day === 0? 7 : day;
97 return pad(weekOfTheYear(date), 2);
101 return pad(weekOfTheYear(date, 1), 2);
103 return pad(date.getFullYear() % 100, 2);
105 return pad(date.getFullYear(), 4);
107 return timezoneOffset(date);
109 return timezoneAbbr(date);
113 // keep unrecognized tokens
119 module.exports = strftime;