最近項目中遇到了一個問題,就是公司的一些電子商務站點的服務器在不同的國家,因此時間區域也不相同,但是後臺管理顯示訂單的時間都要一致,這就需要解決時間區域的問題。經過網上的搜索,發現了一個很不錯的討論關於這個話題。
http://topic.csdn.net/t/20021215/13/1262367.html
該帖子中有以爲作者提供了一個時間轉換的結構體:
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程序中,我稍微修改了一些,修改成了一個類,這樣就更方便使用了。
{
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)); }
}
}
在前端頁面使用的時候像這樣就可以了:
{
DateTime MyTime = DateTime.Now;
Response.Write("UTC時間:"+MyTime.ToUniversalTime().ToString()+"</br>");
Response.Write("本地時間:"+LostinetTimeZone.CN.ToString(MyTime)+"</br>");
Response.Write("美國時間:" + LostinetTimeZone.US.ToString(MyTime));
}