使用ISO8601格式在两个日期之间搜索

时间:2018-08-21 13:55:53

标签: angularjs amazon-dynamodb momentjs

在这里使用angularjs,dynamodb作为数据库。

我有一个表单,用户可以在其中保存一些数据。我将“ CreateOn”日期保存在我的Dynamo数据库中:

DateTime.UtcNow.ToString("o");
//This saves date in DB as:2018-08-21T12:58:08.7823906Z

之所以这样存储,是因为如果要在运算符之间搜索日期范围,则dynamo db需要将日期(字符串)以ISO8601格式存储。

现在我的页面上有一个搜索过滤器,它基本上是一个角度日历。当用户在日历中选择日期(开始和结束日期)时,我想根据所选日期取回数据。在这里,我使用矩将日历选择的日期传递给我的api调用,如下所示:

  moment(createdOn).toISOString()

例如:如果他们在日历中选择了今天的日期,我会通过所选的日期     (格林尼治标准时间-0400(东部夏令时间)2018年8月21日,星期二)使用上述功能

将此日期传递给moment(createdOn).toISOString()的结果是

2018-08-21T04:00:00.000Z

dynamo db的搜索条件是:

conditions.Add(new ScanCondition("CreatedOn", ScanOperator.Between, startDate, endDate ));

如果用户从日历中选择开始日期为“ 08-20-2018”(2018-08-20T04:00:00.000Z),结束日期为“ 08-21-2018”(2018-08- 21T04:00:00.000Z),代码将这两个日期前后创建的所有数据进行编码。

现在的问题是,如果他们选择相同的开始日期和结束日期,那么代码不会返回任何数据,我相信因为开始日期和结束日期是“ 2018-08-21T04:00:00.000Z”,并且时间部分这都是0000等

我的问题是如何转换日历中的日期(即结束日期)以正确反映他们选择的结束时间。我以前没有使用过ISO8601格式,所以不确定该怎么做。

谢谢

1 个答案:

答案 0 :(得分:0)

您不需要为此。您可以通过以下方式使用日期将时间清零。

const date = new Date('2018-08-21T12:58:08.7823906Z')
date.setUTCHours(0)
date.setUTCMinutes(0)
date.setUTCSeconds(0)
date.setUTCMilliseconds(0)

然后,您只需使用toISOString()来格式化日期即可。

date.toISOString()
// returns '2018-08-21T00:00:00.000Z'

如果您不想将时间清零,而是想设置一些特定时间,则可以使用类似的方法,只需将0替换为您想要的任何时间。

其他注意事项:DynamoDB不需要任何特定的日期格式。 DynamoDB可以根据字段定义简单地进行字符串或数字比较。如果您认为使用起来更容易,则可以将日期以整数或其他字符串格式存储在DynamoDB中。

此外,我不确定如何设置表,但请确保“ CreateOn”字段是Range键,并且您正在使用查询而不是扫描。使用“扫描”操作无法很好地扩展。