2012-06-30 51 views
1

我在理解如何將用戶當前日期和時間與服務器時間相匹配時遇到了一些問題。ASP.NET將用戶本地日期和時間與系統時間相匹配

示例:假設我有一個網站,用戶可以在其中註冊自己。一個配置文件選項是他們可以選擇他們的本地時區。爲此,有一個下拉菜單,他們可以從中選擇正確的時區。所以來自中國的用戶可能會選擇(UTC + 08:00)北京,重慶,香港,烏魯木齊,洛杉磯的另一位用戶將選擇(UTC-07:00)Mountain Time(美國&加拿大)(我假設)和一個來自巴黎的傢伙將選擇(UTC + 01:00)布魯塞爾,哥本哈根,馬德里,巴黎。

Web應用程序在美國與它的服務器上運行的具體時間段......

現在...所有這些用戶都希望在19:00 當地的時間來接收下週五的電子郵件通知區域 !!!

在這裏,我輸了...絕對是下週五19:00是不是在同一時間爲所有這些用戶...

我該如何映射他們的個人資料時區,所以在服務上運行我的網站將在下週五19:00用戶的當地時區發送電子郵件通知?

我現在正處於這個階段......使用所有時區填充下拉菜單,以便用戶可以在其個人資料中選擇當前時區。

當頁面加載的比下拉列表填充了時區:

protected void Page_Load(object sender, EventArgs e) 
    { 
     ddlUserTimeZone.DataSource = GetTimeZones(); 
     ddlUserTimeZone.DataTextField = "Name"; 
     ddlUserTimeZone.DataValueField = "ID"; 
     ddlUserTimeZone.DataBind(); 
    } 

    public Collection<TimeZoneItem> GetTimeZones() 
    { 
     Collection<TimeZoneItem> timeZones = new Collection<TimeZoneItem>(); 
     foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones()) 
     { 
      timeZones.Add(new TimeZoneItem 
      { 
       TimeZoneName = timeZoneInfo.DisplayName, 
       TimeZoneID = timeZoneInfo.Id 
      }); 

     } 

     return timeZones; 
    } 

    public struct TimeZoneItem 
    { 
     public string TimeZoneName { get; set; } 
     public string TimeZoneID { get; set; } 
    } 

現在,你們可以與當前時間的曲線時區的匹配有助於使電子郵件的發送正確的時間?

在此先感謝!

+0

順便說,洛杉磯是美國在太平洋時區,而不是山。 –

回答

2

你剛剛設置這項服務?如果是這樣,以協調世界時(UTC或Zulu)時間運行您的Web服務器和數據庫服務器,而不是本地時區。如果你這樣做,一切都更容易管理。我經過慘痛的教訓才學到這個。

UTC曾被稱爲格林威治標準時間;它是時區+00:00。它不會像美國和歐洲當地時間那樣改變夏令時。

這個時區的東西是一種痛苦,值得正確。一些國家有半小時時區。無論如何,一旦你知道了每個用戶的首選時區,以及她想要通知的時間,就可以將時間從本地轉換爲UTC並存儲它。

嘗試這樣的事情來獲取用戶的小時和分鐘到UTC。 (時區轉換需要一個日期,因爲它們依賴於夏令時規則,還有一個複雜因素:在時區從日光切換到標準時(反之亦然),通知的UTC時間將發生變化。通過在發送每個通知時重新計算下一個通知(明天的通知)的UTC日期和時間來處理此問題。請考慮此代碼。

TimeZoneInfo userLocal =   ;//user's time zone 
int hour =       ;//whatever the user wants 
int minute =      ;//whatever the user wants 

DateTime tomorrow = DateTime.Now.AddDays(1); 
int year = tomorrow.Year; 
int month = tomorrow.Month; 
int day = tomorrow.Day; 
DateTime notificationTime = new DateTime(year,month,day, 
             hour,minute,0, 
             DateTimeKind.Unspecified); 
DateTime tomorrowNotificationTime = TimeZoneInfo.ConvertTimeToUtc(
             notificationTime,userLocal); 

這應該讓你獲得UTC時間,你需要明天發送此用戶的通知,在明天的日期的正確時區。

0

DateTime理想情況下應該以UTC格式存儲在服務器上。

您有以下數據服務器上的用戶的

  • 時區信息。
  • 用戶需要通知的時間。
  • 服務器上的當前本地時間。

    // Convert current local server time to UTC. 
    var serverUtc = DateTime.UtcNow; 
    
    // Convert UTC time to users local time. This gives you the date and time as per the user. 
    var userTimeZone = TimeZoneInfo.GetSystemTimeZones()[0]; // just an example. Replace with actual value. 
    var userCurrentTime = TimeZoneInfo.ConvertTime(serverUtc, userTimeZone); 
    
    /* 
    add a day to userCurrentTime till its Friday. Add/subtract minutes till its 7:00PM. 
    */ 
    
    var expectedNotificationTimeUtc = TimeZoneInfo.ConvertTimeToUtc(userCurrentTime, userTimeZone); 
    /* 
    1. store the expectedNotificationTimeUtc as the time you want to send the email. 
    2. your service can check for users their expectedNotificationTimeUtc and 
        if the UtcNow is within an acceptable range of the that time, send the email. 
    */ 
    
相關問題