1 | define(["dojo/_base/kernel", "dojo/_base/lang","dojo/date","dojox/string/tokenize"], function(dojo,dlang,ddate,dxst){ |
---|
2 | |
---|
3 | var php = dojo.getObject("date.php", true, dojox); |
---|
4 | /*===== |
---|
5 | var php = { |
---|
6 | // TODO: summary |
---|
7 | }; |
---|
8 | =====*/ |
---|
9 | |
---|
10 | php.format = function(/*Date*/ date, /*String*/ format){ |
---|
11 | // summary: |
---|
12 | // Get a formatted string for a given date object |
---|
13 | var df = new php.DateFormat(format); |
---|
14 | return df.format(date); |
---|
15 | }; |
---|
16 | |
---|
17 | php.DateFormat = function(/*String*/ format){ |
---|
18 | // summary: |
---|
19 | // Format the internal date object |
---|
20 | if(!this.regex){ |
---|
21 | var keys = []; |
---|
22 | for(var key in this.constructor.prototype){ |
---|
23 | if(dojo.isString(key) && key.length == 1 && dojo.isFunction(this[key])){ |
---|
24 | keys.push(key); |
---|
25 | } |
---|
26 | } |
---|
27 | this.constructor.prototype.regex = new RegExp("(?:(\\\\.)|([" + keys.join("") + "]))", "g"); |
---|
28 | } |
---|
29 | |
---|
30 | var replacements = []; |
---|
31 | |
---|
32 | this.tokens = dxst(format, this.regex, function(escape, token, i){ |
---|
33 | if(token){ |
---|
34 | replacements.push([i, token]); |
---|
35 | return token; |
---|
36 | } |
---|
37 | if(escape){ |
---|
38 | return escape.charAt(1); |
---|
39 | } |
---|
40 | }); |
---|
41 | |
---|
42 | this.replacements = replacements; |
---|
43 | }; |
---|
44 | |
---|
45 | dojo.extend(php.DateFormat, { |
---|
46 | weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], |
---|
47 | weekdays_3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], |
---|
48 | months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], |
---|
49 | months_3: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], |
---|
50 | monthdays: [31,28,31,30,31,30,31,31,30,31,30,31], |
---|
51 | |
---|
52 | format: function(/*Date*/ date){ |
---|
53 | this.date = date; |
---|
54 | for(var i = 0, replacement; replacement = this.replacements[i]; i++){ |
---|
55 | this.tokens[replacement[0]] = this[replacement[1]](); |
---|
56 | } |
---|
57 | return this.tokens.join(""); |
---|
58 | }, |
---|
59 | |
---|
60 | // Day |
---|
61 | |
---|
62 | d: function(){ |
---|
63 | // summary: |
---|
64 | // Day of the month, 2 digits with leading zeros |
---|
65 | var j = this.j(); |
---|
66 | return (j.length == 1) ? "0" + j : j; |
---|
67 | }, |
---|
68 | |
---|
69 | D: function(){ |
---|
70 | // summary: |
---|
71 | // A textual representation of a day, three letters |
---|
72 | return this.weekdays_3[this.date.getDay()]; |
---|
73 | }, |
---|
74 | |
---|
75 | j: function(){ |
---|
76 | // summary: |
---|
77 | // Day of the month without leading zeros |
---|
78 | return this.date.getDate() + ""; |
---|
79 | }, |
---|
80 | |
---|
81 | l: function(){ |
---|
82 | // summary: |
---|
83 | // A full textual representation of the day of the week |
---|
84 | return this.weekdays[this.date.getDay()]; |
---|
85 | }, |
---|
86 | |
---|
87 | N: function(){ |
---|
88 | // summary: |
---|
89 | // ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) |
---|
90 | var w = this.w(); |
---|
91 | return (!w) ? 7 : w; |
---|
92 | }, |
---|
93 | |
---|
94 | S: function(){ |
---|
95 | // summary: |
---|
96 | // English ordinal suffix for the day of the month, 2 characters |
---|
97 | switch(this.date.getDate()){ |
---|
98 | case 11: case 12: case 13: return "th"; |
---|
99 | case 1: case 21: case 31: return "st"; |
---|
100 | case 2: case 22: return "nd"; |
---|
101 | case 3: case 23: return "rd"; |
---|
102 | default: return "th"; |
---|
103 | } |
---|
104 | }, |
---|
105 | |
---|
106 | w: function(){ |
---|
107 | // summary: |
---|
108 | // Numeric representation of the day of the week |
---|
109 | return this.date.getDay() + ""; |
---|
110 | }, |
---|
111 | |
---|
112 | z: function(){ |
---|
113 | // summary: |
---|
114 | // The day of the year (starting from 0) |
---|
115 | var millis = this.date.getTime() - new Date(this.date.getFullYear(), 0, 1).getTime(); |
---|
116 | return Math.floor(millis/86400000) + ""; |
---|
117 | }, |
---|
118 | |
---|
119 | // Week |
---|
120 | |
---|
121 | W: function(){ |
---|
122 | // summary: |
---|
123 | // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) |
---|
124 | var week; |
---|
125 | var jan1_w = new Date(this.date.getFullYear(), 0, 1).getDay() + 1; |
---|
126 | var w = this.date.getDay() + 1; |
---|
127 | var z = parseInt(this.z()); |
---|
128 | |
---|
129 | if(z <= (8 - jan1_w) && jan1_w > 4){ |
---|
130 | var last_year = new Date(this.date.getFullYear() - 1, this.date.getMonth(), this.date.getDate()); |
---|
131 | if(jan1_w == 5 || (jan1_w == 6 && ddate.isLeapYear(last_year))){ |
---|
132 | week = 53; |
---|
133 | }else{ |
---|
134 | week = 52; |
---|
135 | } |
---|
136 | }else{ |
---|
137 | var i; |
---|
138 | if(Boolean(this.L())){ |
---|
139 | i = 366; |
---|
140 | }else{ |
---|
141 | i = 365; |
---|
142 | } |
---|
143 | if((i - z) < (4 - w)){ |
---|
144 | week = 1; |
---|
145 | }else{ |
---|
146 | var j = z + (7 - w) + (jan1_w - 1); |
---|
147 | week = Math.ceil(j / 7); |
---|
148 | if(jan1_w > 4){ |
---|
149 | --week; |
---|
150 | } |
---|
151 | } |
---|
152 | } |
---|
153 | |
---|
154 | return week; |
---|
155 | }, |
---|
156 | |
---|
157 | // Month |
---|
158 | |
---|
159 | F: function(){ |
---|
160 | // summary: |
---|
161 | // A full textual representation of a month, such as January or March |
---|
162 | return this.months[this.date.getMonth()]; |
---|
163 | }, |
---|
164 | |
---|
165 | m: function(){ |
---|
166 | // summary: |
---|
167 | // Numeric representation of a month, with leading zeros |
---|
168 | var n = this.n(); |
---|
169 | return (n.length == 1) ? "0" + n : n; |
---|
170 | }, |
---|
171 | |
---|
172 | M: function(){ |
---|
173 | // summary: |
---|
174 | // A short textual representation of a month, three letters |
---|
175 | return this.months_3[this.date.getMonth()]; |
---|
176 | }, |
---|
177 | |
---|
178 | n: function(){ |
---|
179 | // summary: |
---|
180 | // Numeric representation of a month, without leading zeros |
---|
181 | return this.date.getMonth() + 1 + ""; |
---|
182 | }, |
---|
183 | |
---|
184 | t: function(){ |
---|
185 | // summary: |
---|
186 | // Number of days in the given month |
---|
187 | return (Boolean(this.L()) && this.date.getMonth() == 1) ? 29 : this.monthdays[this.getMonth()]; |
---|
188 | }, |
---|
189 | |
---|
190 | // Year |
---|
191 | |
---|
192 | L: function(){ |
---|
193 | // summary: |
---|
194 | // Whether it's a leap year |
---|
195 | return (ddate.isLeapYear(this.date)) ? "1" : "0"; |
---|
196 | }, |
---|
197 | |
---|
198 | o: function(){ |
---|
199 | // summary: |
---|
200 | // ISO-8601 year number. This has the same value as Y, except that if |
---|
201 | // the ISO week number (W) belongs to the previous or next year, that year is used instead. (added in PHP 5.1.0) |
---|
202 | |
---|
203 | // TODO: Figure out what this means |
---|
204 | }, |
---|
205 | |
---|
206 | Y: function(){ |
---|
207 | // summary: |
---|
208 | // A full numeric representation of a year, 4 digits |
---|
209 | return this.date.getFullYear() + ""; |
---|
210 | }, |
---|
211 | |
---|
212 | y: function(){ |
---|
213 | // summary: |
---|
214 | // A two digit representation of a year |
---|
215 | return this.Y().slice(-2); |
---|
216 | }, |
---|
217 | |
---|
218 | // Time |
---|
219 | |
---|
220 | a: function(){ |
---|
221 | // summary: |
---|
222 | // Lowercase Ante meridian and Post meridian |
---|
223 | return this.date.getHours() >= 12 ? "pm" : "am"; |
---|
224 | }, |
---|
225 | |
---|
226 | b: function(){ |
---|
227 | // summary: |
---|
228 | // Uppercase Ante meridian and Post meridian |
---|
229 | return this.a().toUpperCase(); |
---|
230 | }, |
---|
231 | |
---|
232 | B: function(){ |
---|
233 | // summary: |
---|
234 | // Swatch Internet time |
---|
235 | // A day is 1,000 beats. All time is measured from GMT + 1 |
---|
236 | var off = this.date.getTimezoneOffset() + 60; |
---|
237 | var secs = (this.date.getHours() * 3600) + (this.date.getMinutes() * 60) + this.getSeconds() + (off * 60); |
---|
238 | var beat = Math.abs(Math.floor(secs / 86.4) % 1000) + ""; |
---|
239 | while(beat.length < 2) beat = "0" + beat; |
---|
240 | return beat; |
---|
241 | }, |
---|
242 | |
---|
243 | g: function(){ |
---|
244 | // summary: |
---|
245 | // 12-hour format of an hour without leading zeros |
---|
246 | return (this.date.getHours() % 12 || 12) + ""; |
---|
247 | }, |
---|
248 | |
---|
249 | G: function(){ |
---|
250 | // summary: |
---|
251 | // 24-hour format of an hour without leading zeros |
---|
252 | return this.date.getHours() + ""; |
---|
253 | }, |
---|
254 | |
---|
255 | h: function(){ |
---|
256 | // summary: |
---|
257 | // 12-hour format of an hour with leading zeros |
---|
258 | var g = this.g(); |
---|
259 | return (g.length == 1) ? "0" + g : g; |
---|
260 | }, |
---|
261 | |
---|
262 | H: function(){ |
---|
263 | // summary: |
---|
264 | // 24-hour format of an hour with leading zeros |
---|
265 | var G = this.G(); |
---|
266 | return (G.length == 1) ? "0" + G : G; |
---|
267 | }, |
---|
268 | |
---|
269 | i: function(){ |
---|
270 | // summary: |
---|
271 | // Minutes with leading zeros |
---|
272 | var mins = this.date.getMinutes() + ""; |
---|
273 | return (mins.length == 1) ? "0" + mins : mins; |
---|
274 | }, |
---|
275 | |
---|
276 | s: function(){ |
---|
277 | // summary: |
---|
278 | // Seconds, with leading zeros |
---|
279 | var secs = this.date.getSeconds() + ""; |
---|
280 | return (secs.length == 1) ? "0" + secs : secs; |
---|
281 | }, |
---|
282 | |
---|
283 | // Timezone |
---|
284 | |
---|
285 | e: function(){ |
---|
286 | // summary: |
---|
287 | // Timezone identifier (added in PHP 5.1.0) |
---|
288 | return ddate.getTimezoneName(this.date); |
---|
289 | }, |
---|
290 | |
---|
291 | I: function(){ |
---|
292 | // summary: |
---|
293 | // Whether or not the date is in daylight saving time |
---|
294 | |
---|
295 | // TODO: Can dojo.date do this? |
---|
296 | }, |
---|
297 | |
---|
298 | O: function(){ |
---|
299 | // summary: |
---|
300 | // Difference to Greenwich time (GMT) in hours |
---|
301 | var off = Math.abs(this.date.getTimezoneOffset()); |
---|
302 | var hours = Math.floor(off / 60) + ""; |
---|
303 | var mins = (off % 60) + ""; |
---|
304 | if(hours.length == 1) hours = "0" + hours; |
---|
305 | if(mins.length == 1) hours = "0" + mins; |
---|
306 | return ((this.date.getTimezoneOffset() < 0) ? "+" : "-") + hours + mins; |
---|
307 | }, |
---|
308 | |
---|
309 | P: function(){ |
---|
310 | // summary: |
---|
311 | // Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3) |
---|
312 | var O = this.O(); |
---|
313 | return O.substring(0, 2) + ":" + O.substring(2, 4); |
---|
314 | }, |
---|
315 | |
---|
316 | T: function(){ |
---|
317 | // summary: |
---|
318 | // Timezone abbreviation |
---|
319 | |
---|
320 | // Guess... |
---|
321 | return this.e().substring(0, 3); |
---|
322 | }, |
---|
323 | |
---|
324 | Z: function(){ |
---|
325 | // summary: |
---|
326 | // Timezone offset in seconds. The offset for timezones west of UTC is always negative, |
---|
327 | // and for those east of UTC is always positive. |
---|
328 | return this.date.getTimezoneOffset() * -60; |
---|
329 | }, |
---|
330 | |
---|
331 | // Full Date/Time |
---|
332 | |
---|
333 | c: function(){ |
---|
334 | // summary: |
---|
335 | // ISO 8601 date (added in PHP 5) |
---|
336 | return this.Y() + "-" + this.m() + "-" + this.d() + "T" + this.h() + ":" + this.i() + ":" + this.s() + this.P(); |
---|
337 | }, |
---|
338 | |
---|
339 | r: function(){ |
---|
340 | // summary: |
---|
341 | // RFC 2822 formatted date |
---|
342 | return this.D() + ", " + this.d() + " " + this.M() + " " + this.Y() + " " + this.H() + ":" + this.i() + ":" + this.s() + " " + this.O(); |
---|
343 | }, |
---|
344 | |
---|
345 | U: function(){ |
---|
346 | // summary: |
---|
347 | // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) |
---|
348 | return Math.floor(this.date.getTime() / 1000); |
---|
349 | } |
---|
350 | |
---|
351 | }); |
---|
352 | return php; |
---|
353 | }); |
---|