TimeSystemTests.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System.Globalization;
  2. using Jint.Runtime;
  3. using NodaTime;
  4. namespace Jint.Tests.PublicInterface;
  5. public class TimeSystemTests
  6. {
  7. [Theory]
  8. [InlineData("401, 0, 1, 0, 0, 0, 0", -49512821989000)]
  9. [InlineData("1900, 0, 1, 0, 0, 0, 0", -2208994789000)]
  10. [InlineData("1920, 0, 1, 0, 0, 0, 0", -1577929189000)]
  11. [InlineData("1969, 0, 1, 0, 0, 0, 0", -31543200000)]
  12. [InlineData("2000, 1, 1, 1, 1, 1, 1", 949359661001)]
  13. public void CanProduceValidDatesUsingNodaTimeIntegration(string input, long expected)
  14. {
  15. var dateTimeZone = DateTimeZoneProviders.Tzdb["Europe/Helsinki"];
  16. TimeZoneInfo timeZone;
  17. try
  18. {
  19. timeZone = TimeZoneInfo.FindSystemTimeZoneById("Europe/Helsinki");
  20. }
  21. catch (TimeZoneNotFoundException)
  22. {
  23. timeZone = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
  24. }
  25. var engine = new Engine(options =>
  26. {
  27. options.TimeZone = timeZone;
  28. options.TimeSystem = new NodaTimeSystem(dateTimeZone, timeZone);
  29. });
  30. Assert.Equal(expected, engine.Evaluate($"new Date({input}) * 1").AsNumber());
  31. }
  32. }
  33. file sealed class NodaTimeSystem : DefaultTimeSystem
  34. {
  35. private readonly DateTimeZone _dateTimeZone;
  36. public NodaTimeSystem(
  37. DateTimeZone dateTimeZone,
  38. TimeZoneInfo timeZoneInfo) : base(timeZoneInfo, CultureInfo.CurrentCulture)
  39. {
  40. _dateTimeZone = dateTimeZone;
  41. }
  42. public override TimeSpan GetUtcOffset(long epochMilliseconds)
  43. {
  44. var offset = _dateTimeZone.GetUtcOffset(Instant.FromUnixTimeMilliseconds(epochMilliseconds));
  45. return offset.ToTimeSpan();
  46. }
  47. }