跨時間區域顯示相應區域時間的解決辦法

最近項目中遇到了一個問題,就是公司的一些電子商務站點的服務器在不同的國家,因此時間區域也不相同,但是後臺管理顯示訂單的時間都要一致,這就需要解決時間區域的問題。經過網上的搜索,發現了一個很不錯的討論關於這個話題。

http://topic.csdn.net/t/20021215/13/1262367.html

該帖子中有以爲作者提供了一個時間轉換的結構體:

 

using System;
    
    
public struct LostinetTimeZone
    
{
        
private TimeSpan ts;
        
public LostinetTimeZone(TimeSpan offsetHour)
        
{
            ts 
= offsetHour;
        }


        
public TimeSpan GetUtcOffset()
        
{
            
return ts;
        }



        
public DateTime ToLocalTime(DateTime dtUTC)
        
{
            
return dtUTC + ts;
        }

        
public DateTime ToUniversalTime(DateTime dtLocale)
        
{
            
return dtLocale - ts;
        }

        
public DateTime TransformFrom(DateTime dtAntherTimeZone, LostinetTimeZone antherTimeZone)
        
{
            
return ToLocalTime(antherTimeZone.ToUniversalTime(dtAntherTimeZone));
        }


        
public string ToString(DateTime dt)
        
{
            
//dt=dt.ToUniversalTime();//和下面是一樣的.   
            dt = dt - TimeZone.CurrentTimeZone.GetUtcOffset(dt) + ts;
            
return dt.ToString();
        }


        
//other   methods...   

        
public static LostinetTimeZone UTC
        
{
            
get return new LostinetTimeZone(TimeSpan.FromHours(+0)); }
        }

        
public static LostinetTimeZone UK
        
{
            
get return new LostinetTimeZone(TimeSpan.FromHours(+0)); }
        }

        
public static LostinetTimeZone CN
        
{
            
get return new LostinetTimeZone(TimeSpan.FromHours(+8)); }
        }

        
public static LostinetTimeZone US
        
{
            
get return new LostinetTimeZone(TimeSpan.FromHours(-5)); }
        }

        
//other   timezones...   
    }

    
class App
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            DateTime dt 
= DateTime.Now;

            Console.WriteLine(
"ToUniversalTime :" + dt.ToUniversalTime().ToString());
            Console.WriteLine(
"中國 :" + LostinetTimeZone.CN.ToString(dt));
            Console.WriteLine(
"英國 :" + LostinetTimeZone.UK.ToString(dt));
            Console.WriteLine(
"美國 :" + LostinetTimeZone.US.ToString(dt));

            Console.WriteLine();

            
//DateTime|TimeZone.ToUniversalTime   是個騙局:   
            Console.WriteLine(TimeZone.CurrentTimeZone.GetUtcOffset(dt).TotalHours);
            Console.WriteLine(TimeZone.CurrentTimeZone.GetUtcOffset(dt.ToUniversalTime()).TotalHours);

            Console.WriteLine();

            
//美國時間,上面已經顯示了   
            string 美國時間 = LostinetTimeZone.US.ToString(dt);
            DateTime dtUSA 
= DateTime.Parse(美國時間);

            
//從美國轉換過來?   

            
//1:   
            
//DateTime   dtUTC=LostinetTimeZone.美國.ToUniversalTime(dtUSA);   
            
//DateTime   dtCN=LostinetTimeZone.中國.ToLocalTime(dtUTC);   

            
//2:   
            DateTime dtCN = LostinetTimeZone.CN.TransformFrom(dtUSA, LostinetTimeZone.US);

            Console.WriteLine(
"美國時間:{0} = 中國時間:{1}", dtUSA.ToString("yyyy-MM-dd   HH-mm-ss"), dtCN.ToString("yyyy-MM-dd   HH-mm-ss"));
        }

    }
 

 

這個代碼是可以運行與FORM程序中,我稍微修改了一些,修改成了一個類,這樣就更方便使用了。

 

public class LostinetTimeZone
{
    TimeSpan ts;
    
public LostinetTimeZone(TimeSpan offsetHour)
    
{
        ts 
= offsetHour;
    }


    
public TimeSpan GetUtcOffset()
    
{
        
return ts;
    }


    
public DateTime ToLocalTime(DateTime dtUTC)
    
{
        
return dtUTC + ts;
    }

    
public DateTime ToUniversalTime(DateTime dtLocale)
    
{
        
return dtLocale - ts;
    }

    
public DateTime TransformFrom(DateTime dtAntherTimeZone, LostinetTimeZone antherTimeZone)
    
{
        
return ToLocalTime(antherTimeZone.ToUniversalTime(dtAntherTimeZone));
    }


    
public string ToString(DateTime dt)
    
{
        
//dt=dt.ToUniversalTime();//和下面是一樣的.   
        dt = dt - TimeZone.CurrentTimeZone.GetUtcOffset(dt) + ts;
        
return dt.ToString();
    }


    
public static LostinetTimeZone UTC
    
{
        
get return new LostinetTimeZone(TimeSpan.FromHours(+0)); }
    }

    
public static LostinetTimeZone UK
    
{
        
get return new LostinetTimeZone(TimeSpan.FromHours(+0)); }
    }

    
public static LostinetTimeZone CN
    
{
        
get return new LostinetTimeZone(TimeSpan.FromHours(+8)); }
    }

    
public static LostinetTimeZone US
    
{
        
get return new LostinetTimeZone(TimeSpan.FromHours(-5)); }
    }


}

 

在前端頁面使用的時候像這樣就可以了:

 

    protected void Page_Load(object sender, EventArgs e)
    
{   
        DateTime MyTime 
= DateTime.Now;
        Response.Write(
"UTC時間:"+MyTime.ToUniversalTime().ToString()+"</br>");
        Response.Write(
"本地時間:"+LostinetTimeZone.CN.ToString(MyTime)+"</br>");
        Response.Write(
"美國時間:" + LostinetTimeZone.US.ToString(MyTime));
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章