Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 65dd83a

Browse files
committed
Merge pull request #2541 from mj1856/serialization-timezone-fixes
Serialization time zone fixes
2 parents 7713698 + a5d4384 commit 65dd83a

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

src/System.Runtime.Serialization.Json/tests/DataContractJsonSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public static void DCJS_ByteAsRoot()
8989
[Fact]
9090
public static void DCJS_DateTimeAsRoot()
9191
{
92-
var offsetMinutes = (int)TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
92+
var offsetMinutes = (int)TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
9393
var timeZoneString = string.Format("{0:+;-}{1}", offsetMinutes, new TimeSpan(0, offsetMinutes, 0).ToString(@"hhmm"));
9494
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2).AddMinutes(offsetMinutes), string.Format("\"\\/Date(1357084800000{0})\\/\"", timeZoneString)), new DateTime(2013, 1, 2).AddMinutes(offsetMinutes));
9595
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local).AddMinutes(offsetMinutes), string.Format("\"\\/Date(1357095845006{0})\\/\"", timeZoneString)), new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local).AddMinutes(offsetMinutes));
@@ -997,7 +997,7 @@ public static void DCJS_JaggedArrayAsRoot()
997997
Assert.Equal(jaggedStringArray[1], actualJaggedStringArray[1]);
998998
Assert.Equal(jaggedStringArray[2], actualJaggedStringArray[2]);
999999

1000-
var offsetMinutes = (int)TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
1000+
var offsetMinutes = (int)TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
10011001
var timeZoneString = string.Format("{0:+;-}{1}", offsetMinutes, new TimeSpan(0, offsetMinutes, 0).ToString(@"hhmm"));
10021002
object[] objectArray = new object[] { 1, 1.0F, 1.0, "string", Guid.Parse("2054fd3e-e118-476a-9962-1a882be51860"), new DateTime(2013, 1, 2).AddMinutes(offsetMinutes) };
10031003
var actualObjectArray = SerializeAndDeserialize<object[]>(objectArray, string.Format("[1,1,1,\"string\",\"2054fd3e-e118-476a-9962-1a882be51860\",\"\\/Date(1357084800000{0})\\/\"]", timeZoneString));

src/System.Runtime.Serialization.Xml/tests/DataContractSerializer.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static class DataContractSerializerTests
2020
[Fact]
2121
public static void DCS_DateTimeOffsetAsRoot()
2222
{
23-
var offsetMinutes = TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
23+
var offsetMinutes = TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
2424
var objs = new DateTimeOffset[]
2525
{
2626
// Adding offsetMinutes so the DateTime component in serialized strings are time-zone independent
@@ -43,7 +43,10 @@ public static void DCS_DateTimeOffsetAsRoot()
4343
};
4444
for (int i = 0; i < objs.Length; ++i)
4545
{
46-
Assert.StrictEqual(SerializeAndDeserialize<DateTimeOffset>(objs[i], serializedStrings[i]), objs[i]);
46+
var actual = objs[i];
47+
var expected = SerializeAndDeserialize<DateTimeOffset>(actual, serializedStrings[i]);
48+
Assert.StrictEqual(expected, actual);
49+
Assert.StrictEqual(expected.Offset, actual.Offset);
4750
}
4851
}
4952

@@ -84,7 +87,7 @@ public static void DCS_ByteAsRoot()
8487
[Fact]
8588
public static void DCS_DateTimeAsRoot()
8689
{
87-
var offsetMinutes = (int)TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
90+
var offsetMinutes = (int)TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
8891
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2), "<dateTime xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">2013-01-02T00:00:00</dateTime>"), new DateTime(2013, 1, 2));
8992
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local), string.Format("<dateTime xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">2013-01-02T03:04:05.006{0:+;-}{1}</dateTime>", offsetMinutes, new TimeSpan(0, offsetMinutes, 0).ToString(@"hh\:mm"))), new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local));
9093
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Unspecified), "<dateTime xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">2013-01-02T03:04:05.006</dateTime>"), new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Unspecified));
@@ -1360,16 +1363,19 @@ public static void DCS_TypeWithDatetimeOffsetTypeProperty()
13601363
var value = new TypeWithDateTimeOffsetTypeProperty() { ModifiedTime = new DateTimeOffset(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Utc)) };
13611364
var actual = SerializeAndDeserialize(value, "<TypeWithDateTimeOffsetTypeProperty xmlns=\"http://schemas.datacontract.org/2004/07/SerializationTypes\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><ModifiedTime xmlns:a=\"http://schemas.datacontract.org/2004/07/System\"><a:DateTime>2013-01-02T03:04:05.006Z</a:DateTime><a:OffsetMinutes>0</a:OffsetMinutes></ModifiedTime></TypeWithDateTimeOffsetTypeProperty>");
13621365
Assert.StrictEqual(value.ModifiedTime, actual.ModifiedTime);
1366+
Assert.StrictEqual(value.ModifiedTime.Offset, actual.ModifiedTime.Offset);
13631367

