Skip to content

Commit 7df2e0a

Browse files
committed
Merge pull request ServiceStack#72 from mj1856/master
Fix silverlight build issues with last bugfix for UTC dates.
2 parents a8034d2 + f1a3421 commit 7df2e0a

3 files changed

Lines changed: 25 additions & 13 deletions

File tree

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr)
5656

5757
public static string ToDateTimeString(DateTime dateTime)
5858
{
59-
return TimeZoneInfo.ConvertTimeToUtc(dateTime).ToString(XsdDateTimeFormat);
59+
return dateTime.ToStableUniversalTime().ToString(XsdDateTimeFormat);
6060
}
6161

6262
public static DateTime ParseDateTime(string dateTimeStr)
@@ -66,7 +66,7 @@ public static DateTime ParseDateTime(string dateTimeStr)
6666

6767
public static string ToXsdDateTimeString(DateTime dateTime)
6868
{
69-
return XmlConvert.ToString(TimeZoneInfo.ConvertTimeToUtc(dateTime), XmlDateTimeSerializationMode.Utc);
69+
return XmlConvert.ToString(dateTime.ToStableUniversalTime(), XmlDateTimeSerializationMode.Utc);
7070
}
7171

7272
public static DateTime ParseXsdDateTime(string dateTimeStr)
@@ -82,7 +82,7 @@ public static string ToShortestXsdDateTimeString(DateTime dateTime)
8282
return dateTime.ToString(ShortDateTimeFormat);
8383

8484
if (timeOfDay.Milliseconds == 0)
85-
return TimeZoneInfo.ConvertTimeToUtc(dateTime).ToString(XsdDateTimeFormatSeconds);
85+
return dateTime.ToStableUniversalTime().ToString(XsdDateTimeFormatSeconds);
8686

8787
return ToXsdDateTimeString(dateTime);
8888
}

src/ServiceStack.Text/DateTimeExtensions.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static class DateTimeExtensions
2626

2727
public static long ToUnixTime(this DateTime dateTime)
2828
{
29-
return (TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks - UnixEpoch) / TimeSpan.TicksPerSecond;
29+
return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerSecond;
3030
}
3131

3232
public static DateTime FromUnixTime(this double unixTime)
@@ -36,7 +36,7 @@ public static DateTime FromUnixTime(this double unixTime)
3636

3737
public static long ToUnixTimeMs(this DateTime dateTime)
3838
{
39-
return (TimeZoneInfo.ConvertTimeToUtc(dateTime).Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond;
39+
return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond;
4040
}
4141

4242
public static DateTime FromUnixTimeMs(this double msSince1970)
@@ -99,7 +99,7 @@ public static DateTime FromShortestXsdDateTimeString(this string xsdDateTime)
9999

100100
public static bool IsEqualToTheSecond(this DateTime dateTime, DateTime otherDateTime)
101101
{
102-
return TimeZoneInfo.ConvertTimeToUtc(dateTime).RoundToSecond().Equals(TimeZoneInfo.ConvertTimeToUtc(otherDateTime).RoundToSecond());
102+
return dateTime.ToStableUniversalTime().RoundToSecond().Equals(otherDateTime.ToStableUniversalTime().RoundToSecond());
103103
}
104104

105105
public static string ToTimeOffsetString(this TimeSpan offset, bool includeColon = false)
@@ -120,5 +120,17 @@ public static TimeSpan FromTimeOffsetString(this string offsetString)
120120

121121
return TimeSpan.Parse(offsetString);
122122
}
123+
124+
public static DateTime ToStableUniversalTime(this DateTime dateTime)
125+
{
126+
#if SILVERLIGHT
127+
// Silverlight 3, 4 and 5 all work ok with DateTime.ToUniversalTime, but have no TimeZoneInfo.ConverTimeToUtc implementation.
128+
return dateTime.ToUniversalTime();
129+
#else
130+
// .Net 2.0 - 3.5 has an issue with DateTime.ToUniversalTime, but works ok with TimeZoneInfo.ConvertTimeToUtc.
131+
// .Net 4.0+ does this under the hood anyway.
132+
return TimeZoneInfo.ConvertTimeToUtc(dateTime);
133+
#endif
134+
}
123135
}
124136
}

tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public void ToShortestXsdDateTimeString_works()
4040
const string shortDateString = "1979-05-09";
4141

