Uploaded image for project: 'Python Driver'
  1. Python Driver
  2. PYTHON-864

Fully support RFC-3339 offset format for $date

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Minor - P4 Minor - P4
    • 3.0, 2.8.1
    • Affects Version/s: 2.8
    • Component/s: None
    • None

      bson.json_util appears to only support a subset of the possible interpretations of the ISO-8601 format for $date.

      Here is a "valid" ISO-8601 formatted string as returned by the mongo shell:

      MongoDB shell version: 3.0.0
      connecting to: test
      > bah = new Date()
      ISODate("2015-03-18T20:30:50.508Z")
      > bah.toISOString()
      2015-03-18T20:30:50.508Z
      >
      

      But this same string cannot be parsed by bson.json_util.loads:

      Python 2.7.6 (default, Sep  9 2014, 15:04:36)
      [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import pymongo
      >>> pymongo.version
      '2.8'
      >>> import bson.json_util
      >>> bson.json_util.loads('{"$date":"2015-03-18T20:30:50.508Z"}')
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/Library/Python/2.7/site-packages/bson/json_util.py", line 158, in loads
          return json.loads(s, *args, **kwargs)
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 351, in loads
          return cls(encoding=encoding, **kw).decode(s)
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
          obj, end = self.raw_decode(s, idx=_w(s, 0).end())
        File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode
          obj, end = self.scan_once(s, idx)
        File "/Library/Python/2.7/site-packages/bson/json_util.py", line 157, in <lambda>
          kwargs['object_hook'] = lambda dct: object_hook(dct, compile_re)
        File "/Library/Python/2.7/site-packages/bson/json_util.py", line 204, in object_hook
          raise ValueError("invalid format for offset")
      ValueError: invalid format for offset
      >>>
      

      I get around this locally by replacing https://github.com/mongodb/mongo-python-driver/blob/master/bson/json_util.py#L151 with:

      if not offset or offset == "Z":
      

      However, there are other interpretations of ISO-8601 that should be parseable as well. For example, the following should all be parsed the same:

      • 2015-03-18T20:30:50.508Z
      • 2015-03-18T20:30:50.508+0000
      • 2015-03-18T20:30:50.508+00:00

            Assignee:
            bernie@mongodb.com Bernie Hackett
            Reporter:
            jacob.ribnik@mongodb.com Jacob Ribnik
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: