2012-11-01 45 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()))