2008-08-22 30 views
3

我正在編寫一個程序,需要每小時發送一次電子郵件,但是在用戶本地。如何在用戶本地時間在.NET/Sql Server中發送電子郵件?

說我有2個用戶在不同的時區。約翰在紐約,弗雷德在洛杉磯。服務器在芝加哥。如果我想在每個用戶的本地下午6點發送一封電子郵件,我必須在下午7點服務器發送電子郵件給John,並在下午4點服務器發送電子郵件給Fred。

在.NET/Sql Server中對此有什麼好的方法?我發現了一個包含所有時區信息的xml文件,所以我正在考慮編寫一個腳本將其導入數據庫,然後查詢它。

編輯:我使用了「t4znet.dll」,並在.NET端進行了所有比較。

回答

0

你有兩個選擇:

  • 儲存調整時間的郵件操作到數據庫中爲每個用戶。然後只需比較服務器時間和存儲時間。爲避免混淆和可移植性問題,我會將所有時間存儲在UTC中。所以,在SERVER_UTC_TIME()== storedUtcTime時發送郵件。
  • 將每個郵件操作的本地時間存儲到數據庫中,然後即時轉換。 SERVER_UTC_TIME()== TO_UTC_TIME(storedLocalTime,userTimeZone)時發送郵件。

你應該決定什麼對你的應用最有意義。例如,如果所有用戶的郵寄時間始終相同,則使用選項(2)更有意義。如果事件時間可以在用戶之間甚至每個用戶之間改變,那麼如果您選擇選項(1),則可能會使開發和調試更容易。無論哪種方式,你都需要知道用戶的時區。

*這些函數調用顯然是僞的,因爲我不知道它們在T-SQL中的調用,但它們應該存在。

0

我是一名PHP開發人員,因此我將分享我從PHP獲悉的信息。我相信.NET會包含類似的東西。

在PHP中,您可以獲得服務器時間的時區差異 - 就像您建議您在服務器上的不同時間發送電子郵件一樣。

每次添加用戶時,都要保存它們從服務器時間(或其時區以防服務器時區更改)的時間偏移量。

然後,當您指定更新時,請爲每小時運行一次自動化任務(Cron for LAMP人員),以檢查是否需要發送電子郵件。直到沒有電子郵件發送。

0

你可以用這篇優秀的文章「World Clock and the TimeZoneInformation class」來補充你的解決方案,我做了一個web服務,發送一個包含本地和接收者時間的信息的文件,我所做的就是修改這個類,以便我可以處理這個問題,它完美無缺,完全按照我的需要。

我想你可以帶上這個課程,從表格「用戶」那裏得到它們的時區,並「計算」適當的時間,我的代碼就是這樣的;

//Get correct destination time 
DateTime thedate = DateTime.Now; 

string destinationtimezone = null; 

//Load the time zone where the file is going 
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone); 

//Calculate 
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString(); 

此類具有Windows Vista中崩潰的問題「的fromIndex(INT指數)」的功能,但你可以修改代碼,而不是使用功能:

public static TimeZoneInformation FromIndex(int index) 
    { 
     TimeZoneInformation[] zones = EnumZones(); 

     for (int i = 0; i < zones.Length; ++i) 
     { 
      if (zones[i].Index == index) 
       return zones[i]; 
     } 

     throw new ArgumentOutOfRangeException("index", index, "Unknown time zone index"); 
    } 

你可以改變它至;

public static TimeZoneInformation FromName(string name) 
    { 
     TimeZoneInformation[] zones = EnumZones(); 

     foreach (TimeZoneInformation tzi in zones) 
     { 
      if (tzi.DisplayName.Equals(name)) 
       return tzi; 
     } 

     throw new ArgumentOutOfRangeException("name", name, "Unknown time zone name"); 
    } 
相關問題