File tree Expand file tree Collapse file tree 2 files changed +35
-3
lines changed Expand file tree Collapse file tree 2 files changed +35
-3
lines changed Original file line number Diff line number Diff line change @@ -923,13 +923,30 @@ private BsonValue ParseDateTimeExtendedJson()
923
923
{
924
924
VerifyToken ( ":" ) ;
925
925
var valueToken = PopToken ( ) ;
926
- if ( valueToken . Type != JsonTokenType . Int32 && valueToken . Type != JsonTokenType . Int64 )
926
+
927
+ long millisecondsSinceEpoch ;
928
+ if ( valueToken . Type == JsonTokenType . Int32 || valueToken . Type == JsonTokenType . Int64 )
927
929
{
928
- var message = string . Format ( "JSON reader expected an integer but found '{0}'." , valueToken . Lexeme ) ;
930
+ millisecondsSinceEpoch = valueToken . Int64Value ;
931
+ }
932
+ else if ( valueToken . Type == JsonTokenType . String )
933
+ {
934
+ DateTime dateTime ;
935
+ if ( ! DateTime . TryParse ( valueToken . StringValue , out dateTime ) )
936
+ {
937
+ var message = string . Format ( "Invalid $date string: '{0}'." , valueToken . StringValue ) ;
938
+ throw new FileFormatException ( message ) ;
939
+ }
940
+ millisecondsSinceEpoch = BsonUtils . ToMillisecondsSinceEpoch ( dateTime ) ;
941
+ }
942
+ else
943
+ {
944
+ var message = string . Format ( "JSON reader expected an integer or an ISO 8601 string for $date but found a '{0}'." , valueToken . Lexeme ) ;
929
945
throw new FileFormatException ( message ) ;
930
946
}
947
+
931
948
VerifyToken ( "}" ) ;
932
- return new BsonDateTime ( valueToken . Int64Value ) ;
949
+ return new BsonDateTime ( millisecondsSinceEpoch ) ;
933
950
}
934
951
935
952
private BsonValue ParseDateTimeConstructor ( bool withNew )
Original file line number Diff line number Diff line change @@ -223,6 +223,21 @@ public void TestDateTimeStrict()
223
223
Assert . AreEqual ( json , BsonSerializer . Deserialize < DateTime > ( new StringReader ( json ) ) . ToJson ( jsonSettings ) ) ;
224
224
}
225
225
226
+ [ Test ]
227
+ public void TestDateTimeStrictIso8601 ( )
228
+ {
229
+ var json = "{ \" $date\" : \" 1970-01-01T00:00:00Z\" }" ;
230
+ using ( _bsonReader = BsonReader . Create ( json ) )
231
+ {
232
+ Assert . AreEqual ( BsonType . DateTime , _bsonReader . ReadBsonType ( ) ) ;
233
+ Assert . AreEqual ( 0 , _bsonReader . ReadDateTime ( ) ) ;
234
+ Assert . AreEqual ( BsonReaderState . Done , _bsonReader . State ) ;
235
+ }
236
+ var expected = "{ \" $date\" : 0 }" ; // it's still not ISO8601 on the way out
237
+ var jsonSettings = new JsonWriterSettings { OutputMode = JsonOutputMode . Strict } ;
238
+ Assert . AreEqual ( expected , BsonSerializer . Deserialize < DateTime > ( new StringReader ( json ) ) . ToJson ( jsonSettings ) ) ;
239
+ }
240
+
226
241
[ Test ]
227
242
public void TestDateTimeTengen ( )
228
243
{
You can’t perform that action at this time.
0 commit comments