分享

跨时间区域显示相应区域时间的解决办法

 抓不住幸福 2010-11-10
最近项目中遇到了一个问题,就是公司的一些电子商务站点的服务器在不同的国家,因此时间区域也不相同,但是后台管理显示订单的时间都要一致,这就需要解决时间区域的问题。经过网上的搜索,发现了一个很不错的讨论关于这个话题。
该帖子中有以为作者提供了一个时间转换的结构体:
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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约