OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 /** | |
6 * Represents a span of time from [endTime, startTime). | |
7 * | |
8 * (Note that startTime is more recent than endTime). | |
9 * | |
10 * @param {int} startTime Unix timestamp in milliseconds. | |
11 * @param {int} endTime Unix timestamp in milliseconds. | |
12 * @constructor | |
13 */ | |
14 function TimeRange(startTime, endTime) { | |
15 this.startTime = startTime; | |
16 this.endTime = endTime; | |
17 } | |
18 | |
19 /** | |
20 * Helper class with time/date functions functions. | |
21 */ | |
22 var DateUtil = {}; | |
23 | |
24 /** | |
25 * The number of seconds in an hour. | |
26 */ | |
27 DateUtil.SECONDS_PER_HOUR = 60 * 60; | |
28 | |
29 /** | |
30 * The number of milliseconds in an hour. | |
31 */ | |
32 DateUtil.MILLIS_PER_HOUR = DateUtil.SECONDS_PER_HOUR * 1000; | |
33 | |
34 /** | |
35 * The number of milliseconds in a day. | |
36 */ | |
37 DateUtil.MILLIS_PER_DAY = DateUtil.MILLIS_PER_HOUR * 24; | |
38 | |
39 /** | |
40 * Parses a date resembling "2009-10-23" into a unix timestamp (milliseconds). | |
41 * Assumes the timezone for the date is UTC. Sets the time component to | |
42 * midnight. | |
43 * | |
44 * @param {string} dateStr | |
45 * @return {int} Unix timestamp in milliseconds. | |
46 */ | |
47 DateUtil.ParseUTCDateString = function(dateStr) { | |
48 var parts = dateStr.split("-"); | |
49 return Date.UTC(parseInt(parts[0], 10), // year | |
50 parseInt(parts[1], 10) - 1, // month | |
51 parseInt(parts[2], 10), // day | |
52 0, 0, 0); | |
53 }; | |
54 | |
55 /** | |
56 * Parses a date resembling "2009-10-23" into a Date object. | |
57 * Assumes the local timezeone for the date. Sets the time component to | |
58 * midnight (of local timezone). | |
59 * | |
60 * @param {string} dateStr | |
61 * @return {Date} Valid date object, or null if failed. | |
62 */ | |
63 DateUtil.ParseStringToLocalDate = function(dateStr) { | |
64 // We support both "2009/10/23" and "2009-10-23". | |
65 // Normalize to a format using "-". | |
66 dateStr = dateStr.replace(/-/g, "/"); | |
67 | |
68 var parts = dateStr.split("/"); | |
69 | |
70 if (parts.length != 3) | |
71 return null; // Failed to parse. | |
72 | |
73 var d = new Date(parseInt(parts[0], 10), // year | |
74 parseInt(parts[1], 10) - 1, // month | |
75 parseInt(parts[2], 10), // day | |
76 0, 0, 0); | |
77 return d; | |
78 }; | |
79 | |
80 /** | |
81 * Parses a date/time string resembling "2009-10-06 22:53:32 UTC" to a unix | |
82 * timestamp. | |
83 * | |
84 * @param {string} dateStr | |
85 * @return {int} Unix timestamp in milliseconds. | |
86 */ | |
87 DateUtil.ParseUTCDateTimeString = function(dateStr) { | |
88 var parts = dateStr.split(" "); | |
89 | |
90 if (parts.length != 3 || parts[2] != "UTC") { | |
91 Log("Invalid formatted dateStr: " + dateStr); | |
92 return 0; | |
93 } | |
94 | |
95 var d = new Date(); | |
96 d.setTime(DateUtil.ParseUTCDateString(parts[0])); | |
97 | |
98 var timeParts = parts[1].split(":"); | |
99 | |
100 if (timeParts.length < 2) { | |
101 Log("Invalid formatted dateStr: " + dateStr); | |
102 return 0; | |
103 } | |
104 | |
105 d.setUTCHours(parseInt(timeParts[0], 10)); | |
106 d.setUTCMinutes(parseInt(timeParts[1], 10)); | |
107 if (timeParts.length > 2) | |
108 d.setUTCSeconds(parseInt(timeParts[2], 10)); | |
109 return d.getTime(); | |
110 }; | |
111 | |
112 /** | |
113 * Formats |x| in decimal such that it occupies |count| characters. | |
114 */ | |
115 function PadWithZero(x, count) { | |
116 var s = "" + x; | |
117 while (s.length < count) | |
118 s = "0" + s; | |
119 return s; | |
120 } | |
121 | |
122 /** | |
123 * Returns a time range for the day that encloses |t| (in the local | |
124 * timezone. Anchored at midnight. | |
125 * | |
126 * @param {int} t Unix timestamp in milliseconds. | |
127 * @return {TimeRange} | |
128 */ | |
129 DateUtil.GetLocalDayRange = function(t) { | |
130 var d = new Date(); | |
131 d.setTime(t); | |
132 | |
133 // Midnight | |
134 d.setHours(0); | |
135 d.setMinutes(0); | |
136 d.setSeconds(0); | |
137 d.setMilliseconds(0); | |
138 | |
139 var endTime = d.getTime(); | |
140 var startTime = endTime + DateUtil.MILLIS_PER_DAY; | |
141 | |
142 return new TimeRange(startTime, endTime); | |
143 }; | |
144 | |
145 /** | |
146 * Returns a time range for the day that encloses |t| in UTC | |
147 * Anchored at midnight. | |
148 * | |
149 * @param {int} t Unix timestamp in milliseconds. | |
150 * @return {TimeRange} | |
151 */ | |
152 DateUtil.GetUTCDayRange = function(t) { | |
153 var d = new Date(); | |
154 d.setTime(t); | |
155 | |
156 // Midnight | |
157 d.setUTCHours(0); | |
158 d.setUTCMinutes(0); | |
159 d.setUTCSeconds(0); | |
160 d.setMilliseconds(0); | |
161 | |
162 var endTime = d.getTime(); | |
163 var startTime = endTime + DateUtil.MILLIS_PER_DAY; | |
164 | |
165 return new TimeRange(startTime, endTime); | |
166 }; | |
167 | |
168 /** | |
169 * Returns a list of all of the days contained by |timeRange|, | |
170 * using the current timezone. | |
171 * | |
172 * @param {TimeRange} timeRange. | |
173 * @return {array<TimeRange>} | |
174 */ | |
175 DateUtil.GetLocalDaysInRange = function(timeRange) { | |
176 var days = []; | |
177 | |
178 var t = timeRange.startTime; | |
179 t -= DateUtil.MILLIS_PER_DAY; | |
180 | |
181 while (t >= timeRange.endTime) { | |
182 var day = DateUtil.GetLocalDayRange(t); | |
183 days.push(day); | |
184 t -= DateUtil.MILLIS_PER_DAY; | |
185 } | |
186 | |
187 return days; | |
188 }; | |
189 | |
190 /** | |
191 * Returns a list of all of the days contained by |timeRange|, | |
192 * as UTC days. | |
193 * | |
194 * @param {TimeRange} timeRange. | |
195 * @return {array<TimeRange>} | |
196 */ | |
197 DateUtil.GetUTCDaysInRange = function(timeRange) { | |
198 var days = []; | |
199 | |
200 var t = timeRange.startTime; | |
201 t -= DateUtil.MILLIS_PER_DAY; | |
202 | |
203 while (t >= timeRange.endTime) { | |
204 var day = DateUtil.GetUTCDayRange(t); | |
205 days.push(day); | |
206 t -= DateUtil.MILLIS_PER_DAY; | |
207 } | |
208 | |
209 return days; | |
210 }; | |
211 | |
212 /** | |
213 * Formats |t| as something human readable in the user's current locale. | |
214 * | |
215 * @param {int} t Unix timestamp in milliseconds. | |
216 * @return {string} | |
217 */ | |
218 DateUtil.FormatAsLocalDate = function(t) { | |
219 // Format the date into something readable. | |
220 var d = new Date(); | |
221 d.setTime(t); | |
222 return d.toLocaleString(); | |
223 }; | |
224 | |
225 /** | |
226 * Formats |t| as ISO-8601 in local time. | |
227 * | |
228 * @param {int} t Unix timestamp in milliseconds. | |
229 * @return {string} | |
230 */ | |
231 DateUtil.FormatLocaleISO = function(t) { | |
232 // Formats the date into something readable. | |
233 var d = new Date(); | |
234 d.setTime(t); | |
235 return d.getFullYear() + "-" + | |
236 zeroPad(d.getMonth() + 1, 2) + "-" + | |
237 zeroPad(d.getDay(), 2) + " " + | |
238 zeroPad(d.getHours() + 1, 2) + ":" + | |
239 zeroPad(d.getMinutes() + 1, 2) + ":" + | |
240 zeroPad(d.getSeconds() + 1, 2); | |
241 }; | |
242 | |
243 /** | |
244 * Formats |t| as ISO-8601 in UTC. | |
245 * | |
246 * @param {int} t Unix timestamp in milliseconds. | |
247 * @return {string} | |
248 */ | |
249 DateUtil.FormatUTCISO = function(t) { | |
250 // Formats the date into something readable. | |
251 var d = new Date(); | |
252 d.setTime(t); | |
253 return d.getUTCFullYear() + "-" + | |
254 zeroPad(d.getUTCMonth() + 1, 2) + "-" + | |
255 zeroPad(d.getUTCDay(), 2) + " " + | |
256 zeroPad(d.getUTCHours() + 1, 2) + ":" + | |
257 zeroPad(d.getUTCMinutes() + 1, 2) + ":" + | |
258 zeroPad(d.getUTCSeconds() + 1, 2); | |
259 }; | |
260 | |
261 /** | |
262 * Converts milliseconds to seconds (rounding down). | |
263 * | |
264 * @param {int} millis | |
265 * @return {int} | |
266 */ | |
267 DateUtil.MillisToSeconds = function(millis) { | |
268 return parseInt((millis / 1000).toFixed(0)); | |
269 }; | |
270 | |
271 /** | |
272 * Helper function to add required zero characters to a string. | |
273 **/ | |
274 function zeroPad(num, width) { | |
275 num = num.toString(); | |
276 while (num.length < width) { | |
277 num = "0" + num; | |
278 } | |
279 return num; | |
280 } | |
OLD | NEW |