JsDate.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Jint.Native.Date;
  2. using Jint.Native.Object;
  3. using Jint.Runtime;
  4. namespace Jint.Native;
  5. public sealed class JsDate : ObjectInstance
  6. {
  7. // Maximum allowed value to prevent DateTime overflow
  8. private static readonly long Max = (long) (DateTime.MaxValue - DateConstructor.Epoch).TotalMilliseconds;
  9. // Minimum allowed value to prevent DateTime overflow
  10. private static readonly long Min = (long) -(DateConstructor.Epoch - DateTime.MinValue).TotalMilliseconds;
  11. internal double _dateValue;
  12. public JsDate(Engine engine, DateTimeOffset value) : this(engine, value.UtcDateTime)
  13. {
  14. }
  15. public JsDate(Engine engine, DateTime value) : this(engine, engine.Realm.Intrinsics.Date.FromDateTime(value))
  16. {
  17. }
  18. public JsDate(Engine engine, double dateValue) : base(engine, ObjectClass.Date, InternalTypes.Object | InternalTypes.PlainObject)
  19. {
  20. _prototype = engine.Realm.Intrinsics.Date.PrototypeObject;
  21. _dateValue = dateValue.TimeClip();
  22. }
  23. public DateTime ToDateTime()
  24. {
  25. if (DateTimeRangeValid)
  26. {
  27. return DateConstructor.Epoch.AddMilliseconds(DateValue);
  28. }
  29. ExceptionHelper.ThrowRangeError(_engine.Realm);
  30. return DateTime.MinValue;
  31. }
  32. public double DateValue => _dateValue;
  33. internal bool DateTimeRangeValid => !double.IsNaN(DateValue) && DateValue <= Max && DateValue >= Min;
  34. public override string ToString()
  35. {
  36. if (double.IsNaN(DateValue))
  37. {
  38. return "NaN";
  39. }
  40. if (double.IsInfinity(DateValue))
  41. {
  42. return "Infinity";
  43. }
  44. return TypeConverter.ToString(this);
  45. }
  46. }