【问题标题】:Search between two dates with ISO8601 format使用 ISO8601 格式在两个日期之间搜索
【发布时间】:2019-01-27 17:47:29
【问题描述】:

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

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

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

这样存储是因为如果您想使用 between 运算符搜索日期范围,dynamo db 需要日期(字符串)以 ISO8601 格式存储。

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

  moment(createdOn).toISOString()

例如:如果他们在日历中选择今天的日期,我会通过所选日期 (Tue Aug 21 2018 00:00:00 GMT-0400 (Eastern Daylight Time)) 到上述函数

将此日期传递给 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 格式,所以不知道该怎么做。

谢谢

【问题讨论】:

  • 这就是为什么我们确保首先使用utc解析所有日期
  • @LBA 对不起,但我不明白解析在这里会有什么不同。我想知道我是否从日历中选择了结束日期,如何确保它也将当天的结束时间添加到其中。
  • 你的意思是moment().utc().endOf('day')?
  • @LBA 根据你的建议,我使用了这个 var start = moment(current_time).startOf('day').toISOString(); var end = moment(current_time).endOf('day').toISOString();使用此代码,开始日期为“2018-08-21T04:00:00.000Z”,我认为这是正确的。但是结束日期是: "2018-08-22T03:59:59.999Z" 。不确定这是否正确结束。见我的 jsfiddle:jsfiddle.net/ce4tvn6h

标签: angularjs amazon-dynamodb momentjs


【解决方案1】:

您不需要时间。您可以通过以下方式使用 Date 将时间归零。

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 键,并且您使用的是 Query,而不是 Scan。使用 Scan 操作不能很好地扩展。

【讨论】:

  • 你是对的,但由于时间处理始终是一个关键部分(尤其是在网络应用程序中,你通常有浏览器、前端、后端和数据库,它们都处理 DateTime 有点不同)我总是建议找到一种“通用”的方法——因为 OP 已经使用了它,所以它是一种选择。出于这个原因,没有提供它作为回应。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 2015-07-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
相关资源
最近更新 更多