1364-
var offsetMinutes = TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
1368+
var offsetMinutes = TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
13651369
// Adding offsetMinutes to ModifiedTime property so the DateTime component in serialized strings are time-zone independent
13661370
value = new TypeWithDateTimeOffsetTypeProperty() { ModifiedTime = new DateTimeOffset(new DateTime(2013, 1, 2, 3, 4, 5, 6).AddMinutes(offsetMinutes)) };
13671371
actual = SerializeAndDeserialize(value, string.Format("<TypeWithDateTimeOffsetTypeProperty xmlns=\"http://schemas.datacontract.org/2004/07/SerializationTypes\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><ModifiedTime xmlns:a=\"http://schemas.datacontract.org/2004/07/System\"><a:DateTime>2013-01-02T03:04:05.006Z</a:DateTime><a:OffsetMinutes>{0}</a:OffsetMinutes></ModifiedTime></TypeWithDateTimeOffsetTypeProperty>", offsetMinutes));
13681372
Assert.StrictEqual(value.ModifiedTime, actual.ModifiedTime);
1373+
Assert.StrictEqual(value.ModifiedTime.Offset, actual.ModifiedTime.Offset);
13691374

13701375
value = new TypeWithDateTimeOffsetTypeProperty() { ModifiedTime = new DateTimeOffset(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local).AddMinutes(offsetMinutes)) };
13711376
actual = SerializeAndDeserialize(value, string.Format("<TypeWithDateTimeOffsetTypeProperty xmlns=\"http://schemas.datacontract.org/2004/07/SerializationTypes\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><ModifiedTime xmlns:a=\"http://schemas.datacontract.org/2004/07/System\"><a:DateTime>2013-01-02T03:04:05.006Z</a:DateTime><a:OffsetMinutes>{0}</a:OffsetMinutes></ModifiedTime></TypeWithDateTimeOffsetTypeProperty>", offsetMinutes));
13721377
Assert.StrictEqual(value.ModifiedTime, actual.ModifiedTime);
1378+
Assert.StrictEqual(value.ModifiedTime.Offset, actual.ModifiedTime.Offset);
13731379
}
13741380

13751381
[Fact]

src/System.Xml.XmlSerializer/tests/XmlSerializerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public static void Xml_ByteAsRoot()
5454
[Fact]
5555
public static void Xml_DateTimeAsRoot()
5656
{
57-
var offsetMinutes = (int)TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
57+
var offsetMinutes = (int)TimeZoneInfo.Local.GetUtcOffset(new DateTime(2013, 1, 2)).TotalMinutes;
5858
var timeZoneString = string.Format("{0:+;-}{1}", offsetMinutes, new TimeSpan(0, offsetMinutes, 0).ToString(@"hh\:mm"));
5959
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2), "<?xml version=\"1.0\"?>" + Environment.NewLine + "<dateTime>2013-01-02T00:00:00</dateTime>"), new DateTime(2013, 1, 2));
6060
Assert.StrictEqual(SerializeAndDeserialize<DateTime>(new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local), string.Format("<?xml version=\"1.0\"?>" + Environment.NewLine + "<dateTime>2013-01-02T03:04:05.006{0}</dateTime>", timeZoneString)), new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Local));

0 commit comments

Comments
 (0)