You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

66 lines
1.8 KiB

/*===
0
32
3802
-1439089
32
32
-1439089
-1439089
-719474
-719474
===*/
/* MakeDay() is not exposed directly, but setUTCFullYear() will call MakeDay()
* with parameters given in the call. It will then combine the result with
* MakeDate(), keeping the time-within-day same as before. By using 00:00:00
* as the time, the day number can then be computed easily from the result.
*
* However: the arguments to MakeDay() will be ToNumber() coerced by
* setUTCFullYear(), and the result will go through TimeClip().
*/
// Note: month is zero-based, day is one-based
function MakeDay(year, month, day) {
var d;
var res;
d = new Date(0);
d.setUTCFullYear(year, month, day);
res = d.getTime() / (24 * 60 * 60 * 1000);
if (Math.floor(res) !== res) {
throw new Error('MakeDay() result not a multiple of days');
}
return res;
}
try {
// simple tests
print(MakeDay(1970, 0, 1));
print(MakeDay(1970, 1, 2));
// components don't need to be normalized on input
// 123 = 10 years + 3 months
print(MakeDay(1970, 123, 60));
// components may also be negative
print(MakeDay(-1970, -1, -2));
// components are ToInteger() rounded, which rounds towards zero
print(MakeDay(1970.1, 1.1, 2.1));
print(MakeDay(1970.9, 1.9, 2.9));
print(MakeDay(-1970.1, -1.1, -2.1));
print(MakeDay(-1970.9, -1.9, -2.9));
// Components even outside valid ecmascript range are OK as long as
// the result will be within Ecmascript range. Here day and month
// should cancel out, leaving year zero, day 55.
print(MakeDay(100e10, -1200e10, 55));
print(MakeDay(0, 0, 55));
// FIXME: rounding errors? MakeTime() is required to use Ecmascript
// (IEEE double) arithmetic. These never occur unless extremely
// unnormalized values are used.
} catch (e) {
print(e.name);
}