Exemplo n.º 1
0
        public static double FromDateTime(DateTime dt)
        {
            var convertToUtcAfter = (dt.Kind == DateTimeKind.Unspecified);

            var dateAsUtc = dt.Kind == DateTimeKind.Local
                ? dt.ToUniversalTime()
                : DateTime.SpecifyKind(dt, DateTimeKind.Utc);

            var result = (dateAsUtc - Epoch).TotalMilliseconds;

            if (convertToUtcAfter)
            {
                result = DatePrototype.Utc(result);
            }

            return(System.Math.Floor(result));
        }
Exemplo n.º 2
0
        public override Completion InternalConstruct(IReadOnlyList <IValue> arguments, Object?newTarget)
        {
            if (arguments.Count == 0)
            {
                return(Completion.NormalCompletion(Construct(DateTime.UtcNow)));
            }
            else if (arguments.Count == 1)
            {
                if (arguments[0] is DateObject date)
                {
                    return(Completion.NormalCompletion(Construct(date.PrimitiveValue)));
                }

                var vComp = arguments[0].ToPrimitive();
                if (vComp.IsAbrupt())
                {
                    return(vComp);
                }
                var v = vComp.value !;
                if (v is StringValue)
                {
                    var parse = Parse(UndefinedValue.Instance, new[] { v });
                    return(Completion.NormalCompletion(Construct(((NumberValue)parse.value !).number)));
                }

                var number = v.ToNumber();
                if (number.IsAbrupt())
                {
                    return(number);
                }
                var numberValue = (number.value as NumberValue) !.number;

                return(Completion.NormalCompletion(Construct(TimeClip(numberValue))));
            }
            else
            {
                var yComp = arguments.At(0);
                if (yComp.IsAbrupt())
                {
                    return(yComp);
                }
                yComp = yComp.value !.ToNumber();
                if (yComp.IsAbrupt())
                {
                    return(yComp);
                }
                var y = (yComp.value as NumberValue) !.number;

                var mComp = arguments.At(1);
                if (mComp.IsAbrupt())
                {
                    return(mComp);
                }
                mComp = mComp.value !.ToNumber();
                if (mComp.IsAbrupt())
                {
                    return(mComp);
                }
                var m = (mComp.value as NumberValue) !.number;

                var dtArg  = arguments.At(2, NumberValue.One);
                var dtComp = dtArg.ToNumber();
                if (dtComp.IsAbrupt())
                {
                    return(dtComp);
                }
                var dt = (dtComp.value as NumberValue) !.number;

                var hArg  = arguments.At(3, NumberValue.PositiveZero);
                var hComp = hArg !.ToNumber();
                if (hComp.IsAbrupt())
                {
                    return(hComp);
                }
                var h = (hComp.value as NumberValue) !.number;

                var minArg  = arguments.At(4, NumberValue.PositiveZero);
                var minComp = minArg.ToNumber();
                if (minComp.IsAbrupt())
                {
                    return(minComp);
                }
                var min = (minComp.value as NumberValue) !.number;

                var sArg  = arguments.At(5, NumberValue.PositiveZero);
                var sComp = sArg.ToNumber();
                if (sComp.IsAbrupt())
                {
                    return(sComp);
                }
                var s = (sComp.value as NumberValue) !.number;

                var milliArg  = arguments.At(6, NumberValue.PositiveZero);
                var milliComp = milliArg.ToNumber();
                if (milliComp.IsAbrupt())
                {
                    return(milliComp);
                }
                var milli = (milliComp.value as NumberValue) !.number;

                var yInteger = (int)y;
                if (!double.IsNaN(y) && 0 <= yInteger && yInteger <= 99)
                {
                    y += 1900;
                }

                var finalDate = DatePrototype.MakeDate(
                    DatePrototype.MakeDay(y, m, dt),
                    DatePrototype.MakeTime(h, min, s, milli));

                return(Completion.NormalCompletion(Construct(TimeClip(DatePrototype.Utc(finalDate)))));
            }
        }