Javascript 未来预订维护业务时区,以便在其他时区显示数据

Javascript 未来预订维护业务时区,以便在其他时区显示数据,javascript,datetime,timezone,momentjs,moment-timezone,Javascript,Datetime,Timezone,Momentjs,Moment Timezone,我正在为一家企业建立一个webapp,它接受未来的预订,而这些预订也可能是重复性的。目前,只有企业可以进行预订 业务规则: 应用程序必须根据帐户注册时提供的业务地址为用户保存时区。所有活动将在营业地址举行更新:以下注释,此规则将更改为:将向使用地理编码服务的用户推荐时区(在找到匹配项的情况下),但用户必须确认其时区 当从另一个时区登录时,用户仍应将webapp应用程序预订系统显示为设置为业务时区。(可能的情况是,用户正在国外开会,但仍希望查看他们的预订情况)。这意味着他们仍然可以像以前一样使用

我正在为一家企业建立一个webapp,它接受未来的预订,而这些预订也可能是重复性的。目前,只有企业可以进行预订

业务规则:

  • 应用程序必须根据帐户注册时提供的业务地址为用户保存时区。所有活动将在营业地址举行更新:以下注释,此规则将更改为:将向使用地理编码服务的用户推荐时区(在找到匹配项的情况下),但用户必须确认其时区
  • 当从另一个时区登录时,用户仍应将webapp应用程序预订系统显示为设置为业务时区。(可能的情况是,用户正在国外开会,但仍希望查看他们的预订情况)。这意味着他们仍然可以像以前一样使用该系统,例如通过添加新的预订。但是,我相信这意味着系统必须忽略用户的本地时区,并将业务时区应用于任何预订活动
我的预订系统为同一时区内的用户工作。但当他们改变时区时,未来的预订日历就会中断

我的应用程序是带有postgresql的nodeJS。我所困惑的是我应该坚持什么关于日期时间,以及要执行什么相关转换


我认为始终保存客户机区域设置日期时间(即使不使用,因为需求可能会更改)以及UTC时间是明智的。但我认为我还必须构造一个日期(用javascript)来获取所选的日期时间并将业务时区应用于此(使用例如
moment.tz.setDefault(“America/New_York”)
?)。查看日程安排信息时,我不确定如何在客户端接收此日期。如何确保它与业务时区一起显示?

您应该始终存储与事件相关的时区。既然您说过“所有活动都将在营业地址进行”,那么营业的时区是相关的

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

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

时区本身应存储为
varchar(14)
。IANA 2017c对区域或链路标识符的各个段规定了14个字符的限制,删除了唯一超过该限制的链路名称,
加拿大/东萨斯喀彻温省
。(如果您有包含该信息的旧数据,请将其替换为
America/Regina

对于单个约会,您应该在约会的时区中存储约会的日期和时间。您应该将其存储在保存日期和时间的数据类型中,而不包含任何时区或偏移量<代码>不带时区的时间戳在postgres中,以及MS Sql Server中的日期时间2等

您可能认为应该使用带有时区的
时间戳(或在SQL Server中键入
datetimeoffset
),但这将使用约会安排时适用的规则将约会固定到等效的世界时。如果这些规则在约会生效前发生变化,那么约会将转移到不同的当地时间。这通常是不希望的。关键是捕捉用户的意图。换句话说,如果我说“12月1日上午8点”,那么我的意思是无论我的政府从现在到我的预约时间对我的时区做了什么

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

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


对于重复约会,特别重要的是考虑到每次发生的UTC等价物不一定是相同的。考虑到许多时区根据夏时制是否有效来替代它们的UTC偏移。例如,如果我在洛杉矶创建上午10点的每日约会,太平洋标准时间为UTC下午6点,太平洋昼间为UTC下午5点。因此,您不能只存储UTC时间。同样,捕获用户的意图是最重要的部分。

仅基于地址不可能可靠地确定偏移规则。目前,应用规则的最常见方式是使用IANA代表性位置,但据我所知,这些位置没有相关的地理边界,无法确定使用特定规则集的精确区域。你可能会猜到要去的地方