@@ -784,7 +784,7 @@ private BsonBinary visitHexDataConstructor() {
784
784
}
785
785
786
786
private long visitDateTimeConstructor () {
787
- DateFormat df = new SimpleDateFormat ("EEE MMM dd yyyy HH:mm:ss z" );
787
+ DateFormat format = new SimpleDateFormat ("EEE MMM dd yyyy HH:mm:ss z" , Locale . ENGLISH );
788
788
789
789
verifyToken ("(" );
790
790
@@ -795,7 +795,7 @@ private long visitDateTimeConstructor() {
795
795
verifyToken (")" );
796
796
String s = token .getValue (String .class );
797
797
ParsePosition pos = new ParsePosition (0 );
798
- Date dateTime = df .parse (s , pos );
798
+ Date dateTime = format .parse (s , pos );
799
799
if (dateTime != null && pos .getIndex () == s .length ()) {
800
800
return dateTime .getTime ();
801
801
} else {
@@ -870,11 +870,26 @@ private BsonBinary visitBinDataExtendedJson() {
870
870
private long visitDateTimeExtendedJson () {
871
871
verifyToken (":" );
872
872
JsonToken valueToken = popToken ();
873
- if (valueToken .getType () != JsonTokenType .INT32 && valueToken .getType () != JsonTokenType .INT64 ) {
874
- throw new JsonParseException ("JSON reader expected an integer but found '%s'." , valueToken .getValue ());
875
- }
876
873
verifyToken ("}" );
877
- return valueToken .getValue (Long .class );
874
+
875
+ if (valueToken .getType () == JsonTokenType .INT32 || valueToken .getType () == JsonTokenType .INT64 ) {
876
+ return valueToken .getValue (Long .class );
877
+ } else if (valueToken .getType () == JsonTokenType .STRING ) {
878
+ String dateString = valueToken .getValue (String .class );
879
+ SimpleDateFormat format = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" , Locale .ENGLISH );
880
+ ParsePosition pos = new ParsePosition (0 );
881
+ format .setLenient (true );
882
+
883
+ Date date = format .parse (dateString , pos );
884
+
885
+ if (date != null && pos .getIndex () == dateString .length ()) {
886
+ return date .getTime ();
887
+ }
888
+
889
+ throw new JsonParseException ("JSON reader expected an ISO-8601 date string but found." , dateString );
890
+ } else {
891
+ throw new JsonParseException ("JSON reader expected an integer or string but found '%s'." , valueToken .getValue ());
892
+ }
878
893
}
879
894
880
895
private MaxKey visitMaxKeyExtendedJson () {
0 commit comments