Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2013-05-30

Python datetime to JSON

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


original post http://vasnake.blogspot.com/2013/05/python-datetime-to-json.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)