The ecma_date_make_day() handled any date in October on leap years incorrectly, which was mentioned in issue #1836. The ecma_date_week_day() returned minus values when return week_day before 1970 years which was also incorrect. This change solves these bugs. In addition, this enhances the algorithm of accessing 'the ym-mn-1' by replacing binary search to simple computation at ecma_date_make_day(). JerryScript-DCO-1.0-Signed-off-by: Hayun Lee lhy920806@gmail.com
This commit is contained in:
@@ -432,7 +432,8 @@ ecma_date_week_day (ecma_number_t time) /**< time value */
|
|||||||
return time; /* time is NaN */
|
return time; /* time is NaN */
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ecma_number_t) fmod ((ecma_date_day (time) + 4), 7);
|
ecma_number_t week_day = (ecma_number_t) fmod ((ecma_date_day (time) + 4), 7);
|
||||||
|
return (week_day < 0) ? 7 + week_day : week_day;
|
||||||
} /* ecma_date_week_day */
|
} /* ecma_date_week_day */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -752,45 +753,19 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
|
|||||||
|
|
||||||
/* 7. */
|
/* 7. */
|
||||||
ecma_number_t time = ecma_date_time_from_year (ym);
|
ecma_number_t time = ecma_date_time_from_year (ym);
|
||||||
int32_t step = 182;
|
|
||||||
int32_t delta = step;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The algorithm below searches the following date: ym-mn-1
|
* The algorithm below searches the following date: ym-mn-1
|
||||||
* To find this time it starts from the beggining of the year (ym)
|
* To find this time it starts from the beggining of the year (ym)
|
||||||
* then increase it by ECMA_DATE_MS_PER_DAY until it reaches the
|
* then find the first day of the month.
|
||||||
* right date.
|
|
||||||
*/
|
*/
|
||||||
if (ecma_date_year_from_time (time) == ym)
|
if (ecma_date_year_from_time (time) == ym)
|
||||||
{
|
{
|
||||||
/**
|
/* Get the month */
|
||||||
* Binary search to get the closest day in the previous month.
|
time += 31 * mn * ECMA_DATE_MS_PER_DAY;
|
||||||
* It has to use integer days so sometimes the found time
|
|
||||||
* needs some more increasing which is done day by day below.
|
|
||||||
*/
|
|
||||||
while (delta)
|
|
||||||
{
|
|
||||||
if (ecma_date_month_from_time (time + step * ECMA_DATE_MS_PER_DAY) < mn)
|
|
||||||
{
|
|
||||||
step += delta;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
step -= delta;
|
|
||||||
}
|
|
||||||
delta = delta / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ecma_date_month_from_time (time + step) < mn)
|
|
||||||
{
|
|
||||||
time += step * ECMA_DATE_MS_PER_DAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the month's first day */
|
/* Get the month's first day */
|
||||||
while (ecma_date_month_from_time (time) < mn)
|
time += ((ecma_number_t) 1.0 - ecma_date_date_from_time (time)) * ECMA_DATE_MS_PER_DAY;
|
||||||
{
|
|
||||||
time += ECMA_DATE_MS_PER_DAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1)
|
if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// Copyright 2016 Hayun Lee (lhy920806@gmail.com)
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
for (var y = 1950; y < 2050; y++) {
|
||||||
|
for (var m = 0; m < 12; m++) {
|
||||||
|
var last_date = new Date(y, m, 1).getDay ();
|
||||||
|
assert (!isNaN (last_date));
|
||||||
|
for (var d = 1; d < 32; d++) {
|
||||||
|
assert (last_date == new Date(y, m, d).getDay ());
|
||||||
|
last_date = (last_date + 1) % 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -162,6 +162,8 @@ main ()
|
|||||||
TEST_ASSERT (ecma_date_make_day (1970, 1, 35) == 65);
|
TEST_ASSERT (ecma_date_make_day (1970, 1, 35) == 65);
|
||||||
TEST_ASSERT (ecma_date_make_day (1970, 13, 35) == 430);
|
TEST_ASSERT (ecma_date_make_day (1970, 13, 35) == 430);
|
||||||
TEST_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861);
|
TEST_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861);
|
||||||
|
TEST_ASSERT (ecma_date_make_day (2016, 8, 31) == 17075);
|
||||||
|
TEST_ASSERT (ecma_date_make_day (2016, 9, 1) == 17075);
|
||||||
|
|
||||||
/* ecma_number_t ecma_date_make_date (day, time) */
|
/* ecma_number_t ecma_date_make_date (day, time) */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user