Skip to content

Commit

Permalink
Fixed googleapis#50 - timestamps need to be int/long, not float.
Browse files Browse the repository at this point in the history
Finally fixed properly this time.
  • Loading branch information
jgeewax committed Mar 8, 2014
1 parent 2c26d9b commit fef9d79
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
12 changes: 10 additions & 2 deletions gcloud/datastore/helpers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Helper methods for dealing with Cloud Datastore's Protobuf API."""
import calendar
from datetime import datetime
import time

import pytz

Expand Down Expand Up @@ -37,7 +37,15 @@ def get_protobuf_attribute_and_value(val):
"""

if isinstance(val, datetime):
name, value = 'timestamp_microseconds', time.mktime(val.timetuple())
name = 'timestamp_microseconds'
# If the datetime is naive (no timezone), consider that it was
# intended to be UTC and replace the tzinfo to that effect.
if not val.tzinfo:
val = val.replace(tzinfo=pytz.utc)
# Regardless of what timezone is on the value, convert it to UTC.
val = val.astimezone(pytz.utc)
# Convert the datetime to a microsecond timestamp.
value = long(calendar.timegm(val.timetuple()) * 10**6) + val.microsecond
elif isinstance(val, Key):
name, value = 'key', val.to_protobuf()
elif isinstance(val, bool):
Expand Down
5 changes: 3 additions & 2 deletions gcloud/datastore/test_helpers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import calendar
from datetime import datetime
import time

Expand Down Expand Up @@ -28,7 +29,7 @@ def test_get_protobuf_attribute(self):
test_value, expected_name, actual_name))

def test_get_protobuf_value(self):
now = datetime.now()
now = datetime.utcnow()

mapping = (
(str('string'), 'string'),
Expand All @@ -37,7 +38,7 @@ def test_get_protobuf_value(self):
(long(), int()),
(float(), float()),
(bool(), bool()),
(now, time.mktime(now.timetuple())),
(now, long(calendar.timegm(now.timetuple()) * 10**6 + now.microsecond)),
(Key(), Key().to_protobuf()),
)

Expand Down

0 comments on commit fef9d79

Please sign in to comment.