C# 处理时区的工作流建议
为了概述我的项目,我有一个ASP.NET WebForm应用程序,允许用户登录并安排活动。事件处理由本地Windows服务器处理和调度,我为其编写了Windows服务 一切都很好,除了我有一些客户从东海岸和西海岸登录 有人能为我如何处理时区差异提供一个可能的工作流程吗?时区信息已与每个客户端一起存储在数据库中。 我只是对如何应用时区信息感到困惑 我知道C# 处理时区的工作流建议,c#,asp.net,timezone,timezone-offset,C#,Asp.net,Timezone,Timezone Offset,为了概述我的项目,我有一个ASP.NET WebForm应用程序,允许用户登录并安排活动。事件处理由本地Windows服务器处理和调度,我为其编写了Windows服务 一切都很好,除了我有一些客户从东海岸和西海岸登录 有人能为我如何处理时区差异提供一个可能的工作流程吗?时区信息已与每个客户端一起存储在数据库中。 我只是对如何应用时区信息感到困惑 我知道DateTime有一个ToUniversalTime()方法,但它的工作原理让我感到困惑,因为它几乎需要知道DateTime结构的时区,才能将其转
DateTime
有一个ToUniversalTime()
方法,但它的工作原理让我感到困惑,因为它几乎需要知道DateTime
结构的时区,才能将其转换为世界时,据我所知,DateTime
结构没有将时区信息构建到结构中
有人能给我解释一下吗?如果事件计划只发生一次,那么将其存储为
日期时间偏移量
,或UTC日期时间
。如果您将其存储为日期时间偏移量
,您仍然可以使用相关偏移量将其显示给用户-事实上,您可以将其显示给其他时区的人,作为他们的本地时间,或者作为原始用户的本地时间,并带有一个指示器,指示它与观众的本地时间不同(如果您明白我的意思的话)
如果它是经常性的(例如“每天早上4点”),那么这是不够的,因为它不会考虑DST的变化。相反,您应该存储本地时间和时区标识符。请参见TimeZoneInfo.Id
和TimeZoneInfo.FindSystemTimeZoneById
作为一个明显的插件,您可能希望使用API作为内置类型的一个更具表现力的替代品
您几乎肯定不应该使用DateTime.ToUniversalTime()
,因为它使用的是系统时区(即在您的服务器上),这几乎肯定是不相关的。来自:
ToUniversalTime方法从本地时间转换日期时间值
到UTC。要将非本地时区中的时间转换为UTC,请使用
ConvertTimeToUtc(日期时间,TimeZoneInfo)方法。到
转换与UTC的偏移量已知的时间,使用ToUniversalTime
方法
从.NET Framework 2.0版开始,返回的值
ToUniversalTime方法由
当前日期时间对象
DateTime上的默认值未指定,因此您的日期将假定为本地时间。我们一直在开发类似的应用程序。我们将时区偏移和计划时间存储在数据库表中。在客户端,时区偏移(以分钟为单位)考虑了夏令时。其计算如下:
Dim localZone As TimeZone = TimeZone.CurrentTimeZone
Dim StartTime As DateTime = UserEnteredStartDateTime 'from your web app
Dim TimeZoneOffset As Integer = localZone.GetUtcOffset(StartTime).TotalMinutes
SELECT Invitations.ID, Invitations.OrganizerName, Invitations.OrganizerEmail, Invitations.EMailBody, Invitations.[Subject]
FROM Invitations
WHERE (Invitations.MailSent=0)
And (Invitations.SendTime Between DateAdd(mi,Invitations.TimeZOneOffset,GETUTCDATE())
And DateAdd(s,(Invitations.TimeZoneOffset*60)+30,GETUTCDATE()))
服务器上的存储过程包括where子句,该子句选择在计划的开始时间加上30秒窗口内的行,如下所示:
Dim localZone As TimeZone = TimeZone.CurrentTimeZone
Dim StartTime As DateTime = UserEnteredStartDateTime 'from your web app
Dim TimeZoneOffset As Integer = localZone.GetUtcOffset(StartTime).TotalMinutes
SELECT Invitations.ID, Invitations.OrganizerName, Invitations.OrganizerEmail, Invitations.EMailBody, Invitations.[Subject]
FROM Invitations
WHERE (Invitations.MailSent=0)
And (Invitations.SendTime Between DateAdd(mi,Invitations.TimeZOneOffset,GETUTCDATE())
And DateAdd(s,(Invitations.TimeZoneOffset*60)+30,GETUTCDATE()))
墙上的文字?你能试着用一两段文字让这篇文章更容易阅读吗?