最近项目中遇到了一个问题,就是公司的一些电子商务站点的服务器在不同的国家,因此时间区域也不相同,但是后台管理显示订单的时间都要一致,这就需要解决时间区域的问题。经过网上的搜索,发现了一个很不错的讨论关于这个话题。
该帖子中有以为作者提供了一个时间转换的结构体:
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)); } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oyjd614/archive/2007/11/18/1891271.aspx
|
|