Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理时区的工作流建议_C#_Asp.net_Timezone_Timezone Offset - Fatal编程技术网

C# 处理时区的工作流建议

C# 处理时区的工作流建议,c#,asp.net,timezone,timezone-offset,C#,Asp.net,Timezone,Timezone Offset,为了概述我的项目,我有一个ASP.NET WebForm应用程序,允许用户登录并安排活动。事件处理由本地Windows服务器处理和调度,我为其编写了Windows服务 一切都很好,除了我有一些客户从东海岸和西海岸登录 有人能为我如何处理时区差异提供一个可能的工作流程吗?时区信息已与每个客户端一起存储在数据库中。 我只是对如何应用时区信息感到困惑 我知道DateTime有一个ToUniversalTime()方法,但它的工作原理让我感到困惑,因为它几乎需要知道DateTime结构的时区,才能将其转

为了概述我的项目,我有一个ASP.NET WebForm应用程序,允许用户登录并安排活动。事件处理由本地Windows服务器处理和调度,我为其编写了Windows服务

一切都很好,除了我有一些客户从东海岸和西海岸登录

有人能为我如何处理时区差异提供一个可能的工作流程吗?时区信息已与每个客户端一起存储在数据库中。 我只是对如何应用时区信息感到困惑

我知道
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())) 

墙上的文字?你能试着用一两段文字让这篇文章更容易阅读吗?