2013-04-17 36 views
1

我有一個在線圖書銷售網站,管理和實體書店位於印度,但服務器託管在美國服務器上。 管理員要求創建成功訂單的報告,並在上午11:00和下午4:00每天兩次向他發送郵件。我如何計算從給定時間不同的時區

上午11時,他應該得到放在下午4:00(前一天)和11之間的命令列表:上午(當天)

下午4時,他應該得到安置11之間的順序列表:00(當天)下午4:00(當日)

爲了實現它,我創建了適用於該映射記錄一樣,如果頁面被稱爲在n次則應之間生成報告表x和z時間。

在頁面加載我正在採取當前時間,並得到的時間。 正在使用的代碼如下

DateTime dt = DateTime.Now;//getting server time 
    DateTime gmttime = DateTime.Now.ToUniversalTime();//getting gmt time 
    DateTime indiantime = gmttime.AddHours(5).AddMinutes(30);//get india time(is always constant dont follows daylight saving) 
    TimeSpan diff = dt-indiantime; // calculating the difference 

    string runH = indiantime.ToString("%h"); // geting the hour component of india time 
    string runTT = indiantime.ToString("tt"); //getting ap/pm component of india time 
    string indiantimeformat = "dd/MM/yyyy h:m tt"; 
    CultureInfo c = System.Globalization.CultureInfo.InvariantCulture; 
    string q = "SELECT frmH,frmTT,infrmprevious,toH,toTT,intoprevious FROM successfullordermailtiming WHERE runH = '"+runH+"' AND runTT = '"+runTT+"'"; //quering the database for getting from and when 
    DataTable ddt = dtu.Table(q); 
    if (ddt.Rows.Count>0) 
    { 
     object[] ob = ddt.Rows[0].ItemArray; 
     string frmH= ob[0].ToString(); 
     string frmTT=ob[1].ToString(); 
     string infrmprevious=ob[2].ToString(); 

     string toH =ob[3].ToString(); 
     string toTT =ob[4].ToString(); 
     string intoprevious = ob[5].ToString(); 
     DateTime indianfrom = indiantime; 
     if (infrmprevious == "1") 
     { 
       indianfrom = indiantime.AddDays(-1); // if previous the substract 1 day 
     } 
     DateTime indianto = indiantime; 
     if (intoprevious == "1") 
     { 
       indianto = indianto.AddDays(-1); 
     } 
     //make indian frm 
     string indianfrm = indianfrom.ToString("dd/MM/yyyy") + " " + frmH + ":0 " + frmTT; //making from india time 
     string indiantoo = indianto.ToString("dd/MM/yyyy") + " " + toH + ":0 " + toTT; //making to india time 
     indianfrom = DateTime.ParseExact(indianfrm, indiantimeformat, System.Globalization.CultureInfo.InvariantCulture); 
     indianto = DateTime.ParseExact(indiantoo, indiantimeformat, System.Globalization.CultureInfo.InvariantCulture); 

     DateTime serverfrm = indianfrom + diff; //calculating frm servertime 
     DateTime serverto = indianto + diff; //calculating to server time 

此代碼被正確工作到上圍繞4月12日調整有夏令時(丹佛(MDT))服務器位置。

請告訴我我錯了什麼?自格林威治標準時間以來我就假定時間總是不變,我計算gmt時間,然後印度時間,然後從服務器時間減去印度時間(差異)。我使印度時間frm和數據庫中的組件,然後再次添加計算差異以獲得相應的服務器時間..是我的邏輯錯誤。我讀到了關於節省日光的問題,但是由於我的國家不遵循它,我發現它實際上意味着什麼很難(它說一天可以是23小時或25小時)。請糾正我。

+0

查看相關問題http://stackoverflow.com/questions/4209337/c-sharp-timezone-calculation-problem – user1929959

+0

提及的時間(*上午11點和下午4點*)是在哪個時區,你如何存儲你的數據庫中的值? – V4Vendetta

+0

上午11點和下午4點在印度時間(+5:30)日期時間值僅存儲在服務器時間。 – Ratna

回答

1

你可以參考下面的代碼:

 var varLondon = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");//Returns Timezone based on particular ID, ID can be related to pasific timezone, Indian TimeZone,etc. 
     var varGoogleplex = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
     var now = DateTimeOffset.UtcNow; //Gives you local clock time for your currrent time zone 
     TimeSpan TSLondonOffset = varLondon.GetUtcOffset(now); //will return you timespan of current time zone and specified one. 
     TimeSpan TSGoogleplexOffset = varGoogleplex.GetUtcOffset(now); 

希望它有幫助。

+0

你可以通過評論來詳細說明你的代碼嗎?我真的覺得日期時間很難理解。 – Ratna

+0

@Ratna創造它。 – Freelancer