@@ -784,7 +784,7 @@ private BsonBinary visitHexDataConstructor() {
784784 }
785785
786786 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 );
788788
789789 verifyToken ("(" );
790790
@@ -795,7 +795,7 @@ private long visitDateTimeConstructor() {
795795 verifyToken (")" );
796796 String s = token .getValue (String .class );
797797 ParsePosition pos = new ParsePosition (0 );
798- Date dateTime = df .parse (s , pos );
798+ Date dateTime = format .parse (s , pos );
799799 if (dateTime != null && pos .getIndex () == s .length ()) {
800800 return dateTime .getTime ();
801801 } else {
@@ -870,11 +870,26 @@ private BsonBinary visitBinDataExtendedJson() {
870870 private long visitDateTimeExtendedJson () {
871871 verifyToken (":" );
872872 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- }
876873 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+ }
878893 }
879894
880895 private MaxKey visitMaxKeyExtendedJson () {
0 commit comments