DateTime,Epoch和DocumentDb

Ger*_*art 5 c# epoch azure-cosmosdb

所以我读了一篇关于在Azure DocumentDb中使用datetime的非常有趣的博客.问题是,目前,Azure DocumentDb不支持日期时间字段的范围搜索.原因是DocumentDb基于json并且没有日期时间类型,因此通常将其放在xml日期时间格式的字符串中.

(显然Mongo没有那个问题,它的bson格式添加了datetime类型(等等))

无论如何,文章描述了在纪元(unix)时间内将日期时间存储在json中,基本上将日期时间存储为自01-01-1970以来的秒数.时代的一个问题是它不考虑闰秒,但我现在可以忍受这一点.

我的问题是,我还希望以这种格式存储出生日期.现在我可以将01-01-1900作为开始日期,并将自该日期以来的天数存储在int中.虽然我很确定这会很好用,但感觉epoch是一个完善的概念,但生日的感觉就像我正在构建我自己的约定,这是我通常想要避免的.

有没有建立标准将日期存储标准化为数字?哪个日期应该是基准日期?

Lar*_*one 17

首先,更新:DocumentDB现在支持字符串和数字的范围索引.您必须正确设置索引才能使其正常工作.

现在,给你一个推荐.我成功地将ISO-8601时间戳存储为字符串.这是DocumentDB SDK用于处理DateTime的默认格式,因此它比转换为整数的工作少.

ISO-8601日期/时间字符串具有多个符合您需求的属性.

  1. 字母数字排序顺序是按时间顺序排列的,因此使用>,<,> =,<=和BETWEEN的查询子句可以完美地工作,假设您有一个适当精度的范围索引(-1表示完全精度);
  2. 它们是人类可读的,所以如果你正在浏览一个表,数据是有意义的;
  3. 此格式允许指定较低粒度的日期/时间.例如,您应该将"2015-03"表示行军月份,或"2015-03-24"表示2015年3月24日.然后,您可以使用此过滤器发出查询"startedOn> = 2015-03- 24 AND startedOn <2015-03-25"查找从2015年3月24日开始的所有内容.即使startOn存储为完整的ISO-8601字符串,例如"2015-03-24T12:34:56.789Z",这仍然有效字符串比较的本质.

我在这里写过这个方法.