Продолжая работу над
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, поэтому вот эта ссылка обладает
повышенной ценностью
Комментариев нет:
Отправить комментарий