1 | 1 | 'use strict'; |
2 | | |
3 | | // ----- Date formatter |
4 | | // -- @param format {String} |
5 | | // -- @param date {Date} optional date context |
6 | | // -- @return {String} |
7 | | // --------------------------------------- |
8 | 1 | module.exports = function formatDate(format, date) { |
9 | | |
10 | | // default to today |
11 | 78 | if (!date) { |
12 | 3 | date = new Date(); |
13 | | } |
14 | | |
15 | | // ----- years |
16 | | // --------------------------------------- |
17 | 78 | var yyyy = date.getFullYear().toString(); // {yyyy} |
18 | 78 | var yy = yyyy.slice(-2); // {yy} |
19 | | |
20 | | // ----- months |
21 | | // --------------------------------------- |
22 | 78 | var monthInt = date.getMonth() + 1; |
23 | 78 | var m = monthInt.toString(); // {m} |
24 | 78 | var mm = monthInt < 10 ? '0' + m : m; // {mm} |
25 | 78 | var months = [ |
26 | | 'January', |
27 | | 'February', |
28 | | 'March', |
29 | | 'April', |
30 | | 'May', |
31 | | 'June', |
32 | | 'July', |
33 | | 'August', |
34 | | 'September', |
35 | | 'October', |
36 | | 'November', |
37 | | 'December' |
38 | | ]; |
39 | | |
40 | 78 | var month = months[date.getMonth()]; // {Month} & {Mo} |
41 | | |
42 | | |
43 | | // ----- days |
44 | | // --------------------------------------- |
45 | 78 | var day = date.getDate(); |
46 | 78 | var dd = day < 10 ? '0' + day : day; // {dd} |
47 | | |
48 | | |
49 | | //----------------- suffixes ----------------- |
50 | 78 | var daySuffixes = Object.create(null); // so for in loop works |
51 | 78 | daySuffixes.st = [1, 21, 31]; |
52 | 78 | daySuffixes.nd = [2, 22]; |
53 | 78 | daySuffixes.rd = [3, 23]; |
54 | | |
55 | | // loop through 'st', 'nd', and 'rd' (suffixes like '1st', '2nd', etc) |
56 | | // if suffix is not found, it is 'th' (most numbers) |
57 | 78 | var suffixNotFound; |
58 | | |
59 | 78 | for (var suffix in daySuffixes) { |
60 | 177 | if (daySuffixes[suffix].indexOf(day) > -1) { |
61 | 56 | suffixNotFound = false; |
62 | 56 | break; |
63 | | } |
64 | 121 | suffixNotFound = true; |
65 | | } |
66 | | |
67 | 78 | if (suffixNotFound) { |
68 | 22 | suffix = 'th'; |
69 | | } |
70 | | |
71 | 78 | var dayWithSuffix = day + suffix; // {D} |
72 | | //----------------- end suffixes ----------------- |
73 | | |
74 | 78 | var weekdays = [ |
75 | | 'Monday', |
76 | | 'Tuesday', |
77 | | 'Wednesday', |
78 | | 'Thursday', |
79 | | 'Friday', |
80 | | 'Saturday', |
81 | | 'Sunday' |
82 | | ]; |
83 | | |
84 | 78 | var weekday = weekdays[date.getDay()]; |
85 | | |
86 | | |
87 | | // ----- hours |
88 | | // --------------------------------------- |
89 | 78 | var hours24 = date.getHours(); |
90 | 78 | var hh24 = hours24 < 10 ? '0' + hours24 : hours24; |
91 | 78 | var hours = hours24 % 12 === 0 ? 12 : hours24 % 12; // {h} |
92 | 78 | var hh = hours < 10 ? '0' + hours : hours; |
93 | 78 | var ampm = hours24 < 12 ? 'am' : 'pm'; // {ampm} |
94 | | |
95 | | // ----- minutes, seconds |
96 | | // --------------------------------------- |
97 | 78 | var min = date.getMinutes(); |
98 | 78 | var minutes = min < 10 ? '0' + min : min; |
99 | | |
100 | 78 | var sec = date.getSeconds(); |
101 | 78 | var seconds = sec < 10 ? '0' + sec : sec; |
102 | | |
103 | 78 | return format |
104 | | .replace('{yyyy}', yyyy) |
105 | | .replace('{yy}', yy) |
106 | | .replace('{m}', m) |
107 | | .replace('{mm}', mm) |
108 | | .replace('{Month}', month) |
109 | | .replace('{Mo}', month.substr(0,3)) |
110 | | .replace('{d}', day) |
111 | | .replace('{dd}', dd) |
112 | | .replace('{ds}', dayWithSuffix) |
113 | | .replace('{Weekday}', weekday) |
114 | | .replace('{Day}', weekday.substr(0,3)) |
115 | | .replace('{Dy}', weekday.substr(0,2)) |
116 | | .replace('{D}', weekday[0]) |
117 | | .replace('{h24}', hours24) |
118 | | .replace('{hh24}', hh24) |
119 | | .replace('{h}', hours) |
120 | | .replace('{hh}', hh) |
121 | | .replace('{ampm}', ampm) |
122 | | .replace('{AMPM}', ampm.toUpperCase()) |
123 | | .replace('{Minutes}', minutes) |
124 | | .replace('{Seconds}', seconds); |
125 | | |
126 | | }; |