33 time_val = isolate->date_cache()->ToUTC(
static_cast<int64_t
>(time_val));
35 date->SetValue(time_val);
36 return *isolate->factory()->NewNumber(time_val);
40 return ReadOnlyRoots(isolate).nan_value();
46 date->SetValue(time_val);
47 return *isolate->factory()->NewNumber(time_val);
50 return ReadOnlyRoots(isolate).nan_value();
58 if (IsUndefined(*
args.new_target(), isolate)) {
59 double const time_val =
64 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
67 int const argc =
args.length() - 1;
73 }
else if (argc == 1) {
75 if (IsJSDate(*value)) {
80 if (IsString(*value)) {
97 double date = 1.0, hours = 0.0, minutes = 0.0, seconds = 0.0, ms = 0.0;
128 if (!std::isnan(year)) {
130 if (0.0 <=
y &&
y <= 99) year = 1900 +
y;
133 double const time =
MakeTime(hours, minutes, seconds, ms);
137 time_val = isolate->date_cache()->ToUTC(
static_cast<int64_t
>(time_val));
139 time_val = std::numeric_limits<double>::quiet_NaN();
148 return *isolate->factory()->NewNumberFromInt64(
165 int const argc =
args.length() - 1;
166 double year = std::numeric_limits<double>::quiet_NaN();
167 double month = 0.0,
date = 1.0, hours = 0.0, minutes = 0.0, seconds = 0.0,
197 isolate, seconds_object,
212 if (!std::isnan(year)) {
214 if (0.0 <=
y &&
y <= 99) year = 1900 +
y;
217 double const time =
MakeTime(hours, minutes, seconds, ms);
220 return *isolate->factory()->NewNumber(value);
230 double time_val =
date->value();
233 if (std::isnan(time_val)) {
237 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
238 int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms);
239 int const days = isolate->date_cache()->DaysFromTime(local_time_ms);
240 int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms,
days);
241 int year, month, day;
242 isolate->date_cache()->YearMonthDayFromDays(
days, &year, &month, &day);
245 return SetLocalDateValue(isolate,
date, time_val);
252 int const argc =
args.length() - 1;
258 int time_within_day = 0;
259 if (!std::isnan(
date->value())) {
260 int64_t
const time_ms =
static_cast<int64_t
>(
date->value());
261 int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms);
262 int const days = isolate->date_cache()->DaysFromTime(local_time_ms);
263 time_within_day = isolate->date_cache()->TimeInDay(local_time_ms,
days);
264 int year_int, month_int, day_int;
265 isolate->date_cache()->YearMonthDayFromDays(
days, &year_int, &month_int,
267 month_double = month_int;
268 day_double = day_int;
283 MakeDate(
MakeDay(year_double, month_double, day_double), time_within_day);
284 return SetLocalDateValue(isolate,
date, time_val);
291 int const argc =
args.length() - 1;
293 double time_val =
date->value();
297 std::optional<double>
m;
298 std::optional<double>
s;
299 std::optional<double> milli;
320 if (std::isnan(time_val)) {
324 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
325 int64_t
const local_time_ms = isolate->date_cache()->ToLocal(time_ms);
326 int const day = isolate->date_cache()->DaysFromTime(local_time_ms);
327 int const time_within_day =
328 isolate->date_cache()->TimeInDay(local_time_ms, day);
330 day,
MakeTime(h,
m.value_or((time_within_day / (60 * 1000)) % 60),
331 s.value_or((time_within_day / 1000) % 60),
332 milli.value_or(time_within_day % 1000)));
333 return SetLocalDateValue(isolate,
date, time_val);
341 double time_val =
date->value();
344 if (std::isnan(time_val)) {
347 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
348 int64_t
const local_time_ms = isolate->date_cache()->ToLocal(time_ms);
349 int const day = isolate->date_cache()->DaysFromTime(local_time_ms);
350 int const time_within_day =
351 isolate->date_cache()->TimeInDay(local_time_ms, day);
352 int const h = time_within_day / (60 * 60 * 1000);
353 int const m = (time_within_day / (60 * 1000)) % 60;
354 int const s = (time_within_day / 1000) % 60;
357 return SetLocalDateValue(isolate,
date, time_val);
364 int const argc =
args.length() - 1;
366 double time_val =
date->value();
369 std::optional<double>
s;
370 std::optional<double> milli;
385 if (std::isnan(time_val)) {
389 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
390 int64_t
const local_time_ms = isolate->date_cache()->ToLocal(time_ms);
391 int const day = isolate->date_cache()->DaysFromTime(local_time_ms);
392 int const time_within_day =
393 isolate->date_cache()->TimeInDay(local_time_ms, day);
394 int const h = time_within_day / (60 * 60 * 1000);
398 milli.value_or(time_within_day % 1000)));
399 return SetLocalDateValue(isolate,
date, time_val);
406 int const argc =
args.length() - 1;
408 double time_val = this_date->value();
411 std::optional<double> dt;
420 if (std::isnan(time_val)) {
424 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
425 int64_t
const local_time_ms = isolate->date_cache()->ToLocal(time_ms);
426 int const days = isolate->date_cache()->DaysFromTime(local_time_ms);
427 int const time_within_day =
428 isolate->date_cache()->TimeInDay(local_time_ms,
days);
429 int year, unused, day;
430 isolate->date_cache()->YearMonthDayFromDays(
days, &year, &unused, &day);
434 return SetLocalDateValue(isolate, this_date, time_val);
441 int const argc =
args.length() - 1;
443 double time_val =
date->value();
446 std::optional<double> milli;
455 if (std::isnan(time_val)) {
459 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
460 int64_t
const local_time_ms = isolate->date_cache()->ToLocal(time_ms);
461 int const day = isolate->date_cache()->DaysFromTime(local_time_ms);
462 int const time_within_day =
463 isolate->date_cache()->TimeInDay(local_time_ms, day);
464 int const h = time_within_day / (60 * 60 * 1000);
465 double const m = (time_within_day / (60 * 1000)) % 60;
469 return SetLocalDateValue(isolate,
date, time_val);
483 double clipped_value = value_double;
485 date->SetValue(clipped_value);
493 return *isolate->factory()->NewNumber(clipped_value);
504 double time_val =
date->value();
507 if (std::isnan(time_val)) {
511 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
512 int const days = isolate->date_cache()->DaysFromTime(time_ms);
513 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms,
days);
514 int year, month, day;
515 isolate->date_cache()->YearMonthDayFromDays(
days, &year, &month, &day);
518 return SetDateValue(isolate,
date, time_val);
525 int const argc =
args.length() - 1;
531 int time_within_day = 0;
532 if (!std::isnan(
date->value())) {
533 int64_t
const time_ms =
static_cast<int64_t
>(
date->value());
534 int const days = isolate->date_cache()->DaysFromTime(time_ms);
535 time_within_day = isolate->date_cache()->TimeInDay(time_ms,
days);
536 int year_int, month_int, day_int;
537 isolate->date_cache()->YearMonthDayFromDays(
days, &year_int, &month_int,
539 month_double = month_int;
540 day_double = day_int;
554 double const time_val =
555 MakeDate(
MakeDay(year_double, month_double, day_double), time_within_day);
556 return SetDateValue(isolate,
date, time_val);
563 int const argc =
args.length() - 1;
565 double time_val =
date->value();
569 std::optional<double>
m;
570 std::optional<double>
s;
571 std::optional<double> milli;
592 if (std::isnan(time_val)) {
596 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
597 int const day = isolate->date_cache()->DaysFromTime(time_ms);
598 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms, day);
600 day,
MakeTime(h,
m.value_or((time_within_day / (60 * 1000)) % 60),
601 s.value_or((time_within_day / 1000) % 60),
602 milli.value_or(time_within_day % 1000)));
603 return SetDateValue(isolate,
date, time_val);
611 double time_val =
date->value();
614 if (std::isnan(time_val)) {
618 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
619 int const day = isolate->date_cache()->DaysFromTime(time_ms);
620 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms, day);
621 int const h = time_within_day / (60 * 60 * 1000);
622 int const m = (time_within_day / (60 * 1000)) % 60;
623 int const s = (time_within_day / 1000) % 60;
626 return SetDateValue(isolate,
date, time_val);
633 int const argc =
args.length() - 1;
635 double time_val =
date->value();
638 std::optional<double>
s;
639 std::optional<double> milli;
654 if (std::isnan(time_val)) {
658 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
659 int const day = isolate->date_cache()->DaysFromTime(time_ms);
660 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms, day);
661 int const h = time_within_day / (60 * 60 * 1000);
665 milli.value_or(time_within_day % 1000)));
666 return SetDateValue(isolate,
date, time_val);
673 int const argc =
args.length() - 1;
675 double time_val = this_date->value();
678 std::optional<double> dt;
686 if (std::isnan(time_val)) {
690 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
691 int const days = isolate->date_cache()->DaysFromTime(time_ms);
692 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms,
days);
693 int year, unused, day;
694 isolate->date_cache()->YearMonthDayFromDays(
days, &year, &unused, &day);
698 return SetDateValue(isolate, this_date, time_val);
705 int const argc =
args.length() - 1;
707 double time_val =
date->value();
710 std::optional<double> milli;
717 if (std::isnan(time_val)) {
721 int64_t
const time_ms =
static_cast<int64_t
>(time_val);
722 int const day = isolate->date_cache()->DaysFromTime(time_ms);
723 int const time_within_day = isolate->date_cache()->TimeInDay(time_ms, day);
724 int const h = time_within_day / (60 * 60 * 1000);
725 double const m = (time_within_day / (60 * 1000)) % 60;
729 return SetDateValue(isolate,
date, time_val);
739 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
746 double const time_val =
date->value();
747 if (std::isnan(time_val)) {
749 isolate, NewRangeError(MessageTemplate::kInvalidTimeValue));
754 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
764 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
774 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
777#ifdef V8_INTL_SUPPORT
779BUILTIN(DatePrototypeToLocaleDateString) {
784 const char* method_name =
"Date.prototype.toLocaleDateString";
791 args.atOrUndefined(isolate, 1),
792 args.atOrUndefined(isolate, 2),
799BUILTIN(DatePrototypeToLocaleString) {
800 HandleScope scope(isolate);
804 const char* method_name =
"Date.prototype.toLocaleString";
811 args.atOrUndefined(isolate, 1),
812 args.atOrUndefined(isolate, 2),
819BUILTIN(DatePrototypeToLocaleTimeString) {
820 HandleScope scope(isolate);
824 const char* method_name =
"Date.prototype.toLocaleTimeString";
831 args.atOrUndefined(isolate, 1),
832 args.atOrUndefined(isolate, 2),
846 isolate, isolate->factory()->NewStringFromUtf8(
base::VectorOf(buffer)));
853 double time_val =
date->value();
854 if (std::isnan(time_val))
return ReadOnlyRoots(isolate).nan_value();
855 int64_t time_ms =
static_cast<int64_t
>(time_val);
856 int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms);
857 int days = isolate->date_cache()->DaysFromTime(local_time_ms);
858 int year, month, day;
859 isolate->date_cache()->YearMonthDayFromDays(
days, &year, &month, &day);
870 double month_double = 0.0, day_double = 1.0,
872 if (!std::isnan(year_double)) {
874 if (0.0 <= year_int && year_int <= 99.0) {
875 year_double = 1900.0 + year_int;
878 int time_within_day = 0;
879 if (!std::isnan(
date->value())) {
880 int64_t
const time_ms =
static_cast<int64_t
>(
date->value());
881 int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms);
882 int const days = isolate->date_cache()->DaysFromTime(local_time_ms);
883 time_within_day = isolate->date_cache()->TimeInDay(local_time_ms,
days);
884 int year_int, month_int, day_int;
885 isolate->date_cache()->YearMonthDayFromDays(
days, &year_int, &month_int,
887 month_double = month_int;
888 day_double = day_int;
891 MakeDate(
MakeDay(year_double, month_double, day_double), time_within_day);
892 return SetLocalDateValue(isolate,
date, time_val);
910 isolate->factory()->NewStringFromAsciiChecked(
"toISOString");
914 if (!IsCallable(*function)) {
916 isolate, NewTypeError(MessageTemplate::kCalledNonCallable, name));
932 isolate->factory()->NewNumber(
date->value())));
#define CHECK_RECEIVER(Type, name, method)
@ kDateToLocaleTimeString
@ kDateToLocaleDateString
static MaybeHandle< BigInt > Multiply(Isolate *isolate, DirectHandle< BigInt > x, DirectHandle< BigInt > y)
static V8_EXPORT_PRIVATE Handle< BigInt > FromInt64(Isolate *isolate, int64_t n)
static V8_EXPORT_PRIVATE MaybeHandle< BigInt > FromNumber(Isolate *isolate, DirectHandle< Object > number)
static bool TryTimeClip(double *time)
static const int64_t kMaxTimeBeforeUTCInMs
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Object > Call(Isolate *isolate, DirectHandle< Object > callable, DirectHandle< Object > receiver, base::Vector< const DirectHandle< Object > > args)
static int64_t CurrentTimeValue(Isolate *isolate)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< JSDate > New(DirectHandle< JSFunction > constructor, DirectHandle< JSReceiver > new_target, double tv)
static V8_WARN_UNUSED_RESULT HandleType< String >::MaybeType ToString(Isolate *isolate, HandleType< T > input)
static V8_WARN_UNUSED_RESULT HandleType< Number >::MaybeType ToNumber(Isolate *isolate, HandleType< T > input)
static bool SameNumberValue(double number1, double number2)
static V8_WARN_UNUSED_RESULT HandleType< JSReceiver >::MaybeType ToObject(Isolate *isolate, HandleType< T > object, const char *method_name=nullptr)
static double NumberValue(Tagged< Number > obj)
static V8_WARN_UNUSED_RESULT HandleType< Object >::MaybeType ToPrimitive(Isolate *isolate, HandleType< T > input, ToPrimitiveHint hint=ToPrimitiveHint::kDefault)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Object > GetProperty(LookupIterator *it, bool is_global_reference=false)
static constexpr Tagged< Smi > FromInt(int value)
#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call)
#define RETURN_RESULT_OR_FAILURE(isolate, call)
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
constexpr Vector< T > VectorOf(T *start, size_t size)
MaybeDirectHandle< JSTemporalInstant > CreateTemporalInstant(Isolate *isolate, DirectHandle< JSFunction > target, DirectHandle< HeapObject > new_target, DirectHandle< BigInt > epoch_nanoseconds)
double MakeDate(double day, double time)
bool IsNumber(Tagged< Object > obj)
double DoubleToInteger(double x)
DateBuffer ToDateString(double time_val, DateCache *date_cache, ToDateStringMode mode)
double MakeDay(double year, double month, double date)
double MakeTime(double hour, double min, double sec, double ms)
double ParseDateTimeString(Isolate *isolate, DirectHandle< String > str)
template const char * string
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)