将来的预订会保留业务时区,以便在其他时区显示数据

问题描述

我正在为一家企业设置Web应用程序,该应用程序可以接受以后的预订,而且该预订也可以重复发生。目前,只有企业可以进行预订。

业务规则:

  • 应用程序必须根据帐户注册时提供的营业地址为用户保存时区。所有活动都将在公司地址进行。 更新:在注释之后,此规则将更改为:使用地理编码服务的用户将被推荐给时区(在找到匹配项的情况下),但用户必须确认其时区。 / li>
  • 从其他时区登录时,webapp应用预订系统仍应显示给用户以设置为业务时区。 (可能的情况是用户正在国外开会,但仍想检查其预订)。这应该意味着他们仍然可以像以前一样使用该系统。通过添加新的预订。但是,我相信这将意味着系统必须忽略用户的本地时区,并将业务时区应用于任何预订事件。

我的预订系统适用于同一时区的用户。但是,当他们更改时区时,将来的预订日历就会中断。

我的应用程序是带有postgresql的nodeJS。我感到困惑的是,我应该坚持关于日期时间以及执行哪些相关的转换。

我认为始终保存客户端语言环境日期时间(即使未按要求使用可能会更改)以及UTC时间都是明智的。但是我想我还必须构造一个日期(使用JavaScript),该日期采用所选的日期时间,并将业务时区应用于此日期(例如使用moment.tz.setDefault("America/New_York")?)。我不确定在查看计划信息时如何在客户端上接收此日期。如何确保它显示在业务时区?

解决方法

您应始终存储与事件相关的时区。由于您说“所有事件都将在公司地址进行”,因此公司的时区是相关的。

如果这些是实际的面对面事件,则用户的当前本地时区根本不相关。例如,我希望如果我在洛杉矶预约牙医,即使我是从纽约预约的,我也会指定在洛杉矶的时间。

但是,如果事件是虚拟的在线事件,那么您可能还希望在UX中添加一些逻辑以同时显示目标时区中的时间和等效的本地时间。例如,如果我计划下周在洛杉矶与一个人进行视频通话,而我今天恰好在纽约,则您不知道我是否仍会 在纽约通话时间或到那时我是否要去洛杉矶。您应该允许我选择要在哪个时区创建约会,并同时显示该时间和我的等效本地时间。

时区本身应存储为varchar(14)。 IANA 2017c为区域标识符建立了14个字符的限制,删除了唯一超出该限制的链接名称Canada/East-Saskatchewan。 (如果您有包含旧数据的旧数据,请用America/Regina替换。)

对于单个约会,应将约会的日期和时间存储在约会的时区中。您应该以一种保存日期和时间而没有任何时区或偏移量的数据类型来存储它。 Postgres中的timestamp without time zone,MS Sql Server中的datetime2,等等。

您可能会认为,您应该使用timestamp with timezone(或SQL Server中的datetimeoffset类型),但这会使用规则将约会固定为等效的通用时间适用于安排约会的时间。如果这些规则在约会生效之前发生更改,则约会将转移到其他本地时间。这通常是不希望的。关键是要抓住用户的意图。换句话说,如果我说“ 12月1日上午8点”,那么我的意思是,无论我的政府在现在到约会时间之间对我的时区采取什么措施。

您可能将UTC时间等效项存储在单独的字段中,但是只要服务器的时区数据更新,就需要重新计算该时间。 (这样的字段可以方便地快速查询即将发生的事件。)

对于定期约会,除您需要存储某种形式的重复规则外,以上所有内容均适用。有些人喜欢为规则的各个组成部分存储许多字段(例如,一个字段用于“每日”,一个字段用于“星期三”,一个字段用于一天中的时间,等等)。如果愿意,可以在数据库中使用datetime类型。其他人喜欢使用chron表达式存储字符串。真的取决于您的需求。

对于定期约会,考虑到每次出现的UTC等效值不一定相同,这一点尤其重要。考虑到许多时区会根据夏时制是否有效来交替使用其UTC偏移量。例如,如果我要在上午10点在洛杉矶创建每日约会,那么太平洋标准时间将是UTC下午6点,太平洋夏令时间是UTC下午5点。因此,您不能只存储UTC时间。同样,抓住用户的意图是最重要的部分。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...