313static inline double ParseString(
const QString &s,
double localTZA)
316
317
318
319
320
321
322
323
324
325
326
327
328
343 const QChar *ch = s.constData();
344 const QChar *end = ch + s.size();
349 bool extendedYear =
false;
365 if (*ch == u'+' || *ch == u'-') {
371 for (; ch <= end && !error && format != Done; ++ch) {
372 if (*ch >= u'0' && *ch <= u'9') {
374 current += ch->unicode() - u'0';
381 error = (currentSize != 6);
383 error = (currentSize != 4);
387 error = (currentSize != 2) || month > 11;
391 error = (currentSize != 2) || day > 31;
395 error = (currentSize != 2) || hour > 24;
399 error = (currentSize != 2) || minute >= 60;
403 error = (currentSize != 2) || second > 60;
407 error = (currentSize != 3);
410 Q_ASSERT(offset == 0 && !seenZ);
411 offset = current * 60;
412 error = (currentSize != 2) || current > 23;
417 error = (currentSize != 2) || current >= 60;
425 }
else if (*ch == u'-') {
428 else if (format < Minute)
430 else if (format >= TimezoneHour)
433 Q_ASSERT(offset == 0 && !seenZ);
435 format = TimezoneHour;
437 }
else if (*ch == u':') {
438 if (format != Hour && format != Minute && format != TimezoneHour)
441 }
else if (*ch == u'.') {
442 if (format != Second)
445 }
else if (*ch == u'+') {
446 if (seenZ || format < Minute || format >= TimezoneHour)
448 format = TimezoneHour;
449 }
else if (*ch == u'Z') {
450 if (seenZ || format < Minute || format >= TimezoneHour)
453 Q_ASSERT(offset == 0);
456 }
else if (ch->unicode() == 0) {
467 t -= offset * offsetSign * 60 * 1000;
474 QDateTime dt = QDateTime::fromString(s, Qt::TextDate);
476 dt = QDateTime::fromString(s, Qt::ISODate);
478 dt = QDateTime::fromString(s, Qt::RFC2822Date);
480 const QString formats[] = {
481 QStringLiteral(
"M/d/yyyy"),
482 QStringLiteral(
"M/d/yyyy hh:mm"),
483 QStringLiteral(
"M/d/yyyy hh:mm A"),
485 QStringLiteral(
"M/d/yyyy, hh:mm"),
486 QStringLiteral(
"M/d/yyyy, hh:mm A"),
488 QStringLiteral(
"MMM d yyyy"),
489 QStringLiteral(
"MMM d yyyy hh:mm"),
490 QStringLiteral(
"MMM d yyyy hh:mm:ss"),
491 QStringLiteral(
"MMM d yyyy, hh:mm"),
492 QStringLiteral(
"MMM d yyyy, hh:mm:ss"),
494 QStringLiteral(
"MMMM d yyyy"),
495 QStringLiteral(
"MMMM d yyyy hh:mm"),
496 QStringLiteral(
"MMMM d yyyy hh:mm:ss"),
497 QStringLiteral(
"MMMM d yyyy, hh:mm"),
498 QStringLiteral(
"MMMM d yyyy, hh:mm:ss"),
500 QStringLiteral(
"MMM d, yyyy"),
501 QStringLiteral(
"MMM d, yyyy hh:mm"),
502 QStringLiteral(
"MMM d, yyyy hh:mm:ss"),
504 QStringLiteral(
"MMMM d, yyyy"),
505 QStringLiteral(
"MMMM d, yyyy hh:mm"),
506 QStringLiteral(
"MMMM d, yyyy hh:mm:ss"),
508 QStringLiteral(
"d MMM yyyy"),
509 QStringLiteral(
"d MMM yyyy hh:mm"),
510 QStringLiteral(
"d MMM yyyy hh:mm:ss"),
511 QStringLiteral(
"d MMM yyyy, hh:mm"),
512 QStringLiteral(
"d MMM yyyy, hh:mm:ss"),
514 QStringLiteral(
"d MMMM yyyy"),
515 QStringLiteral(
"d MMMM yyyy hh:mm"),
516 QStringLiteral(
"d MMMM yyyy hh:mm:ss"),
517 QStringLiteral(
"d MMMM yyyy, hh:mm"),
518 QStringLiteral(
"d MMMM yyyy, hh:mm:ss"),
520 QStringLiteral(
"d MMM, yyyy"),
521 QStringLiteral(
"d MMM, yyyy hh:mm"),
522 QStringLiteral(
"d MMM, yyyy hh:mm:ss"),
524 QStringLiteral(
"d MMMM, yyyy"),
525 QStringLiteral(
"d MMMM, yyyy hh:mm"),
526 QStringLiteral(
"d MMMM, yyyy hh:mm:ss"),
529 QStringLiteral(
"yyyy-MM-dd hh:mm:ss t"),
530 QStringLiteral(
"ddd, d MMM yyyy hh:mm:ss t"),
533 for (
const QString &format : formats) {
534 dt = format.indexOf(QLatin1String(
"hh:mm")) < 0
535 ? QDate::fromString(s, format).startOfDay(QTimeZone::UTC)
536 : QDateTime::fromString(s, format);
543 return TimeClip(dt.toMSecsSinceEpoch());
811ReturnedValue DateCtor::virtualCallAsConstructor(
const FunctionObject *that,
const Value *argv,
int argc,
const Value *newTarget)
813 ExecutionEngine *v4 = that->engine();
819 else if (argc == 1) {
821 ScopedValue arg(scope, argv[0]);
822 if (DateObject *d = arg->as<DateObject>()) {
825 arg = RuntimeHelpers::toPrimitive(arg, PREFERREDTYPE_HINT);
827 if (String *s = arg->stringValue())
828 t = ParseString(s->toQString(), v4->localTZA);
835 const double year = argv[0].toNumber();
836 const double month = argv[1].toNumber();
837 const double day = argc >= 3 ? argv[2].toNumber() : 1;
838 const double hours = argc >= 4 ? argv[3].toNumber() : 0;
839 const double mins = argc >= 5 ? argv[4].toNumber() : 0;
840 const double secs = argc >= 6 ? argv[5].toNumber() : 0;
841 const double ms = argc >= 7 ? argv[6].toNumber() : 0;
842 t = DateObject::componentsToTimestamp(year, month, day, hours, mins, secs, ms, v4);
845 ReturnedValue o = Encode(v4->newDateObject(t));
849 ScopedObject obj(scope, o);
850 obj->setProtoFromNewTarget(newTarget);
851 return obj->asReturnedValue();
861void DatePrototype::init(ExecutionEngine *engine, Object *ctor)
864 ScopedObject o(scope);
865 ctor->defineReadonlyProperty(engine->id_prototype(), (o =
this));
866 ctor->defineReadonlyConfigurableProperty(engine->id_length(), Value::fromInt32(7));
867 engine->localTZA = getLocalTZA();
869 ctor->defineDefaultProperty(QStringLiteral(
"parse"), method_parse, 1);
870 ctor->defineDefaultProperty(QStringLiteral(
"UTC"), method_UTC, 7);
871 ctor->defineDefaultProperty(QStringLiteral(
"now"), method_now, 0);
873 defineDefaultProperty(QStringLiteral(
"constructor"), (o = ctor));
874 defineDefaultProperty(engine->id_toString(), method_toString, 0);
875 defineDefaultProperty(QStringLiteral(
"toDateString"), method_toDateString, 0);
876 defineDefaultProperty(QStringLiteral(
"toTimeString"), method_toTimeString, 0);
877 defineDefaultProperty(engine->id_toLocaleString(), method_toLocaleString, 0);
878 defineDefaultProperty(QStringLiteral(
"toLocaleDateString"), method_toLocaleDateString, 0);
879 defineDefaultProperty(QStringLiteral(
"toLocaleTimeString"), method_toLocaleTimeString, 0);
880 defineDefaultProperty(engine->id_valueOf(), method_valueOf, 0);
881 defineDefaultProperty(QStringLiteral(
"getTime"), method_getTime, 0);
882 defineDefaultProperty(QStringLiteral(
"getYear"), method_getYear, 0);
883 defineDefaultProperty(QStringLiteral(
"getFullYear"), method_getFullYear, 0);
884 defineDefaultProperty(QStringLiteral(
"getUTCFullYear"), method_getUTCFullYear, 0);
885 defineDefaultProperty(QStringLiteral(
"getMonth"), method_getMonth, 0);
886 defineDefaultProperty(QStringLiteral(
"getUTCMonth"), method_getUTCMonth, 0);
887 defineDefaultProperty(QStringLiteral(
"getDate"), method_getDate, 0);
888 defineDefaultProperty(QStringLiteral(
"getUTCDate"), method_getUTCDate, 0);
889 defineDefaultProperty(QStringLiteral(
"getDay"), method_getDay, 0);
890 defineDefaultProperty(QStringLiteral(
"getUTCDay"), method_getUTCDay, 0);
891 defineDefaultProperty(QStringLiteral(
"getHours"), method_getHours, 0);
892 defineDefaultProperty(QStringLiteral(
"getUTCHours"), method_getUTCHours, 0);
893 defineDefaultProperty(QStringLiteral(
"getMinutes"), method_getMinutes, 0);
894 defineDefaultProperty(QStringLiteral(
"getUTCMinutes"), method_getUTCMinutes, 0);
895 defineDefaultProperty(QStringLiteral(
"getSeconds"), method_getSeconds, 0);
896 defineDefaultProperty(QStringLiteral(
"getUTCSeconds"), method_getUTCSeconds, 0);
897 defineDefaultProperty(QStringLiteral(
"getMilliseconds"), method_getMilliseconds, 0);
898 defineDefaultProperty(QStringLiteral(
"getUTCMilliseconds"), method_getUTCMilliseconds, 0);
899 defineDefaultProperty(QStringLiteral(
"getTimezoneOffset"), method_getTimezoneOffset, 0);
900 defineDefaultProperty(QStringLiteral(
"setTime"), method_setTime, 1);
901 defineDefaultProperty(QStringLiteral(
"setMilliseconds"), method_setMilliseconds, 1);
902 defineDefaultProperty(QStringLiteral(
"setUTCMilliseconds"), method_setUTCMilliseconds, 1);
903 defineDefaultProperty(QStringLiteral(
"setSeconds"), method_setSeconds, 2);
904 defineDefaultProperty(QStringLiteral(
"setUTCSeconds"), method_setUTCSeconds, 2);
905 defineDefaultProperty(QStringLiteral(
"setMinutes"), method_setMinutes, 3);
906 defineDefaultProperty(QStringLiteral(
"setUTCMinutes"), method_setUTCMinutes, 3);
907 defineDefaultProperty(QStringLiteral(
"setHours"), method_setHours, 4);
908 defineDefaultProperty(QStringLiteral(
"setUTCHours"), method_setUTCHours, 4);
909 defineDefaultProperty(QStringLiteral(
"setDate"), method_setDate, 1);
910 defineDefaultProperty(QStringLiteral(
"setUTCDate"), method_setUTCDate, 1);
911 defineDefaultProperty(QStringLiteral(
"setMonth"), method_setMonth, 2);
912 defineDefaultProperty(QStringLiteral(
"setUTCMonth"), method_setUTCMonth, 2);
913 defineDefaultProperty(QStringLiteral(
"setYear"), method_setYear, 1);
914 defineDefaultProperty(QStringLiteral(
"setFullYear"), method_setFullYear, 3);
915 defineDefaultProperty(QStringLiteral(
"setUTCFullYear"), method_setUTCFullYear, 3);
920 QString toUtcString(QStringLiteral(
"toUTCString"));
921 QString toGmtString(QStringLiteral(
"toGMTString"));
922 ScopedString us(scope, engine->newIdentifier(toUtcString));
923 ScopedString gs(scope, engine->newIdentifier(toGmtString));
924 ScopedFunctionObject toUtcGmtStringFn(scope, FunctionObject::createBuiltinFunction(engine, us, method_toUTCString, 0));
925 defineDefaultProperty(us, toUtcGmtStringFn);
926 defineDefaultProperty(gs, toUtcGmtStringFn);
929 defineDefaultProperty(QStringLiteral(
"toISOString"), method_toISOString, 0);
930 defineDefaultProperty(QStringLiteral(
"toJSON"), method_toJSON, 1);
931 defineDefaultProperty(engine->symbol_toPrimitive(), method_symbolToPrimitive, 1, Attr_ReadOnly_ButConfigurable);
1547ReturnedValue DatePrototype::method_toISOString(
const FunctionObject *b,
const Value *thisObject,
const Value *,
int)
1549 ExecutionEngine *v4 = b->engine();
1550 DateObject *self =
const_cast<DateObject *>(thisObject->as<DateObject>());
1552 return v4->throwTypeError();
1554 if (self->d()->isAttachedToProperty())
1555 self->d()->readReference();
1557 double t = self->date();
1558 if (!std::isfinite(t))
1562 int year = (
int)YearFromTime(t);
1563 if (year < 0 || year > 9999) {
1564 if (qAbs(year) >= 1000000)
1566 result += year < 0 ? QLatin1Char(
'-') : QLatin1Char(
'+');
1568 addZeroPrefixedInt(result, year, 6);
1570 addZeroPrefixedInt(result, year, 4);
1572 result += QLatin1Char(
'-');
1573 addZeroPrefixedInt(result, (
int)MonthFromTime(t) + 1, 2);
1574 result += QLatin1Char(
'-');
1575 addZeroPrefixedInt(result, (
int)DateFromTime(t), 2);
1576 result += QLatin1Char(
'T');
1577 addZeroPrefixedInt(result, HourFromTime(t), 2);
1578 result += QLatin1Char(
':');
1579 addZeroPrefixedInt(result, MinFromTime(t), 2);
1580 result += QLatin1Char(
':');
1581 addZeroPrefixedInt(result, SecFromTime(t), 2);
1582 result += QLatin1Char(
'.');
1583 addZeroPrefixedInt(result, msFromTime(t), 3);
1584 result += QLatin1Char(
'Z');
1586 return Encode(v4->newString(result));