1 // Copyright (c) Microsoft. All rights reserved.
2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5 using System.Globalization;
9 namespace MonoTests.System {
12 public static class DateTimeOffsetUnixTimeConversionTests
14 private class TestTime
16 private TestTime(DateTimeOffset dateTimeOffset, long unixTimeMilliseconds, long unixTimeSeconds)
18 DateTimeOffset = dateTimeOffset;
19 UnixTimeMilliseconds = unixTimeMilliseconds;
20 UnixTimeSeconds = unixTimeSeconds;
23 public static TestTime FromMilliseconds(DateTimeOffset dateTimeOffset, long unixTimeMilliseconds)
25 long unixTimeSeconds = unixTimeMilliseconds / 1000;
27 // Always round UnixTimeSeconds down toward 1/1/0001 00:00:00
28 // (this happens automatically for unixTimeMilliseconds > 0)
29 bool hasSubSecondPrecision = unixTimeMilliseconds % 1000 != 0;
30 if (unixTimeMilliseconds < 0 && hasSubSecondPrecision)
35 return new TestTime(dateTimeOffset, unixTimeMilliseconds, unixTimeSeconds);
38 public static TestTime FromSeconds(DateTimeOffset dateTimeOffset, long unixTimeSeconds)
40 return new TestTime(dateTimeOffset, unixTimeSeconds * 1000, unixTimeSeconds);
43 public DateTimeOffset DateTimeOffset { get; private set; }
44 public long UnixTimeMilliseconds { get; private set; }
45 public long UnixTimeSeconds { get; private set; }
48 private static readonly TestTime[] s_testTimes = {
49 TestTime.FromMilliseconds(DateTimeOffset.MinValue, -62135596800000),
50 TestTime.FromMilliseconds(DateTimeOffset.MaxValue, 253402300799999),
51 TestTime.FromMilliseconds(new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero), 0),
52 TestTime.FromMilliseconds(new DateTimeOffset(2014, 6, 13, 17, 21, 50, TimeSpan.Zero), 1402680110000),
53 TestTime.FromMilliseconds(new DateTimeOffset(2830, 12, 15, 1, 23, 45, TimeSpan.Zero), 27169089825000),
54 TestTime.FromMilliseconds(new DateTimeOffset(2830, 12, 15, 1, 23, 45, 399, TimeSpan.Zero), 27169089825399),
55 TestTime.FromMilliseconds(new DateTimeOffset(9999, 12, 30, 23, 24, 25, TimeSpan.Zero), 253402212265000),
56 TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, TimeSpan.Zero), -1971967973000),
57 TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, 1, TimeSpan.Zero), -1971967972999),
58 TestTime.FromMilliseconds(new DateTimeOffset(1907, 7, 7, 7, 7, 7, 777, TimeSpan.Zero), -1971967972223),
59 TestTime.FromMilliseconds(new DateTimeOffset(601636288270011234, TimeSpan.Zero), -1971967972999)
63 public static void TestToUnixTime()
65 foreach (var test in s_testTimes)
67 TestToUnixTimeMilliseconds(test);
68 TestToUnixTimeSeconds(test);
72 private static void TestToUnixTimeMilliseconds(TestTime test)
74 long expectedMilliseconds = test.UnixTimeMilliseconds;
75 long actualMilliseconds = test.DateTimeOffset.ToUnixTimeMilliseconds();
76 Assert.Equals(expectedMilliseconds, actualMilliseconds);
79 private static void TestToUnixTimeSeconds(TestTime test)
81 long expectedSeconds = test.UnixTimeSeconds;
82 long actualSeconds = test.DateTimeOffset.ToUnixTimeSeconds();
83 Assert.Equals(expectedSeconds, actualSeconds);
87 public static void TestFromUnixTime()
89 foreach (var test in s_testTimes)
91 TestFromUnixTimeMilliseconds(test);
92 TestFromUnixTimeSeconds(test);
96 private static void TestFromUnixTimeMilliseconds(TestTime test)
98 // Only assert that expected == actual up to millisecond precision for conversion from milliseconds
99 long expectedTicks = (test.DateTimeOffset.UtcTicks / TimeSpan.TicksPerMillisecond) * TimeSpan.TicksPerMillisecond;
100 long actualTicks = DateTimeOffset.FromUnixTimeMilliseconds(test.UnixTimeMilliseconds).UtcTicks;
101 Assert.Equals(expectedTicks, actualTicks);
104 private static void TestFromUnixTimeSeconds(TestTime test)
106 // Only assert that expected == actual up to second precision for conversion from seconds
107 long expectedTicks = (test.DateTimeOffset.UtcTicks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond;
108 long actualTicks = DateTimeOffset.FromUnixTimeSeconds(test.UnixTimeSeconds).UtcTicks;
109 Assert.Equals(expectedTicks, actualTicks);
114 public static void TestRoundtripDateTimes()
116 foreach (var test in s_testTimes)
118 // Roundtrip through Unix time in milliseconds
119 long unixTimeMilliseconds = test.DateTimeOffset.ToUnixTimeMilliseconds();
120 TestFromUnixTimeMilliseconds(TestTime.FromMilliseconds(test.DateTimeOffset, unixTimeMilliseconds));
122 // Roundtrip through Unix time in seconds
123 long unixTimeSeconds = test.DateTimeOffset.ToUnixTimeSeconds();
124 TestFromUnixTimeSeconds(TestTime.FromSeconds(test.DateTimeOffset, unixTimeSeconds));
129 public static void TestRoundtripUnixTimes()
131 foreach (var test in s_testTimes)
133 // Roundtrip Unix time in milliseconds
134 DateTimeOffset dateTime = DateTimeOffset.FromUnixTimeMilliseconds(test.UnixTimeMilliseconds);
135 TestToUnixTimeMilliseconds(TestTime.FromMilliseconds(dateTime, test.UnixTimeMilliseconds));
137 // Roundtrip Unix time in seconds
138 dateTime = DateTimeOffset.FromUnixTimeSeconds(test.UnixTimeSeconds);
139 TestToUnixTimeSeconds(TestTime.FromSeconds(dateTime, test.UnixTimeSeconds));