【发布时间】:2011-11-14 23:05:19
【问题描述】:
我在会话中将用户的时区存储为小数。例如,如果用户在 EST 时区,我会有
UserTimeZone = -5.00;
数据库中的数据以 UTC 格式存储,因此我想计算该用户一天的开始和结束时间,以便当用户想要特定日期的数据时,记录会调整时区。
这就是我正在做的:
DateTime StartDate = DateTime.Now.ToUniversalTime();
StartDate = StartDate.AddHours((double)UserTimeZone);
StartDate = StartDate.Date;
StartDate = StartDate.AddHours((double)UserTimeZone);
DateTime EndDate = StartDate.AddHours(24);
我遇到的问题是,这没有考虑夏令时,所以即使认为 EST 时间比 UTC 晚 5 小时,由于夏令时的转变,目前实际上比 UTC 晚 4 小时。
您有什么建议?谢谢。
【问题讨论】:
-
我认为只有时间偏移就足够了,请查看
TimeZone/TimeZoneInfo -
不要使用 DateTime.Now.ToUniversalTime(),使用 DateTime.UtcNow
-
并非所有时区都是整数偏移量,因此即使您切换到从浏览器获取偏移量,您也需要使用比 int 更好的东西。
-
我没有使用 int,我使用的是小数。我检查了一下,发现 ToUniversalTime() 和 DateTime.UtcNow 之间没有任何区别,即使将计算机的日期更改为 12 月的某个时间也是如此。
-
使用 Decimal 很好,但还不够……您是否只存储每个 User 的偏移量?这还不够-您需要存储此偏移量是否包括夏令时...两者(偏移量以及偏移量是否包括DS)都可以构建一个工作算法(尽管不是100%一致-最好是存储一个真实的时区每个用户!),否则不是 :-(