Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit a9cfe0c

Browse files
committed
Ensure DateTimeOffset roundtrips correctly in ToString and ToJson
1 parent 891d1bc commit a9cfe0c

File tree

9 files changed

+59
-12
lines changed

9 files changed

+59
-12
lines changed

src/GitHub.Api/Cache/CacheContainer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public DateTimeOffset UpdatedTime
164164
if (!updatedTimeValue.HasValue)
165165
{
166166
DateTimeOffset result;
167-
if (DateTimeOffset.TryParseExact(updatedTimeString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
167+
if (DateTimeOffset.TryParseExact(updatedTimeString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
168168
{
169169
updatedTimeValue = result;
170170
}

src/GitHub.Api/Git/GitLogEntry.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public DateTimeOffset Time
8282
if (!timeValue.HasValue)
8383
{
8484
DateTimeOffset result;
85-
if (DateTimeOffset.TryParseExact(TimeString, Constants.Iso8601Format, CultureInfo.InvariantCulture,DateTimeStyles.None, out result))
85+
if (DateTimeOffset.TryParseExact(TimeString, Constants.Iso8601Formats, CultureInfo.InvariantCulture,DateTimeStyles.None, out result))
8686
{
8787
timeValue = result;
8888
}
@@ -109,7 +109,7 @@ public DateTimeOffset CommitTime
109109
if (!commitTimeValue.HasValue)
110110
{
111111
DateTimeOffset result;
112-
if (DateTimeOffset.TryParseExact(CommitTimeString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
112+
if (DateTimeOffset.TryParseExact(CommitTimeString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
113113
{
114114
commitTimeValue = result;
115115
}

src/GitHub.Api/Helpers/Constants.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ static class Constants
1010
public const string GitInstallPathKey = "GitInstallPath";
1111
public const string TraceLoggingKey = "EnableTraceLogging";
1212
public const string WebTimeoutKey = "WebTimeout";
13-
public const string Iso8601Format = "yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz";
13+
public const string Iso8601Format = @"yyyy-MM-dd\THH\:mm\:ss.fffzzz";
14+
public static readonly string[] Iso8601Formats = {
15+
@"yyyy-MM-dd\THH\:mm\:ss.fffffffzzz",
16+
@"yyyy-MM-dd\THH\:mm\:ss.fffzzz",
17+
@"yyyy-MM-dd\THH\:mm\:sszzz"
18+
};
1419

1520
public static readonly Version MinimumGitVersion = new Version(2, 11, 0);
1621
public static readonly Version MinimumGitLfsVersion = new Version(2, 3, 4);

src/GitHub.Api/Helpers/SimpleJson.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,9 +1252,12 @@ class PocoJsonSerializerStrategy : IJsonSerializerStrategy
12521252

12531253
private static readonly string[] Iso8601Format = new string[]
12541254
{
1255-
@"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z",
1256-
@"yyyy-MM-dd\THH:mm:ss\Z",
1257-
@"yyyy-MM-dd\THH:mm:ssK"
1255+
@"yyyy-MM-dd\THH\:mm\:ss.fffffffzzz",
1256+
@"yyyy-MM-dd\THH\:mm\:ss.fffzzz",
1257+
@"yyyy-MM-dd\THH\:mm\:sszzz",
1258+
@"yyyy-MM-dd\THH:mm:ss.fffffffzzz",
1259+
@"yyyy-MM-dd\THH:mm:ss.fffzzz",
1260+
@"yyyy-MM-dd\THH:mm:sszzz",
12581261
};
12591262

12601263
public PocoJsonSerializerStrategy()

src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public DateTimeOffset FirstRunAt
3434

3535
if (!firstRunAtValue.HasValue)
3636
{
37-
firstRunAtValue = DateTimeOffset.ParseExact(firstRunAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture);
37+
firstRunAtValue = DateTimeOffset.ParseExact(firstRunAtString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
3838
}
3939

4040
return firstRunAtValue.Value;
@@ -212,7 +212,7 @@ public DateTimeOffset LastUpdatedAt
212212
if (!lastUpdatedAtValue.HasValue)
213213
{
214214
DateTimeOffset result;
215-
if (DateTimeOffset.TryParseExact(LastUpdatedAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
215+
if (DateTimeOffset.TryParseExact(LastUpdatedAtString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
216216
{
217217
lastUpdatedAtValue = result;
218218
}
@@ -238,7 +238,7 @@ public DateTimeOffset InitializedAt
238238
if (!initializedAtValue.HasValue)
239239
{
240240
DateTimeOffset result;
241-
if (DateTimeOffset.TryParseExact(InitializedAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
241+
if (DateTimeOffset.TryParseExact(InitializedAtString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
242242
{
243243
initializedAtValue = result;
244244
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"dependencies": {
3+
}
4+
}

src/tests/IntegrationTests/CachingClasses.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public DateTimeOffset LastUpdatedAt
184184
if (!lastUpdatedAtValue.HasValue)
185185
{
186186
DateTimeOffset result;
187-
if (DateTimeOffset.TryParseExact(LastUpdatedAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
187+
if (DateTimeOffset.TryParseExact(LastUpdatedAtString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
188188
{
189189
lastUpdatedAtValue = result;
190190
}
@@ -210,7 +210,7 @@ public DateTimeOffset InitializedAt
210210
if (!initializedAtValue.HasValue)
211211
{
212212
DateTimeOffset result;
213-
if (DateTimeOffset.TryParseExact(InitializedAtString, Constants.Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
213+
if (DateTimeOffset.TryParseExact(InitializedAtString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
214214
{
215215
initializedAtValue = result;
216216
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using GitHub.Unity;
2+
using NUnit.Framework;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Globalization;
6+
using System.Linq;
7+
using System.Text;
8+
9+
namespace UnitTests.Primitives
10+
{
11+
[TestFixture]
12+
class SerializationTests
13+
{
14+
[Test]
15+
public void DateTimeSerializationRoundTrip()
16+
{
17+
var dt1 = DateTimeOffset.ParseExact("2018-05-01T12:04:29.0000000-02:00", Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
18+
var dt2 = DateTimeOffset.ParseExact("2018-05-01T12:04:29.000-02:00", Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
19+
var dt3 = DateTimeOffset.ParseExact("2018-05-01T12:04:29-02:00", Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
20+
var str1 = dt1.ToJson();
21+
var ret1 = str1.FromJson<DateTimeOffset>();
22+
Assert.AreEqual(dt1, ret1);
23+
var str2 = dt2.ToJson();
24+
var ret2 = str2.FromJson<DateTimeOffset>();
25+
Assert.AreEqual(dt2, ret2);
26+
var str3 = dt3.ToJson();
27+
var ret3 = str3.FromJson<DateTimeOffset>();
28+
Assert.AreEqual(dt3, ret3);
29+
30+
Assert.AreEqual(dt1, dt2);
31+
Assert.AreEqual(dt2, dt3);
32+
}
33+
}
34+
}

src/tests/UnitTests/UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
<Compile Include="IO\MacBasedGitEnvironmentTests.cs" />
9393
<Compile Include="IO\LinuxBasedGitEnvironmentTests.cs" />
9494
<Compile Include="IO\WindowsGitEnvironmentTests.cs" />
95+
<Compile Include="Primitives\SerializationTests.cs" />
9596
<Compile Include="Primitives\UriStringTests.cs" />
9697
<Compile Include="ProcessManagerExtensions.cs" />
9798
<Compile Include="SetUpFixture.cs" />

0 commit comments

Comments
 (0)