0

I am building a system that allows a user to specify his/her working hours. This is stored in the database as:

  • DayOfWeek: Monday
  • StartTime: 08:00
  • EndTime: 17:00

This information is relative to the User A, so based on his time zone. Which the user selects in his/her profile e.g. (UTC+00:00) Dublin, Edinburgh, Lisbon, London

What am I trying to Achieve?

  1. User B currently makes a call to a .NET Web API with a Date e.g. 01 Jan 2019.
  2. I need the API to return User A working hours but in User B time zone.
  3. User B can then book that time with User A by making a second call to the API. In this case the booking is stored in UTC date format.

What I Need?

Can someone please provide a suitable solution for this as both User A and User B can have different Time Zones?

4

2 回答 2

0

在问题下的评论中,您说:

我目前的解决方案是将用户 A 的工作时间存储为一周中每一天的开始时间和结束时间。我还存储用户 TimeZone。目前,API 将使用工作人员 TimeZone 将工作时间作为 JSON 有效负载返回。然后,我为用户 B 显示此数据,并使用客户端 JS 使用用户 B 时区偏移执行调整。当用户 B 决定预订时,返回 API 的请求是使用用户 A 的 TimeZone 设置完成的,然后该日期时间值被转换并以 UTC 格式存储。

这通常很好,除非您说您使用用户 B 的时区偏移量执行调整。

问题是许多时区会根据您所谈论的日期和时间而经历不同的偏移量。例如,如果在客户端 JS 中您执行类似的操作new Date().getTimezoneOffset(),您将获得用户的当前偏移量。它不一定与适用于相关日期的偏移量相同。在时区标签 wiki 中的“时区!= 偏移量”标题下有更多信息。

此外,您继续说返回 API 的请求是在用户 A 的时区完成的(这很好),但是您随后将时间转换并存储为 UTC。那里要小心-您需要保留预定的约会时间。知道特定事件的 UTC 时间可能是很好的,但实际上这也可以改变。

例如,考虑最近发生在摩洛哥的时区变化。他们计划在 2018 年 10 月 28 日结束夏令时,将时钟从 UTC+1 切换回 UTC+0。然而,在 2018 年 10 月 26 日,仅发出两天警告,政府宣布他们将永久保持 UTC+1 并取消夏令时。这类临时通知的变化是很成问题的,并且以前在世界各地发生过很多次。几年前我写了一篇关于它们的博客文章,这在今天仍然非常适用。

因此,如果用户 A 在摩洛哥,并且您在 UTC 更改后的某个时间存储了约会,那么由于没有发生更改,他们的约会现在将在他们的本地日历上显示一个小时。

在此类事件中,如果您保留了事件的预期本地时间,那么您还可以有一个过程来根据您安装的当前时区数据重新计算 UTC 时间。短期通知更改非常困难,但如果有几个月的通知,那么您将有时间应用更新并以编程方式更正事件的时间。如果您只存储 UTC 时间,那么您将没有这种能力。

另一种思考方式是,虽然 UTC 始终保持一致地向前移动(在某些情况下闰秒附近除外),但人类不会以这种方式思考。如果我说我想在上午 10 点在某个地方与您会面,那么会议将与那个地方的当地时间保持一致——无论那个地方的时间与 UTC 之间发生什么变化。

相反,根据 UTC 安排会议是在盲目相信不会发生超出当前预测的变化。由于我们无法展望未来,我们真的不应该做出这样的假设。

(同样,如果您需要代码方面的帮助,请显示您在问题中尝试过的代码。通常在 .NET 中,为此使用TimeZoneInfo该类。 这是有关如何使用它的概述。)

于 2018-10-31T17:54:08.353 回答
0

你可以看一下NodaTime,这可能是 .NET 的最佳时区相关库 使用内置的 .Net 功能可以实现相同的功能,但它存在一些棘手的罕见问题,因此使用 NodaTime 更可靠。

于 2018-10-30T11:59:10.730 回答