27
27
* @{
28
28
*/
29
29
30
- /* 24 * 3600 * 1000 */
31
- #define ECMA_MS_PER_DAY 86400000
30
+ #define ECMA_DATE_HOURS_PER_DAY 24
31
+ #define ECMA_DATE_MINUTES_PER_HOUR 60
32
+ #define ECMA_DATE_SECONDS_PER_MINUTE 60
33
+ #define ECMA_DATE_MS_PER_SECOND 1000
34
+ /* ECMA_DATE_MS_PER_MINUTE == 60000 */
35
+ #define ECMA_DATE_MS_PER_MINUTE (ECMA_DATE_MS_PER_SECOND * ECMA_DATE_SECONDS_PER_MINUTE)
36
+ /* ECMA_DATE_MS_PER_HOUR == 3600000 */
37
+ #define ECMA_DATE_MS_PER_HOUR (ECMA_DATE_MS_PER_MINUTE * ECMA_DATE_MINUTES_PER_HOUR)
38
+ /* ECMA_DATE_MS_PER_DAY == 86400000 */
39
+ #define ECMA_DATE_MS_PER_DAY (ECMA_DATE_MS_PER_HOUR * ECMA_DATE_HOURS_PER_DAY)
40
+ #define ECMA_DATE_MAX_VALUE 8.64e15
32
41
33
42
/* *
34
43
* Helper function to get day number from time value.
41
50
int __attr_always_inline___
42
51
ecma_date_day (ecma_number_t time) /* *< time value */
43
52
{
44
- return (int ) floor (time / ECMA_MS_PER_DAY );
53
+ return (int ) floor (time / ECMA_DATE_MS_PER_DAY );
45
54
} /* ecma_date_day */
46
55
47
56
/* *
@@ -55,7 +64,7 @@ ecma_date_day (ecma_number_t time) /**< time value */
55
64
ecma_number_t __attr_always_inline___
56
65
ecma_date_time_within_day (ecma_number_t time) /* *< time value */
57
66
{
58
- return (ecma_number_t ) fmod (time, ECMA_MS_PER_DAY );
67
+ return (ecma_number_t ) fmod (time, ECMA_DATE_MS_PER_DAY );
59
68
} /* ecma_date_time_within_day */
60
69
61
70
/* *
@@ -115,7 +124,7 @@ ecma_date_day_from_year (ecma_number_t year) /**< year value */
115
124
ecma_number_t __attr_always_inline___
116
125
ecma_date_time_from_year (ecma_number_t year) /* *< year value */
117
126
{
118
- return ECMA_MS_PER_DAY * (ecma_number_t ) ecma_date_day_from_year (year);
127
+ return ECMA_DATE_MS_PER_DAY * (ecma_number_t ) ecma_date_day_from_year (year);
119
128
} /* ecma_date_time_from_year */
120
129
121
130
/* *
@@ -358,9 +367,9 @@ ecma_date_daylight_saving_ta (ecma_number_t __attr_unused___ time)
358
367
* @return local time
359
368
*/
360
369
ecma_number_t __attr_always_inline___
361
- ecma_date_local_time (ecma_number_t __attr_unused___ time)
370
+ ecma_date_local_time (ecma_number_t time)
362
371
{
363
- JERRY_UNIMPLEMENTED ( " The ecma_date_local_time is not implemented yet. " );
372
+ return time + ecma_date_local_tza () + ecma_date_daylight_saving_ta (time );
364
373
} /* ecma_date_local_time */
365
374
366
375
/* *
@@ -372,9 +381,10 @@ ecma_date_local_time (ecma_number_t __attr_unused___ time)
372
381
* @return utc value
373
382
*/
374
383
ecma_number_t __attr_always_inline___
375
- ecma_date_utc (ecma_number_t __attr_unused___ time)
384
+ ecma_date_utc (ecma_number_t time)
376
385
{
377
- JERRY_UNIMPLEMENTED (" The ecma_date_utc is not implemented yet." );
386
+ ecma_number_t simple_utc_time = time - ecma_date_local_tza ();
387
+ return simple_utc_time - ecma_date_daylight_saving_ta (simple_utc_time);
378
388
} /* ecma_date_utc */
379
389
380
390
/* *
@@ -386,9 +396,10 @@ ecma_date_utc (ecma_number_t __attr_unused___ time)
386
396
* @return hour value
387
397
*/
388
398
ecma_number_t __attr_always_inline___
389
- ecma_date_hour_from_time (ecma_number_t __attr_unused___ time)
399
+ ecma_date_hour_from_time (ecma_number_t time)
390
400
{
391
- JERRY_UNIMPLEMENTED (" The ecma_date_hour_from_time is not implemented yet." );
401
+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_HOUR),
402
+ ECMA_DATE_HOURS_PER_DAY);
392
403
} /* ecma_date_hour_from_time */
393
404
394
405
/* *
@@ -400,9 +411,10 @@ ecma_date_hour_from_time (ecma_number_t __attr_unused___ time)
400
411
* @return minute value
401
412
*/
402
413
ecma_number_t __attr_always_inline___
403
- ecma_date_min_from_time (ecma_number_t __attr_unused___ time)
414
+ ecma_date_min_from_time (ecma_number_t time)
404
415
{
405
- JERRY_UNIMPLEMENTED (" The ecma_date_min_from_time is not implemented yet." );
416
+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_MINUTE),
417
+ ECMA_DATE_MINUTES_PER_HOUR);
406
418
} /* ecma_date_min_from_time */
407
419
408
420
/* *
@@ -414,9 +426,10 @@ ecma_date_min_from_time (ecma_number_t __attr_unused___ time)
414
426
* @return second value
415
427
*/
416
428
ecma_number_t __attr_always_inline___
417
- ecma_date_sec_from_time (ecma_number_t __attr_unused___ time)
429
+ ecma_date_sec_from_time (ecma_number_t time)
418
430
{
419
- JERRY_UNIMPLEMENTED (" The ecma_date_sec_from_time is not implemented yet." );
431
+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_SECOND),
432
+ ECMA_DATE_SECONDS_PER_MINUTE);
420
433
} /* ecma_date_sec_from_time */
421
434
422
435
/* *
@@ -428,9 +441,9 @@ ecma_date_sec_from_time (ecma_number_t __attr_unused___ time)
428
441
* @return millisecond value
429
442
*/
430
443
ecma_number_t __attr_always_inline___
431
- ecma_date_ms_from_time (ecma_number_t __attr_unused___ time)
444
+ ecma_date_ms_from_time (ecma_number_t time)
432
445
{
433
- JERRY_UNIMPLEMENTED ( " The ecma_date_ms_from_time is not implemented yet. " );
446
+ return ( ecma_number_t ) fmod (time, ECMA_DATE_MS_PER_SECOND );
434
447
} /* ecma_date_ms_from_time */
435
448
436
449
/* *
@@ -442,12 +455,30 @@ ecma_date_ms_from_time (ecma_number_t __attr_unused___ time)
442
455
* @return time value
443
456
*/
444
457
ecma_number_t __attr_always_inline___
445
- ecma_date_make_time (ecma_number_t __attr_unused___ hour,
446
- ecma_number_t __attr_unused___ min,
447
- ecma_number_t __attr_unused___ sec,
448
- ecma_number_t __attr_unused___ ms)
458
+ ecma_date_make_time (ecma_number_t hour,
459
+ ecma_number_t min,
460
+ ecma_number_t sec,
461
+ ecma_number_t ms)
449
462
{
450
- JERRY_UNIMPLEMENTED (" The ecma_date_make_time is not implemented yet." );
463
+ if (ecma_number_is_nan (hour) || ecma_number_is_infinity (hour)
464
+ || ecma_number_is_nan (min) || ecma_number_is_infinity (min)
465
+ || ecma_number_is_nan (sec) || ecma_number_is_infinity (sec)
466
+ || ecma_number_is_nan (ms) || ecma_number_is_infinity (ms))
467
+ {
468
+ return ecma_number_make_nan ();
469
+ }
470
+
471
+ ecma_number_t h = ecma_number_trunc (hour);
472
+ ecma_number_t m = ecma_number_trunc (min);
473
+ ecma_number_t s = ecma_number_trunc (sec);
474
+ ecma_number_t milli = ecma_number_trunc (ms);
475
+
476
+ /* FIXME: performing the arithmetic according to IEEE 754 rules
477
+ * (that is, as if using the ECMAScript operators * and +) */
478
+ return (h * ECMA_DATE_MS_PER_HOUR
479
+ + m * ECMA_DATE_MS_PER_MINUTE
480
+ + s * ECMA_DATE_MS_PER_SECOND
481
+ + milli);
451
482
} /* ecma_date_make_time */
452
483
453
484
/* *
@@ -459,11 +490,35 @@ ecma_date_make_time (ecma_number_t __attr_unused___ hour,
459
490
* @return day value
460
491
*/
461
492
ecma_number_t __attr_always_inline___
462
- ecma_date_make_day (ecma_number_t __attr_unused___ year,
463
- ecma_number_t __attr_unused___ month,
464
- ecma_number_t __attr_unused___ date)
493
+ ecma_date_make_day (ecma_number_t year,
494
+ ecma_number_t month,
495
+ ecma_number_t date)
465
496
{
466
- JERRY_UNIMPLEMENTED (" The ecma_date_make_day is not implemented yet." );
497
+ if (ecma_number_is_nan (year) || ecma_number_is_infinity (year)
498
+ || ecma_number_is_nan (month) || ecma_number_is_infinity (month)
499
+ || ecma_number_is_nan (date) || ecma_number_is_infinity (date))
500
+ {
501
+ return ecma_number_make_nan ();
502
+ }
503
+
504
+ ecma_number_t y = ecma_number_trunc (year);
505
+ ecma_number_t m = ecma_number_trunc (month);
506
+ ecma_number_t dt = ecma_number_trunc (date);
507
+ ecma_number_t ym = y + (ecma_number_t ) floor (m / 12 );
508
+ ecma_number_t mn = (ecma_number_t ) fmod (m, 12 );
509
+ ecma_number_t time = ecma_date_time_from_year (ym);
510
+
511
+ JERRY_ASSERT (ecma_date_year_from_time (time) == ym);
512
+
513
+ while (ecma_date_month_from_time (time) < mn)
514
+ {
515
+ time += ECMA_DATE_MS_PER_DAY;
516
+ }
517
+
518
+ JERRY_ASSERT ((ecma_date_month_from_time (time) == mn)
519
+ && (ecma_date_date_from_time (time) == 1 ));
520
+
521
+ return (ecma_number_t ) ecma_date_day (time) + dt - ((ecma_number_t ) 1.0 );
467
522
} /* ecma_date_make_day */
468
523
469
524
/* *
@@ -475,9 +530,15 @@ ecma_date_make_day (ecma_number_t __attr_unused___ year,
475
530
* @return date value
476
531
*/
477
532
ecma_number_t __attr_always_inline___
478
- ecma_date_make_date (ecma_number_t __attr_unused___ day, ecma_number_t __attr_unused___ time)
533
+ ecma_date_make_date (ecma_number_t day, ecma_number_t time)
479
534
{
480
- JERRY_UNIMPLEMENTED (" The ecma_date_make_date is not implemented yet." );
535
+ if (ecma_number_is_nan (day) || ecma_number_is_infinity (day)
536
+ || ecma_number_is_nan (time) || ecma_number_is_infinity (time))
537
+ {
538
+ return ecma_number_make_nan ();
539
+ }
540
+
541
+ return day * ECMA_DATE_MS_PER_DAY + time;
481
542
} /* ecma_date_make_date */
482
543
483
544
/* *
@@ -489,9 +550,15 @@ ecma_date_make_date (ecma_number_t __attr_unused___ day, ecma_number_t __attr_un
489
550
* @return number of milliseconds
490
551
*/
491
552
ecma_number_t __attr_always_inline___
492
- ecma_date_time_clip (ecma_number_t __attr_unused___ year )
553
+ ecma_date_time_clip (ecma_number_t time )
493
554
{
494
- JERRY_UNIMPLEMENTED (" The ecma_date_time_clip is not implemented yet." );
555
+ if (ecma_number_is_nan (time) || ecma_number_is_infinity (time)
556
+ || fabs (time) > ECMA_DATE_MAX_VALUE)
557
+ {
558
+ return ecma_number_make_nan ();
559
+ }
560
+
561
+ return ecma_number_trunc (time);
495
562
} /* ecma_date_time_clip */
496
563
497
564
/* *
0 commit comments