2012-11-01 56 views
3

为了给我的项目提供一个概述,我有一个ASP.NET WebForm应用程序,它允许用户登录和安排一个事件。事件处理由我为其编写Windows Service的本地Windows服务器处理和分派。处理时区的工作流建议

一切工作正常,除了我有一些客户从东海岸和一些从西海岸登录。

有人可以请建议一个可以处理时区差异的工作流程吗?每个客户端的时区信息已经存储在数据库中。 我只是困惑于如何应用时区信息。

我知道DateTimeToUniversalTime()方法,但它混淆了我它是如何工作的,因为它几乎似乎,这将需要知道DateTime结构是什么时区,以便能够将其转换成通用的时间和尽可能据我所知,一个DateTime结构没有内置到结构中的时区信息。

有人可以向我解释这个吗?

+0

wall'o '文本?你可以尝试使用一个或两个段落来使这更容易阅读吗? – Jasper

回答

1

如果事件计划发生一次,将其存储为DateTimeOffset或UTC DateTime将是有意义的。如果您将其存储为DateTimeOffset,仍然可以使用相关的偏移量将其显示给用户 - 实际上,您可以将其显示给其他时区中的人员,以他们的当地时间显示,或者以原始用户的当地时间指示它与观众的当地时间不一样(如果你明白我的意思)。

如果它是经常性的(例如“每天凌晨4点”),那么这还不够,因为它不考虑DST变化。相反,您应该存储本地时间以及时区标识符。见TimeZoneInfo.IdTimeZoneInfo.FindSystemTimeZoneById

这样明目张胆的插件,您不妨考虑使用Noda Time API作为一个相当更具表现力的替代内置的类型...

你几乎应该使用DateTime.ToUniversalTime(),作为它使用系统时区(即在您的服务器上),这几乎肯定是无关紧要的。

+0

这很有帮助。谢谢 – Icemanind

0

MSDN

的ToUniversalTime方法的日期时间值转换为本地时间 为UTC。要将非本地时区中的时间转换为UTC,请使用TimeZoneInfo.ConvertTimeToUtc(DateTime,TimeZoneInfo)方法 。要将 转换为与UTC的偏移量已知的时间,请使用ToUniversalTime 方法。

从.NET Framework 2.0版开始, ToUniversalTime方法返回的值由 当前DateTime对象的Kind属性确定。

DateTime上的默认值为Kind未指定,因此您的日期将假定为本地时间。

0

我们一直在研究类似的应用程序。我们将TimeZoneOffset和Scheduled Time存储在数据库表中。在客户端,TimeZOneOffset(分钟)考虑夏令时。它被计算如下:

Dim localZone As TimeZone = TimeZone.CurrentTimeZone 
    Dim StartTime As DateTime = UserEnteredStartDateTime 'from your web app 
    Dim TimeZoneOffset As Integer = localZone.GetUtcOffset(StartTime).TotalMinutes 

在服务器上的存储的过程包括选择是在预定开始时间内加上一个30秒的窗口如下行的where子句:

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()))