public static class Program
public static void Main()
for (int i = 0; i < 84; ++i)
var vanadielTime = new VanadielTime(1587675706549, i);
Console.WriteLine(vanadielTime);
public enum MoonPhase : int
_lunation = (time / VanadielTime.MillisecondsPerDay + 26) % 84;
public int Percent => (int)Math.Round(Math.Abs((42 - _lunation) * 100.0d / 42));
long phase = _lunation > 38 ? _lunation - 38 : _lunation + 46;
return (MoonPhase)((phase / 7) % 12);
public struct VanadielTime
public const long EarthTimeMilliseconds = 1009810800000;
public const long MillisecondsPerDay = 3456000;
public const long MillisecondsPerHour = 144000;
public const long MillisecondsPerLunation = 290304000;
public const long MillisecondsPerMinute = 2400;
public const long MillisecondsPerMonth = 103680000;
public const long MillisecondsPerSeason = 311040000;
public const long MillisecondsPerSecond = 40;
public const long MillisecondsPerWeek = 27648000;
public const long MillisecondsPerYear = 1244160000;
public const long VanadielTimeMilliseconds = 1102325760000;
public VanadielTime(long time, int i)
throw new ArgumentOutOfRangeException(nameof(time));
_time = time - EarthTimeMilliseconds + VanadielTimeMilliseconds + (i * MillisecondsPerDay);
public int Day => (int)((_time / MillisecondsPerDay) % 30) + 1;
public Day DayOfWeek => (Day)((_time / MillisecondsPerDay) % 8);
public int DayOfYear => (int)((_time / MillisecondsPerDay) % 360) + 1;
public int Hour => (int)((_time / MillisecondsPerHour) % 24);
public bool IsAutumn => Season == Season.Autumn;
public bool IsDarksday => DayOfWeek == Exodus.Day.Darksday;
public bool IsEarthsday => DayOfWeek == Exodus.Day.Earthsday;
public bool IsFiresday => DayOfWeek == Exodus.Day.Firesday;
public bool IsIceday => DayOfWeek == Exodus.Day.Iceday;
public bool IsLightningday => DayOfWeek == Exodus.Day.Lightningday;
public bool IsLightsday => DayOfWeek == Exodus.Day.Lightsday;
public bool IsSpring => Season == Season.Spring;
public bool IsSummer => Season == Season.Summer;
public bool IsWatersday => DayOfWeek == Exodus.Day.Watersday;
public bool IsWindsday => DayOfWeek == Exodus.Day.Windsday;
public bool IsWinter => Season == Season.Winter;
public int Minute => (int)((_time / MillisecondsPerMinute) % 60);
public int Month => (int)((_time / MillisecondsPerMonth) % 12) + 1;
public Season Season => (Season)((_time / MillisecondsPerSeason) % 4);
public int Second => (int)((_time / MillisecondsPerSecond) % 60);
public int Year => (int)(_time / MillisecondsPerYear);
public Moon Moon => new Moon(_time);
public override string ToString() => $"{Month}/{Day}/{Year}, {DayOfWeek}, {Hour.ToString("D2")}:{Minute.ToString("D2")} {Season} {Moon.Phase} ({Moon.Percent}%)";