Merge lp:~jjacobs/methanal/utc-times into lp:methanal
- utc-times
- Merge into trunk
Proposed by
Jonathan Jacobs
Status: | Merged |
---|---|
Approved by: | Tristan Seligmann |
Approved revision: | 107 |
Merged at revision: | not available |
Proposed branch: | lp:~jjacobs/methanal/utc-times |
Merge into: | lp:methanal |
Diff against target: |
370 lines 4 files modified
methanal/js/Methanal/Tests/TestUtil.js (+34/-18) methanal/js/Methanal/Tests/TestView.js (+3/-3) methanal/js/Methanal/Util.js (+72/-42) methanal/js/Methanal/View.js (+7/-1) |
To merge this branch: | bzr merge lp:~jjacobs/methanal/utc-times |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Tristan Seligmann | Approve | ||
Review via email: mp+13124@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Jonathan Jacobs (jjacobs) wrote : | # |
> > 7 self._knownTime = Methanal.
> > 8 - new Date(2009, 8, 6, 1, 36, 23, 2));
> > 9 + new Date(2009, 8, 6, 1, 36, 23, 2), true);
>
> As far as I can tell, fromDate only takes one parameter; what is the point of
> passing true here?
Something left in from an older API. I've removed it and pushed a new revision.
Revision history for this message
Tristan Seligmann (mithrandi) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'methanal/js/Methanal/Tests/TestUtil.js' | |||
2 | --- methanal/js/Methanal/Tests/TestUtil.js 2009-10-02 01:16:09 +0000 | |||
3 | +++ methanal/js/Methanal/Tests/TestUtil.js 2009-10-09 22:36:14 +0000 | |||
4 | @@ -220,17 +220,20 @@ | |||
5 | 220 | function assertTimeParsed(data, timestamp) { | 220 | function assertTimeParsed(data, timestamp) { |
6 | 221 | var time = Methanal.Util.Time.guess(data); | 221 | var time = Methanal.Util.Time.guess(data); |
7 | 222 | self.assertIdentical(time._oneDay, true); | 222 | self.assertIdentical(time._oneDay, true); |
9 | 223 | self.assertIdentical(time.asTimestamp(), timestamp); | 223 | // User input is interpreted as local time, but the tests should |
10 | 224 | // pass regardless of the runner's local timezone, so we use UTC | ||
11 | 225 | // dates. | ||
12 | 226 | self.assertIdentical(time.asUTCDate().getTime(), timestamp); | ||
13 | 224 | }; | 227 | }; |
14 | 225 | 228 | ||
23 | 226 | assertTimeParsed('2009/9/1', 1251756000000); | 229 | assertTimeParsed('2009/9/1', 1251763200000); |
24 | 227 | assertTimeParsed('2009.09.01', 1251756000000); | 230 | assertTimeParsed('2009.09.01', 1251763200000); |
25 | 228 | assertTimeParsed('2009-09-01', 1251756000000); | 231 | assertTimeParsed('2009-09-01', 1251763200000); |
26 | 229 | assertTimeParsed('1/9/2009', 1251756000000); | 232 | assertTimeParsed('1/9/2009', 1251763200000); |
27 | 230 | assertTimeParsed('01.09.2009', 1251756000000); | 233 | assertTimeParsed('01.09.2009', 1251763200000); |
28 | 231 | assertTimeParsed('01-09-2009', 1251756000000); | 234 | assertTimeParsed('01-09-2009', 1251763200000); |
29 | 232 | assertTimeParsed('1/9/2009', 1251756000000); | 235 | assertTimeParsed('1/9/2009', 1251763200000); |
30 | 233 | assertTimeParsed('29/2/2008', 1204236000000); | 236 | assertTimeParsed('29/2/2008', 1204243200000); |
31 | 234 | }, | 237 | }, |
32 | 235 | 238 | ||
33 | 236 | 239 | ||
34 | @@ -264,9 +267,9 @@ | |||
35 | 264 | * Create a L{Methanal.Util.Time} instance from a C{Date}. | 267 | * Create a L{Methanal.Util.Time} instance from a C{Date}. |
36 | 265 | */ | 268 | */ |
37 | 266 | function test_fromDate(self) { | 269 | function test_fromDate(self) { |
39 | 267 | var d = new Date(); | 270 | var d = new Date(2009, 8, 1, 12, 34, 56, 78); |
40 | 268 | var t = Methanal.Util.Time.fromDate(d); | 271 | var t = Methanal.Util.Time.fromDate(d); |
42 | 269 | self.assertIdentical(t.asTimestamp(), d.getTime()); | 272 | self.assertIdentical(t.asDate().getTime(), d.getTime()); |
43 | 270 | }, | 273 | }, |
44 | 271 | 274 | ||
45 | 272 | 275 | ||
46 | @@ -309,19 +312,32 @@ | |||
47 | 309 | * Create a L{Methanal.Util.Time} instance from a timestamp in milliseconds. | 312 | * Create a L{Methanal.Util.Time} instance from a timestamp in milliseconds. |
48 | 310 | */ | 313 | */ |
49 | 311 | function test_fromTimestamp(self) { | 314 | function test_fromTimestamp(self) { |
52 | 312 | var t = Methanal.Util.Time.fromTimestamp(1251759723000); | 315 | var t; |
53 | 313 | self.assertIdentical(t.asHumanly(), 'Tue, 1 Sep 2009 01:02:03 am'); | 316 | var timestamp; |
54 | 317 | |||
55 | 318 | timestamp = 1251766923000; | ||
56 | 319 | t = Methanal.Util.Time.fromTimestamp(timestamp); | ||
57 | 320 | self.assertIdentical(t.asUTCDate().getTime(), timestamp); | ||
58 | 321 | self.assertIdentical(t._timezoneOffset, 0); | ||
59 | 322 | |||
60 | 323 | var d = new Date(); | ||
61 | 324 | timestamp = d.getTime(); | ||
62 | 325 | t = Methanal.Util.Time.fromTimestamp(timestamp, d.getTimezoneOffset()); | ||
63 | 326 | self.assertIdentical(t.asUTCDate().getTime(), timestamp); | ||
64 | 327 | self.assertIdentical( | ||
65 | 328 | t._timezoneOffset, d.getTimezoneOffset() * 60 * 1000); | ||
66 | 314 | }, | 329 | }, |
67 | 315 | 330 | ||
68 | 316 | 331 | ||
69 | 317 | /** | 332 | /** |
70 | 318 | * L{Methanal.Util.Time.asDate} converts a Time into a C{Date} representing | 333 | * L{Methanal.Util.Time.asDate} converts a Time into a C{Date} representing |
72 | 319 | * the same time. | 334 | * the same I{local} time. |
73 | 320 | */ | 335 | */ |
74 | 321 | function test_asDate(self) { | 336 | function test_asDate(self) { |
75 | 322 | var t = Methanal.Util.Time(); | 337 | var t = Methanal.Util.Time(); |
76 | 323 | var d = t.asDate(); | 338 | var d = t.asDate(); |
78 | 324 | self.assertIdentical(t.asTimestamp(), d.getTime()); | 339 | self.assertIdentical( |
79 | 340 | t.asTimestamp() + d.getTimezoneOffset() * 60 * 1000, d.getTime()); | ||
80 | 325 | }, | 341 | }, |
81 | 326 | 342 | ||
82 | 327 | 343 | ||
83 | @@ -330,7 +346,7 @@ | |||
84 | 330 | * milliseconds elapsed since the epoch. | 346 | * milliseconds elapsed since the epoch. |
85 | 331 | */ | 347 | */ |
86 | 332 | function test_asTimestamp(self) { | 348 | function test_asTimestamp(self) { |
88 | 333 | self.assertIdentical(self._knownTime.asTimestamp(), 1252193783002); | 349 | self.assertIdentical(self._knownTime.asTimestamp(), 1252200983002); |
89 | 334 | }, | 350 | }, |
90 | 335 | 351 | ||
91 | 336 | 352 | ||
92 | @@ -392,11 +408,11 @@ | |||
93 | 392 | */ | 408 | */ |
94 | 393 | function test_offset(self) { | 409 | function test_offset(self) { |
95 | 394 | var t = self._knownTime.offset(Methanal.Util.TimeDelta({'days': -1})); | 410 | var t = self._knownTime.offset(Methanal.Util.TimeDelta({'days': -1})); |
97 | 395 | self.assertIdentical(t.asTimestamp(), 1252107383002); | 411 | self.assertIdentical(t.asTimestamp(), 1252114583002); |
98 | 396 | self.assertIdentical(t.oneDay().asHumanly(), 'Sat, 5 Sep 2009'); | 412 | self.assertIdentical(t.oneDay().asHumanly(), 'Sat, 5 Sep 2009'); |
99 | 397 | 413 | ||
100 | 398 | var t = self._knownTime.offset(Methanal.Util.TimeDelta({'days': 1})); | 414 | var t = self._knownTime.offset(Methanal.Util.TimeDelta({'days': 1})); |
102 | 399 | self.assertIdentical(t.asTimestamp(), 1252280183002); | 415 | self.assertIdentical(t.asTimestamp(), 1252287383002); |
103 | 400 | self.assertIdentical(t.oneDay().asHumanly(), 'Mon, 7 Sep 2009'); | 416 | self.assertIdentical(t.oneDay().asHumanly(), 'Mon, 7 Sep 2009'); |
104 | 401 | }); | 417 | }); |
105 | 402 | 418 | ||
106 | 403 | 419 | ||
107 | === modified file 'methanal/js/Methanal/Tests/TestView.js' | |||
108 | --- methanal/js/Methanal/Tests/TestView.js 2009-10-04 11:18:09 +0000 | |||
109 | +++ methanal/js/Methanal/Tests/TestView.js 2009-10-09 22:36:14 +0000 | |||
110 | @@ -525,8 +525,8 @@ | |||
111 | 525 | self.assertIdentical(called, 0); | 525 | self.assertIdentical(called, 0); |
112 | 526 | control.setValue('2009-01-01'); | 526 | control.setValue('2009-01-01'); |
113 | 527 | self.assertIdentical(called, 1); | 527 | self.assertIdentical(called, 1); |
116 | 528 | self.assertIdentical(displayValue, | 528 | var t = Methanal.Util.Time.fromDate(new Date(2009, 0, 1)); |
117 | 529 | Methanal.Util.Time.guess('2009-01-01').asHumanly()); | 529 | self.assertIdentical(displayValue, t.oneDay().asHumanly()); |
118 | 530 | control.onKeyUp(control.inputNode); | 530 | control.onKeyUp(control.inputNode); |
119 | 531 | self.assertIdentical(called, 2); | 531 | self.assertIdentical(called, 2); |
120 | 532 | }); | 532 | }); |
121 | @@ -548,7 +548,7 @@ | |||
122 | 548 | control.setValue('NOTAVALIDDATE'); | 548 | control.setValue('NOTAVALIDDATE'); |
123 | 549 | self.assertIdentical(control.getValue(), undefined); | 549 | self.assertIdentical(control.getValue(), undefined); |
124 | 550 | control.setValue('2009-01-01'); | 550 | control.setValue('2009-01-01'); |
126 | 551 | self.assertIdentical(control.getValue(), 1230760800000); | 551 | self.assertIdentical(control.getValue(), 1230768000000); |
127 | 552 | }); | 552 | }); |
128 | 553 | }, | 553 | }, |
129 | 554 | 554 | ||
130 | 555 | 555 | ||
131 | === modified file 'methanal/js/Methanal/Util.js' | |||
132 | --- methanal/js/Methanal/Util.js 2009-10-02 01:16:39 +0000 | |||
133 | +++ methanal/js/Methanal/Util.js 2009-10-09 22:36:14 +0000 | |||
134 | @@ -479,26 +479,37 @@ | |||
135 | 479 | 479 | ||
136 | 480 | 480 | ||
137 | 481 | /** | 481 | /** |
139 | 482 | * A high-level object built on top of C{Date}. | 482 | * A high-level time and date object. |
140 | 483 | * | 483 | * |
143 | 484 | * @type _date: C{Date} | 484 | * @type _timestamp: C{Number} |
144 | 485 | * @ivar _date: Underlying Date instance | 485 | * @ivar _timestamp: Number of milliseconds since the epoch: |
145 | 486 | * January 1, 1970, 00:00:00 UTC | ||
146 | 486 | * | 487 | * |
147 | 487 | * @type _oneDay: C{boolean} | 488 | * @type _oneDay: C{boolean} |
148 | 488 | * @ivar _oneDay: Is this a truncated Time instance? | 489 | * @ivar _oneDay: Is this a truncated Time instance? |
149 | 489 | */ | 490 | */ |
150 | 490 | Divmod.Class.subclass(Methanal.Util, 'Time').methods( | 491 | Divmod.Class.subclass(Methanal.Util, 'Time').methods( |
151 | 491 | function __init__(self) { | 492 | function __init__(self) { |
153 | 492 | self._date = new Date(); | 493 | var d = new Date(); |
154 | 494 | self._timezoneOffset = d.getTimezoneOffset() * 60 * 1000; | ||
155 | 495 | self._timestamp = d.getTime() - self._timezoneOffset; | ||
156 | 493 | self._oneDay = false; | 496 | self._oneDay = false; |
157 | 494 | }, | 497 | }, |
158 | 495 | 498 | ||
159 | 496 | 499 | ||
160 | 497 | /** | 500 | /** |
162 | 498 | * C{Date} representation. | 501 | * Local time C{Date} representation. |
163 | 499 | */ | 502 | */ |
164 | 500 | function asDate(self) { | 503 | function asDate(self) { |
166 | 501 | return self._date; | 504 | return new Date(self._timestamp + self._timezoneOffset); |
167 | 505 | }, | ||
168 | 506 | |||
169 | 507 | |||
170 | 508 | /** | ||
171 | 509 | * UTC C{Date} representation. | ||
172 | 510 | */ | ||
173 | 511 | function asUTCDate(self) { | ||
174 | 512 | return new Date(self._timestamp); | ||
175 | 502 | }, | 513 | }, |
176 | 503 | 514 | ||
177 | 504 | 515 | ||
178 | @@ -506,7 +517,7 @@ | |||
179 | 506 | * The number of milliseconds since the epoch. | 517 | * The number of milliseconds since the epoch. |
180 | 507 | */ | 518 | */ |
181 | 508 | function asTimestamp(self) { | 519 | function asTimestamp(self) { |
183 | 509 | return self._date.getTime(); | 520 | return self._timestamp; |
184 | 510 | }, | 521 | }, |
185 | 511 | 522 | ||
186 | 512 | 523 | ||
187 | @@ -514,7 +525,7 @@ | |||
188 | 514 | * A human-readable string representation. | 525 | * A human-readable string representation. |
189 | 515 | */ | 526 | */ |
190 | 516 | function asHumanly(self, twentyFourHours) { | 527 | function asHumanly(self, twentyFourHours) { |
192 | 517 | var _date = self._date; | 528 | var _date = self.asDate(); |
193 | 518 | var r = []; | 529 | var r = []; |
194 | 519 | r.push(self.getDayName(true) + ','); | 530 | r.push(self.getDayName(true) + ','); |
195 | 520 | r.push(_date.getDate().toString()); | 531 | r.push(_date.getDate().toString()); |
196 | @@ -522,28 +533,24 @@ | |||
197 | 522 | r.push(_date.getFullYear().toString()); | 533 | r.push(_date.getFullYear().toString()); |
198 | 523 | 534 | ||
199 | 524 | if (!self._oneDay) { | 535 | if (!self._oneDay) { |
219 | 525 | function _humanlyTime(dateWithTime, twentyFourHours) { | 536 | var prefix = ''; |
220 | 526 | var prefix = ''; | 537 | var hours = _date.getHours(); |
221 | 527 | var hours = dateWithTime.getHours(); | 538 | if (!twentyFourHours) { |
222 | 528 | if (!twentyFourHours) { | 539 | var dm = Methanal.Util.divmod(hours, 12); |
223 | 529 | var dm = Methanal.Util.divmod(hours, 12); | 540 | prefix = dm[0] > 0 ? ' pm' : ' am'; |
224 | 530 | prefix = dm[0] > 0 ? ' pm' : ' am'; | 541 | hours = dm[1] == 0 ? 12 : dm[1]; |
206 | 531 | hours = dm[1] == 0 ? 12 : dm[1]; | ||
207 | 532 | } | ||
208 | 533 | |||
209 | 534 | function pad(v) { | ||
210 | 535 | return Methanal.Util.rjust(v.toString(), 2, '0'); | ||
211 | 536 | }; | ||
212 | 537 | |||
213 | 538 | var r = []; | ||
214 | 539 | r.push(hours); | ||
215 | 540 | r.push(dateWithTime.getMinutes()); | ||
216 | 541 | r.push(dateWithTime.getSeconds()); | ||
217 | 542 | r = Methanal.Util.map(pad, r); | ||
218 | 543 | return r.join(':') + prefix; | ||
225 | 544 | } | 542 | } |
226 | 545 | 543 | ||
228 | 546 | r.push(_humanlyTime(_date, twentyFourHours)); | 544 | function pad(v) { |
229 | 545 | return Methanal.Util.rjust(v.toString(), 2, '0'); | ||
230 | 546 | }; | ||
231 | 547 | |||
232 | 548 | var t = []; | ||
233 | 549 | t.push(hours); | ||
234 | 550 | t.push(_date.getMinutes()); | ||
235 | 551 | t.push(_date.getSeconds()); | ||
236 | 552 | t = Methanal.Util.map(pad, t); | ||
237 | 553 | r.push(t.join(':') + prefix); | ||
238 | 547 | } | 554 | } |
239 | 548 | 555 | ||
240 | 549 | return r.join(' '); | 556 | return r.join(' '); |
241 | @@ -559,7 +566,7 @@ | |||
242 | 559 | * @rtype: C{String} | 566 | * @rtype: C{String} |
243 | 560 | */ | 567 | */ |
244 | 561 | function getDayName(self, shortened) { | 568 | function getDayName(self, shortened) { |
246 | 562 | var name = Methanal.Util.Time._dayNames[self._date.getDay()]; | 569 | var name = Methanal.Util.Time._dayNames[self.asDate().getDay()]; |
247 | 563 | return shortened ? name.substr(0, 3) : name; | 570 | return shortened ? name.substr(0, 3) : name; |
248 | 564 | }, | 571 | }, |
249 | 565 | 572 | ||
250 | @@ -573,7 +580,7 @@ | |||
251 | 573 | * @rtype: C{String} | 580 | * @rtype: C{String} |
252 | 574 | */ | 581 | */ |
253 | 575 | function getMonthName(self, shortened) { | 582 | function getMonthName(self, shortened) { |
255 | 576 | var name = Methanal.Util.Time._monthNames[self._date.getMonth()]; | 583 | var name = Methanal.Util.Time._monthNames[self.asDate().getMonth()]; |
256 | 577 | return shortened ? name.substr(0, 3) : name; | 584 | return shortened ? name.substr(0, 3) : name; |
257 | 578 | }, | 585 | }, |
258 | 579 | 586 | ||
259 | @@ -585,11 +592,12 @@ | |||
260 | 585 | * @return: A new instance representing the truncated date | 592 | * @return: A new instance representing the truncated date |
261 | 586 | */ | 593 | */ |
262 | 587 | function oneDay(self) { | 594 | function oneDay(self) { |
268 | 588 | var d = new Date( | 595 | var _date = self.asDate(); |
269 | 589 | self._date.getFullYear(), | 596 | _date.setHours(0); |
270 | 590 | self._date.getMonth(), | 597 | _date.setMinutes(0); |
271 | 591 | self._date.getDate()); | 598 | _date.setSeconds(0); |
272 | 592 | var t = Methanal.Util.Time.fromDate(d); | 599 | _date.setMilliseconds(0); |
273 | 600 | var t = Methanal.Util.Time.fromDate(_date); | ||
274 | 593 | t._oneDay = true; | 601 | t._oneDay = true; |
275 | 594 | return t; | 602 | return t; |
276 | 595 | }, | 603 | }, |
277 | @@ -606,9 +614,9 @@ | |||
278 | 606 | * @return: A new instance representing the newly offset time | 614 | * @return: A new instance representing the newly offset time |
279 | 607 | */ | 615 | */ |
280 | 608 | function offset(self, delta) { | 616 | function offset(self, delta) { |
283 | 609 | var d = new Date(self.asTimestamp() + delta); | 617 | var t = Methanal.Util.Time.fromTimestamp(self.asTimestamp() + delta); |
282 | 610 | var t = Methanal.Util.Time.fromDate(d); | ||
284 | 611 | t._oneDay = self._oneDay; | 618 | t._oneDay = self._oneDay; |
285 | 619 | t._timezoneOffset = self._timezoneOffset; | ||
286 | 612 | return t; | 620 | return t; |
287 | 613 | }); | 621 | }); |
288 | 614 | 622 | ||
289 | @@ -628,17 +636,35 @@ | |||
290 | 628 | */ | 636 | */ |
291 | 629 | Methanal.Util.Time.fromDate = function fromDate(dateObj) { | 637 | Methanal.Util.Time.fromDate = function fromDate(dateObj) { |
292 | 630 | var t = Methanal.Util.Time(); | 638 | var t = Methanal.Util.Time(); |
294 | 631 | t._date = dateObj; | 639 | t._timezoneOffset = dateObj.getTimezoneOffset() * 60 * 1000; |
295 | 640 | t._timestamp = dateObj.getTime() - t._timezoneOffset; | ||
296 | 632 | return t; | 641 | return t; |
297 | 633 | }; | 642 | }; |
298 | 634 | 643 | ||
299 | 635 | 644 | ||
300 | 636 | 645 | ||
301 | 637 | /** | 646 | /** |
303 | 638 | * Create a L{Methanal.Util.Time} instance from a timestamp in milliseconds. | 647 | * Create a L{Methanal.Util.Time} instance from a timestamp in milliseconds, |
304 | 648 | * since January 1, 1970, 00:00:00 UTC. | ||
305 | 649 | * | ||
306 | 650 | * @type timestamp: C{Number} | ||
307 | 651 | * @param timestamp: Number of milliseconds since the epoch | ||
308 | 652 | * | ||
309 | 653 | * @type timezoneOffset: C{Number} | ||
310 | 654 | * @param timezoneOffset: Timezone offset in minutes | ||
311 | 655 | * | ||
312 | 656 | * @rtype: L{Methanal.Util.Time} | ||
313 | 639 | */ | 657 | */ |
316 | 640 | Methanal.Util.Time.fromTimestamp = function fromTimestamp(timestamp) { | 658 | Methanal.Util.Time.fromTimestamp = function fromTimestamp(timestamp, timezoneOffset) { |
317 | 641 | return Methanal.Util.Time.fromDate(new Date(timestamp)); | 659 | var t = Methanal.Util.Time(); |
318 | 660 | t._timestamp = timestamp; | ||
319 | 661 | if (timezoneOffset) { | ||
320 | 662 | timezoneOffset *= 60 * 1000; | ||
321 | 663 | } else { | ||
322 | 664 | timezoneOffset = 0; | ||
323 | 665 | } | ||
324 | 666 | t._timezoneOffset = timezoneOffset; | ||
325 | 667 | return t; | ||
326 | 642 | }; | 668 | }; |
327 | 643 | 669 | ||
328 | 644 | 670 | ||
329 | @@ -715,6 +741,9 @@ | |||
330 | 715 | /** | 741 | /** |
331 | 716 | * Create a L{Methanal.Util.Time} instance from a semi-structured string. | 742 | * Create a L{Methanal.Util.Time} instance from a semi-structured string. |
332 | 717 | * | 743 | * |
333 | 744 | * As this is primarily intended for textual date input by users, L{value} is | ||
334 | 745 | * interpreted in local time. | ||
335 | 746 | * | ||
336 | 718 | * @type value: C{String} | 747 | * @type value: C{String} |
337 | 719 | * @param value: Either a numerical YYYYMMDD or DDMMYYY string (separated by | 748 | * @param value: Either a numerical YYYYMMDD or DDMMYYY string (separated by |
338 | 720 | * C{/}, C{.} or C{-}) or a relative time reference, as supported by | 749 | * C{/}, C{.} or C{-}) or a relative time reference, as supported by |
339 | @@ -759,10 +788,11 @@ | |||
340 | 759 | y = Methanal.Util.strToInt(parts[2]); | 788 | y = Methanal.Util.strToInt(parts[2]); |
341 | 760 | } | 789 | } |
342 | 761 | 790 | ||
344 | 762 | if (_validDate(y, m, d)) | 791 | if (_validDate(y, m, d)) { |
345 | 763 | // TODO: In the future, "guess" should be able to guess times as | 792 | // TODO: In the future, "guess" should be able to guess times as |
346 | 764 | // well as dates. | 793 | // well as dates. |
347 | 765 | return Methanal.Util.Time.fromDate(new Date(y, m, d)).oneDay(); | 794 | return Methanal.Util.Time.fromDate(new Date(y, m, d)).oneDay(); |
348 | 795 | } | ||
349 | 766 | } | 796 | } |
350 | 767 | 797 | ||
351 | 768 | throw new Methanal.Util.TimeParseError( | 798 | throw new Methanal.Util.TimeParseError( |
352 | 769 | 799 | ||
353 | === modified file 'methanal/js/Methanal/View.js' | |||
354 | --- methanal/js/Methanal/View.js 2009-10-05 00:15:43 +0000 | |||
355 | +++ methanal/js/Methanal/View.js 2009-10-09 22:36:14 +0000 | |||
356 | @@ -1605,7 +1605,13 @@ | |||
357 | 1605 | function makeDisplayValue(self, value) { | 1605 | function makeDisplayValue(self, value) { |
358 | 1606 | var msg = ''; | 1606 | var msg = ''; |
359 | 1607 | try { | 1607 | try { |
361 | 1608 | var time = Methanal.Util.Time.fromTimestamp(value).oneDay(); | 1608 | // XXX: There is probably a potential bug here: If "value" (a UTC |
362 | 1609 | // timestamp) falls before the switch-over for daylight savings | ||
363 | 1610 | // before the timezone offset has been corrected for, the timezone | ||
364 | 1611 | // offset given here will be the wrong one. | ||
365 | 1612 | var d = new Date(value); | ||
366 | 1613 | var time = Methanal.Util.Time.fromTimestamp( | ||
367 | 1614 | value, d.getTimezoneOffset()).oneDay(); | ||
368 | 1609 | if (time) { | 1615 | if (time) { |
369 | 1610 | msg = time.asHumanly(self.twentyFourHours); | 1616 | msg = time.asHumanly(self.twentyFourHours); |
370 | 1611 | } | 1617 | } |
> 7 self._knownTime = Methanal. Util.Time. fromDate(
> 8 - new Date(2009, 8, 6, 1, 36, 23, 2));
> 9 + new Date(2009, 8, 6, 1, 36, 23, 2), true);
As far as I can tell, fromDate only takes one parameter; what is the point of passing true here?