DxScheduler 是 DevExpress Blazor 控件,用于提供复杂的日历 UI。但下面的问题是关于日历中时区的 DB 到 UI 表示的问题。
以下的做法有没有问题。一个很大的限制是 DevExpress 确实支持约会集合的时区。它不支持每个约会的时区。 (可以做到,但这是工作。)
首先,我决定不跟踪每个约会的时区。这是可以做到的,但对我来说这是很多额外的工作。这不仅仅是时间问题,还意味着更多的错误。 (一位我非常尊敬的开发人员说,每一个
if
语句都是一个等待发生的错误。)此外,对于我 99% 的用户来说,他们关于我的应用程序的世界将在他们的时区中。
其次,这个应用程序将被美国各地以及世界各地的少数人大量使用。人们希望在当地时区查看他们的约会。
第三,在“本地”时间保存所有内容是危险的。对于大多数用途,它都会起作用,但对于不起作用的情况 - 我完蛋了。因为这样就无法了解 3:00 的会议位于哪个时区。
所以我正在做以下事情。
这种方法有什么问题吗?
注意:根据 StackOverflow 指南,我并不是在征求有关最佳方法的意见。我想问一下这种方法是否有问题。
您表示:
...我决定不跟踪每个约会的时区。 ...所有约会都以 UTC 时间存储在数据库中。
这是您的方法的主要问题。虽然它看起来可以避免错误,但它实际上引入了一个非常现实的问题,在时区更新的情况下可能会导致约会推迟一个小时。
重要的是要了解世界各国政府都会以他们认为合适的方式更新其时区。这可以是对夏令时适用性或开始/结束日期的更改,也可以是对标准时区偏移的更改。 (有时,时区适用的地理边界也可能会发生变化 - 但这比其他类型的变化更难以在软件中跟踪。)当发生此类变化时,有时会有足够的变化通知,有时没有。但出于争论的目的,我们假设您确实有足够的更改通知来使您的系统保持最新状态。
使用基于 UTC 的模型,如果在首次记录预约与生效之间的期间进行此类更改,则会出现此问题。这是一个示例场景:
2023-05-01T10:00-05:00
转换为 2023-05-01T15:00Z
,将该 UTC 时间存储在数据库中。2023-05-01T15:00Z
转换为 2023-05-01T09:00-06:00
。为避免此问题,请牢记以下原则:
America/Mexico_City
)应与事件本身一起存储,或者与属于事件物理位置的关联记录一起存储,例如拥有多个办事处的企业等。但是,某些场景可能基于可变的本地时区,例如用户智能手机上的闹钟。