在项目具有不同时区的列表中实现日期过滤器的好方法是什么?
What's a good way to implement a date filter in a list where the items have different timezones?
我们有一个列出体育赛事的应用程序。一个事件关联到 2 个团队(主队和客队)。在事件列表中,我们以主队时区显示事件日期。我们以 UTC 格式将日期存储在数据库中。我们需要在事件列表页面中添加一个日期过滤器,但问题是,由于我们以 UTC 格式将日期存储在我们的数据库中,并且事件列表中的日期显示在主队的时区中,因此日期过滤器正在显示意想不到的结果。日期在我们的数据库中保存为 2016-02-18 03:30:00+00
(UTC)。当在事件列表中向用户显示时,它是 02/17/2016 7:30pm
,因为主队在宾夕法尼亚,时区是 America/New_York
。
现在,当用户将日期过滤器设置为 02/17/2016
时,我们正在查询数据库以获取日期为 02/17/2016
的所有事件。它会导致意外结果,因为它与事件不匹配,因为在我们的数据库中日期是 02/18/2016
.
我能想到的一个解决方案是在事件列表中显示 2 个日期和时间列。
日期 (UTC) |时间 (UTC) |日期(主队时区) |时间(主队时区)
并通知用户在使用日期过滤器时它将使用日期 (utc) 过滤事件
但我们目前正在寻找更好的解决方案。任何帮助/建议将不胜感激:)
编辑:
event 1:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: America/Chicago
event 2:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: America/Denver
event 3:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: Asia/Singapore
如果用户在日期过滤器中选择 01/12/2016。它应该仍然显示上面的 3 个事件。
在数据库中添加一个以本地时间存储日期的新字段,并使用该字段过滤结果。
所以当你过滤 2016-04-01 时,它实际上会过滤不同时区的东西,即不在同一纪元时间的事件
所以请告诉我所有事件,例如星期四,无论团队在哪里(意味着一个团队的星期四是另一个团队的星期五)
它将过滤本地化到存储日期的位置的结果。
另一种解决方案是使用即时转换查询。
示例:
where convert_to_local_without_timezone(event_datetime, event_tz) = date_filter
它可以是用户定义的函数 - http://www.postgresql.org/docs/8.0/static/xfunc.html 如果没有可以实现此目的的现有函数。
感谢:
Aries、Ryan Johnson 和 Nikki Erwin Ramirez
我们有一个列出体育赛事的应用程序。一个事件关联到 2 个团队(主队和客队)。在事件列表中,我们以主队时区显示事件日期。我们以 UTC 格式将日期存储在数据库中。我们需要在事件列表页面中添加一个日期过滤器,但问题是,由于我们以 UTC 格式将日期存储在我们的数据库中,并且事件列表中的日期显示在主队的时区中,因此日期过滤器正在显示意想不到的结果。日期在我们的数据库中保存为 2016-02-18 03:30:00+00
(UTC)。当在事件列表中向用户显示时,它是 02/17/2016 7:30pm
,因为主队在宾夕法尼亚,时区是 America/New_York
。
现在,当用户将日期过滤器设置为 02/17/2016
时,我们正在查询数据库以获取日期为 02/17/2016
的所有事件。它会导致意外结果,因为它与事件不匹配,因为在我们的数据库中日期是 02/18/2016
.
我能想到的一个解决方案是在事件列表中显示 2 个日期和时间列。
日期 (UTC) |时间 (UTC) |日期(主队时区) |时间(主队时区)
并通知用户在使用日期过滤器时它将使用日期 (utc) 过滤事件
但我们目前正在寻找更好的解决方案。任何帮助/建议将不胜感激:)
编辑:
event 1:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: America/Chicago
event 2:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: America/Denver
event 3:
- date: 01/12/2016
- time: 9:00am
- home team's timezone: Asia/Singapore
如果用户在日期过滤器中选择 01/12/2016。它应该仍然显示上面的 3 个事件。
在数据库中添加一个以本地时间存储日期的新字段,并使用该字段过滤结果。
所以当你过滤 2016-04-01 时,它实际上会过滤不同时区的东西,即不在同一纪元时间的事件
所以请告诉我所有事件,例如星期四,无论团队在哪里(意味着一个团队的星期四是另一个团队的星期五)
它将过滤本地化到存储日期的位置的结果。
另一种解决方案是使用即时转换查询。
示例:
where convert_to_local_without_timezone(event_datetime, event_tz) = date_filter
它可以是用户定义的函数 - http://www.postgresql.org/docs/8.0/static/xfunc.html 如果没有可以实现此目的的现有函数。
感谢:
Aries、Ryan Johnson 和 Nikki Erwin Ramirez