namespace MeterVault.Core.Tests.Analysis; /// Fixed instants in the zones the interval and coverage tests reason about. internal static class AnalysisTestTime { public static readonly TimeZoneInfo Berlin = TimeZoneInfo.FindSystemTimeZoneById("Europe/Berlin"); public static readonly TimeZoneInfo NewYork = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); /// A wall-clock time in as an instant. public static DateTimeOffset Local(TimeZoneInfo zone, int year, int month, int day, int hour = 0, int minute = 0, int second = 0) { var wall = new DateTime(year, month, day, hour, minute, second); return new DateTimeOffset(wall, zone.GetUtcOffset(wall)); } public static DateTimeOffset InBerlin(int year, int month, int day, int hour = 0, int minute = 0, int second = 0) => Local(Berlin, year, month, day, hour, minute, second); public static DateTimeOffset Utc(int year, int month, int day, int hour = 0, int minute = 0) => new(year, month, day, hour, minute, 0, TimeSpan.Zero); /// The local calendar date an instant falls on. public static DateOnly LocalDate(DateTimeOffset instant, TimeZoneInfo zone) => DateOnly.FromDateTime(TimeZoneInfo.ConvertTime(instant, zone).DateTime); }