📄 jsdate.c
字号:
/* * Check that obj is an object of class Date, and get the date value. * Return NULL on failure. */static jsdouble *date_getProlog(JSContext *cx, JSObject *obj, jsval *argv){ if (!JS_InstanceOf(cx, obj, &js_DateClass, argv)) return NULL; return JSVAL_TO_DOUBLE(OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE));}/* * See ECMA 15.9.5.4 thru 15.9.5.23 */static JSBooldate_getTime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; return js_NewNumberValue(cx, *date, rval);}static JSBooldate_getYear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble *date; jsdouble result; date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = YearFromTime(LocalTime(result)); /* Follow ECMA-262 to the letter, contrary to IE JScript. */ result -= 1900; return js_NewNumberValue(cx, result, rval);}static JSBooldate_getFullYear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = YearFromTime(LocalTime(result)); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCFullYear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = YearFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getMonth(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = MonthFromTime(LocalTime(result)); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCMonth(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = MonthFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = LocalTime(result); result = DateFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCDate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = DateFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getDay(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = LocalTime(result); result = WeekDay(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCDay(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = WeekDay(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getHours(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = HourFromTime(LocalTime(result)); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCHours(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = HourFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getMinutes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = MinFromTime(LocalTime(result)); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getUTCMinutes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = MinFromTime(result); return js_NewNumberValue(cx, result, rval);}/* Date.getSeconds is mapped to getUTCSeconds */static JSBooldate_getUTCSeconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = SecFromTime(result); return js_NewNumberValue(cx, result, rval);}/* Date.getMilliseconds is mapped to getUTCMilliseconds */static JSBooldate_getUTCMilliseconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); result = msFromTime(result); return js_NewNumberValue(cx, result, rval);}static JSBooldate_getTimezoneOffset(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; /* * Return the time zone offset in minutes for the current locale * that is appropriate for this time. This value would be a * constant except for daylight savings time. */ result = (result - LocalTime(result)) / msPerMinute; return js_NewNumberValue(cx, result, rval);}static JSBooldate_setTime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; if (!js_ValueToNumber(cx, argv[0], &result)) return JS_FALSE; result = TIMECLIP(result); *date = result; return js_NewNumberValue(cx, result, rval);}static JSBooldate_makeTime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, uintN maxargs, JSBool local, jsval *rval){ uintN i; jsdouble args[4], *argp, *stop; jsdouble hour, min, sec, msec; jsdouble lorutime; /* Local or UTC version of *date */ jsdouble msec_time; jsdouble result; jsdouble *date = date_getProlog(cx, obj, argv); if (!date) return JS_FALSE; result = *date; /* just return NaN if the date is already NaN */ if (!JSDOUBLE_IS_FINITE(result)) return js_NewNumberValue(cx, result, rval); /* Satisfy the ECMA rule that if a function is called with * fewer arguments than the specified formal arguments, the * remaining arguments are set to undefined. Seems like all * the Date.setWhatever functions in ECMA are only varargs * beyond the first argument; this should be set to undefined * if it's not given. This means that "d = new Date(); * d.setMilliseconds()" returns NaN. Blech. */ if (argc == 0) argc = 1; /* should be safe, because length of all setters is 1 */ else if (argc > maxargs) argc = maxargs; /* clamp argc */ for (i = 0; i < argc; i++) { if (!js_ValueToNumber(cx, argv[i], &args[i])) return JS_FALSE; if (!JSDOUBLE_IS_FINITE(args[i])) { *date = *cx->runtime->jsNaN; return js_NewNumberValue(cx, *date, rval); } args[i] = js_DoubleToInteger(args[i]); } if (local) lorutime = LocalTime(result); else lorutime = result; argp = args; stop = argp + argc; if (maxargs >= 4 && argp < stop) hour = *argp++; else hour = HourFromTime(lorutime); if (maxargs >= 3 && argp < stop) min = *argp++; else min = MinFromTime(lorutime); if (maxargs >= 2 && argp < stop) sec = *argp++; else sec = SecFromTime(lorutime); if (maxargs >= 1 && argp < stop) msec = *argp; else msec = msFromTime(lorutime); msec_time = MakeTime(hour, min, sec, msec); result = MakeDate(Day(lorutime), msec_time);/* fprintf(stderr, "%f\n", result); */ if (local) result = UTC(result);/* fprintf(stderr, "%f\n", result); */ *date = TIMECLIP(result); return js_NewNumberValue(cx, *date, rval);}static JSBooldate_setMilliseconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return date_makeTime(cx, obj, argc, argv, 1, JS_TRUE, rval);}static JSBooldate_setUTCMilliseconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return date_makeTime(cx, obj, argc, argv, 1, JS_FALSE, rval);}static JSBooldate_setSeconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return date_makeTime(cx, obj, argc, argv, 2, JS_TRUE, rval);}static JSBooldate_setUTCSeconds(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return date_makeTime(cx, obj, argc, argv, 2, JS_FALSE, rval);}static JSBooldate_setMinutes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return date_makeTime(cx, obj, argc, argv, 3, JS_TRUE, rval);}static JSBooldate_setUTCMinutes(JSContext *cx, JSObject *obj, uintN argc,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -