【发布时间】:2015-09-29 14:28:53
【问题描述】:
无论出于何种愚蠢的原因,我在处理时区时仍然感到困惑。
创建记录时,我使用:
getutcdate()
例如,它存储在 datetimeoffset 列中,如下所示:
2015-07-03 20:44:21.0300000 +00:00
所以没有偏移,只是原始的 UTC。
现在,在服务器代码中,我想做一些事情...我有一个查询,它只获取为特定用户发布的文章的 CreatedDate。我将其存储在数据表中:
Dim tz as TimeZoneInfo = GetUserTZInfo(User)
Dim dt as DataTable = GetArticleDates(User)
Dim MaxArticles As Integer = 5
Dim PostedThisMonth As Integer
Dim Remaining As Integer
我将用户限制为每月发布 5 篇文章,因此您可以根据用户的时区查看在月初或月底的时间可能会不稳定的地方。明天在某个地方,但在任何地方都是同一时刻。
但我希望它是用户友好的,并且只是基于用户,而不是服务器时间。
由于我的数据类型为 datetimeoffset
,我在使用一些转换为当地时间的示例时遇到了困难任何人都可以就如何实现以下目标提出最佳实践/方法:
- 在 dt 中搜索任何等于用户月份的创建日期。
- 根据找到的内容生成 PostedThisMonth 的计数。
像我说的唯一的粘性区域是在月初或月底...基本上是 12 小时窗口,然后当然是 DST,但我不太关心。
【问题讨论】:
-
只需使用日期数学并根据用户时区进行调整。您在某个地方有用户时区吗?
-
@SeanLange 我愿意。我向您展示的示例函数为用户返回一个 TimeZoneInfo 对象。
-
在数据库中这样做不是更有意义吗?否则,您必须返回所有信息,然后对其进行过滤。首先只返回您想要的数据会更有效。
-
数据库中没有存储偏移量。从技术上讲,我只是查询前 5 个 desc,因此查询很小,但例如,如果它接近月底的午夜,对于某些人来说,它已经是下个月了,尽管对每个人来说都是同一时间。天哪,这让人困惑。
-
那么你怎么知道给定用户使用什么偏移量?你似乎比实际情况更难做到这一点。如果用户偏移量为 +5,那么您只需在存储的日期上增加 5 小时,即可根据他们的偏移量获得相同的时间范围。
标签: asp.net sql-server vb.net timezone timezone-offset