Skip to content

Commit 6339e9c

Browse files
author
rstam
committed
Changed ToLocalTime and ToUniversalTime helper methods in BsonUtils. These helper methods exist because .NET does funny things when you call ToLocalTime or ToUniversalTime on DateTime.MinValue or MaxValue. Removed the kind parameter from the ToLocalTime helper method. The only two places that passed a value other than Local now deal with that at the calling site.
1 parent 44c0f79 commit 6339e9c

File tree

5 files changed

+19
-35
lines changed

5 files changed

+19
-35
lines changed

Bson/BsonUtils.cs

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -97,28 +97,20 @@ public static string ToHexString(byte[] bytes)
9797
/// Converts a DateTime to local time (with special handling for MinValue and MaxValue).
9898
/// </summary>
9999
/// <param name="dateTime">A DateTime.</param>
100-
/// <param name="kind">A DateTimeKind.</param>
101100
/// <returns>The DateTime in local time.</returns>
102-
public static DateTime ToLocalTime(DateTime dateTime, DateTimeKind kind)
101+
public static DateTime ToLocalTime(DateTime dateTime)
103102
{
104-
if (dateTime.Kind == kind)
103+
if (dateTime == DateTime.MinValue)
105104
{
106-
return dateTime;
105+
return DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Local);
106+
}
107+
else if (dateTime == DateTime.MaxValue)
108+
{
109+
return DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Local);
107110
}
108111
else
109112
{
110-
if (dateTime == DateTime.MinValue)
111-
{
112-
return DateTime.SpecifyKind(DateTime.MinValue, kind);
113-
}
114-
else if (dateTime == DateTime.MaxValue)
115-
{
116-
return DateTime.SpecifyKind(DateTime.MaxValue, kind);
117-
}
118-
else
119-
{
120-
return DateTime.SpecifyKind(dateTime.ToLocalTime(), kind);
121-
}
113+
return dateTime.ToLocalTime();
122114
}
123115
}
124116

@@ -140,26 +132,18 @@ public static long ToMillisecondsSinceEpoch(DateTime dateTime)
140132
/// <returns>The DateTime in UTC.</returns>
141133
public static DateTime ToUniversalTime(DateTime dateTime)
142134
{
143-
if (dateTime.Kind == DateTimeKind.Utc)
135+
if (dateTime == DateTime.MinValue)
136+
{
137+
return DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
138+
}
139+
else if (dateTime == DateTime.MaxValue)
144140
{
145-
return dateTime;
141+
return DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc);
146142
}
147143
else
148144
{
149-
if (dateTime == DateTime.MinValue)
150-
{
151-
return DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
152-
}
153-
else if (dateTime == DateTime.MaxValue)
154-
{
155-
return DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc);
156-
}
157-
else
158-
{
159-
return dateTime.ToUniversalTime();
160-
}
145+
return dateTime.ToUniversalTime();
161146
}
162-
163147
}
164148

165149
/// <summary>

Bson/IO/JsonReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ private string FormatInvalidTokenMessage(JsonToken token)
735735
private string FormatJavaScriptDateTimeString(DateTime dateTime)
736736
{
737737
var utc = BsonUtils.ToUniversalTime(dateTime);
738-
var local = BsonUtils.ToLocalTime(utc, DateTimeKind.Local);
738+
var local = BsonUtils.ToLocalTime(utc);
739739
var offset = local - utc;
740740
var offsetSign = "+";
741741
if (offset < TimeSpan.Zero)

Bson/ObjectModel/BsonDateTime.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ public override int GetHashCode()
238238
public DateTime ToLocalTime()
239239
{
240240
var utcDateTime = BsonUtils.ToDateTimeFromMillisecondsSinceEpoch(_millisecondsSinceEpoch);
241-
return BsonUtils.ToLocalTime(utcDateTime, DateTimeKind.Local);
241+
return BsonUtils.ToLocalTime(utcDateTime);
242242
}
243243

244244
/// <summary>

Bson/Serialization/Serializers/BsonPrimitiveSerializers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public override object Deserialize(
223223
{
224224
case DateTimeKind.Local:
225225
case DateTimeKind.Unspecified:
226-
value = BsonUtils.ToLocalTime(value, dateTimeOptions.Kind);
226+
value = DateTime.SpecifyKind(BsonUtils.ToLocalTime(value), dateTimeOptions.Kind);
227227
break;
228228
case DateTimeKind.Utc:
229229
value = BsonUtils.ToUniversalTime(value);

Bson/Serialization/Serializers/BsonValueSerializers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ public override object Deserialize(
414414
{
415415
case DateTimeKind.Local:
416416
case DateTimeKind.Unspecified:
417-
dateTime = BsonUtils.ToLocalTime(dateTime, dateTimeOptions.Kind);
417+
dateTime = DateTime.SpecifyKind(BsonUtils.ToLocalTime(dateTime), dateTimeOptions.Kind);
418418
break;
419419
case DateTimeKind.Utc:
420420
dateTime = BsonUtils.ToUniversalTime(dateTime);

0 commit comments

Comments
 (0)