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)); }
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))))); } }