4242
var shortDateTime = new DateTime(1979, 5, 9, 0, 0, 1, DateTimeKind.Utc);
43-
var shortDateTimeString = shortDateTime.Equals(TimeZoneInfo.ConvertTimeToUtc(shortDateTime))
43+
var shortDateTimeString = shortDateTime.Equals(shortDateTime.ToStableUniversalTime())
4444
? "1979-05-09T00:00:01Z"
4545
: "1979-05-08T23:00:01Z";
4646

4747
var longDateTime = new DateTime(1979, 5, 9, 0, 0, 0, 1, DateTimeKind.Utc);
48-
var longDateTimeString = longDateTime.Equals(TimeZoneInfo.ConvertTimeToUtc(longDateTime))
48+
var longDateTimeString = longDateTime.Equals(longDateTime.ToStableUniversalTime())
4949
? "1979-05-09T00:00:00.001Z"
5050
: "1979-05-08T23:00:00.001Z";
5151

@@ -58,7 +58,7 @@ public void ToShortestXsdDateTimeString_works()
5858
public void Utc_Local_Equals()
5959
{
6060
var now = DateTime.Now;
61-
var utcNow = TimeZoneInfo.ConvertTimeToUtc(now);
61+
var utcNow = now.ToStableUniversalTime();
6262

6363
Assert.That(now.Ticks, Is.EqualTo(utcNow.Ticks), "Ticks are different");
6464
Assert.That(now, Is.EqualTo(utcNow), "DateTimes are different");
@@ -122,7 +122,7 @@ public void AssertDateIsEqual(int whichDate)
122122

123123
//Don't test short dates without time to UTC as you lose precision
124124
var shortDateStr = dateTime.ToString(DateTimeSerializer.ShortDateTimeFormat);
125-
var shortDateTimeStr = TimeZoneInfo.ConvertTimeToUtc(dateTime).ToString(DateTimeSerializer.XsdDateTimeFormatSeconds);
125+
var shortDateTimeStr = dateTime.ToStableUniversalTime().ToString(DateTimeSerializer.XsdDateTimeFormatSeconds);
126126
var longDateTimeStr = DateTimeSerializer.ToXsdDateTimeString(dateTime);
127127
var shortestDateStr = DateTimeSerializer.ToShortestXsdDateTimeString(dateTime);
128128

@@ -135,14 +135,14 @@ public void AssertDateIsEqual(int whichDate)
135135

136136
Assert.That(shortDate, Is.EqualTo(dateTime.Date));
137137

138-
var shortDateTimeUtc = TimeZoneInfo.ConvertTimeToUtc(shortDateTime);
138+
var shortDateTimeUtc = shortDateTime.ToStableUniversalTime();
139139
Assert.That(shortDateTimeUtc, Is.EqualTo(
140140
new DateTime(
141141
shortDateTimeUtc.Year, shortDateTimeUtc.Month, shortDateTimeUtc.Day,
142142
shortDateTimeUtc.Hour, shortDateTimeUtc.Minute, shortDateTimeUtc.Second,
143143
shortDateTimeUtc.Millisecond, DateTimeKind.Utc)));
144144

145-
Assert.That(TimeZoneInfo.ConvertTimeToUtc(longDateTime), Is.EqualTo(TimeZoneInfo.ConvertTimeToUtc(dateTime)));
145+
Assert.That(longDateTime.ToStableUniversalTime(), Is.EqualTo(dateTime.ToStableUniversalTime()));
146146

147147
var toDateTime = DateTimeSerializer.ParseShortestXsdDateTime(shortestDateStr);
148148
AssertDatesAreEqual(toDateTime, dateTime, "shortestDate");
@@ -158,7 +158,7 @@ public void AssertDateIsEqual(int whichDate)
158158

159159
private void AssertDatesAreEqual(DateTime toDateTime, DateTime dateTime, string which)
160160
{
161-
Assert.That(TimeZoneInfo.ConvertTimeToUtc(toDateTime).RoundToMs(), Is.EqualTo(TimeZoneInfo.ConvertTimeToUtc(dateTime).RoundToMs()), which);
161+
Assert.That(toDateTime.ToStableUniversalTime().RoundToMs(), Is.EqualTo(dateTime.ToStableUniversalTime().RoundToMs()), which);
162162
}
163163
}
164164
}

0 commit comments

Comments
 (0)