Продолжая работу над
Mapfeatureserver,
столкнулся с типом данных «timestamp».
Если точнее, то в Postgres это
«timestamp
without time zone». Библиотека Psycopg2
считывает такие данные в тип Python
«datetime.datetime».
И все сложилось бы иначе, если бы
simplejson.dumps
умел переваривать такое. Но он не
умеет.
Пришлось копать глубже
(как
и с Decimal), и вот, что
выяснилось.
Есть такой тип данных
в ArcGIS
REST API, называется
«esriFieldTypeDate».
Для даты-времени «2013-05-29 19:16:00» значение
такого поля выводится как «1369854960000».
Похоже на Unix timestamp но есть
лишние нули. Как оказалось, данные типа
esriFieldTypeDate выводятся в миллисекундах
(milliseconds) с начала компьютерных
времен. Следовательно, для simplejson.dumps
мне надо написать хук, который
получит datetime.datetime и
преобразует его в миллисекунды от epoch
– суть timestamp, причем
полученное число должно быть целым.
Пришлось немного
поэкспериментировать, в итоге получилось
так:
EPOCH = datetime.datetime.utcfromtimestamp(0) def unix_time_millisec(dt): delta = dt - EPOCH return delta.total_seconds() * 1000.0 def jsonify(obj): if isinstance(obj, decimal.Decimal): return float(obj) elif isinstance(obj, datetime.datetime): return long(unix_time_millisec(obj)) raise TypeError(repr(obj) + " is not JSON serializable") text = simplejson.dumps(data, ensure_ascii=False, sort_keys=True, indent=2, default=jsonify, use_decimal=False) |
Использованные материалы
Кстати, почему-то плохо
гуглится развернутое описание ArcGIS
REST API, поэтому вот эта ссылка обладает
повышенной ценностью
Комментариев нет:
Отправить комментарий