我有一个使用 System.DateTime.now 记录员工工作时间的 asp.net + c# 应用程序。 该应用程序是在线的,最近我有用户从国外连接到它。
我有一个客户希望他在国外工作的员工根据他们的时区记录他们的工作时间。
数据库中记录的所有日期和时间都不是通用时间,所以我不想尝试将所有内容向后更改为 UTC(我也认为这不适用)。
我知道检测用户时区的方法 - js 和地理位置。 问题是我不相信两者的准确性水平。 总之,我想我会让管理员通过界面时区定义,用户将选择他希望使用的时区。
这是一种正确的方法吗?对此的最佳实践是什么?10q非常多。
您让管理员为一组用户定义时区的方法很有意义。您经常会发现人们在台式 PC 上定义了错误的时区,这增加了另一个复杂性。如果您明确设置它,那么您是安全的。
我敦促您在数据库中使用 UTC。如果您开始在同一数据库中混合来自不同时区的日期时间,这将回来咬您!
将日期时间存储在UTC中绝对是我书中的最佳实践。 转换现有数据可能需要相当多的工作,但从长远来看,如果您已经在不同时区拥有一些用户(今天是两个,但很快可能是三个,四个...... 这也将更容易避免夏令时转换等问题,特别是如果组位于夏令时的开始和结束不同的地区,美国和英国就是这种情况(我必须在我的系统中处理这些日期时间问题)。
当数据输入您的 UI 时,我不会依赖对用户时区的任何自动检测。 我要做的第一件事是将数据库中的用户与时区属性相关联。 听起来您的用户并没有改变他们的时区,如果有的话。
如果您尚未将位置与用户或用户组相关联,则应该不会太难。 只需添加时区信息及其位置,并在从您的输入创建 DateTime 对象时在代码中使用它。 这意味着有人必须管理多一条数据,但它比尝试通过代码自动检测时区要麻烦得多。
现在您正在添加新的时区,因此很容易错过转化。 我建议确保所有 DateTime 逻辑都是集中的(扩展方法或帮助程序类,具体取决于您的框架版本)。将所有转换和字符串格式保存在一个位置,并确保所有代码都引用它。
祝你好运,并围绕您的转换编写大量单元测试。