先来看一段代码:

DateTime time = DateTime.Parse("2013-07-05 00:00:00");
Console.WriteLine(time.ToUniversalTime()); //2013/7/4 16:00:00
Console.WriteLine(time.ToLocalTime()); //2013/7/5 8:00:00


这让人搞不清楚DateTime的类型,当调用ToUniversalTime方法时,它似乎是本地时间,但调用ToLocalTime方法时,它又变成了世界标准时间(UTC) 。DateTime有个只读属性Kind,指示时间类型,输出看下:

Console.WriteLine(time.Kind); //DateTimeKind.Unspecified


DateTimeKind.Unspecified表示时间既未指定为本地时间,也未指定为世界标准时间 -_-#,好在,C#有提供方法让指定DateTime类型:

DateTime time = DateTime.SpecifyKind(DateTime.Parse("2013-07-05 00:00:00"), DateTimeKind.Local);
Console.WriteLine(time.ToUniversalTime()); //2013/7/4 16:00:00
Console.WriteLine(time.ToLocalTime()); //2013/7/5 0:00:00


这样声明一个本地时间显然比较麻烦,平时大都使用本地时间,不明白为什么不默认为本地时间,相比之下,Javascript就比较人性化,它的Date对象总是本地时间:

var time = new Date("2013-07-05 00:00:00");
document.writeln(time.toUTCString()); //Thu, 04 Jul 2013 16:00:00 GMT
document.writeln(time.toLocaleString()); //2013年7月5日 上午12:00:00
 
 
 

C# 时间时区转换

服务器在北美,用户在澳洲,c# sql 写入时间用的是 datetime.now ,读取的时候怎么把时间转换为 当地时间?

 比如我从服务器取出的时间是这样的:2014-12-04 11:59:51

展现给用户要是这样的:2014-12-04 15:00:00

由于截图先后顺序问题,澳洲那边的时间现在应该是和国内时间 分钟 是一样的。

请问大侠,C# 内,时区转换怎么写(算上夏时令和冬时令)?

最佳答案

你先转换成UTC时间,然后再用utc时间转换成当地时间。

DateTime st = DateTime.UtcNow;  //如果DateTime.Now.Kind==ateTimeKind.Unspecified,那就需要先DateTime time = DateTime.SpecifyKind(DateTime.Now.ToString(), DateTimeKind.Local);转换成本地时间,然后再转成UtcNow
Console.WriteLine(st.ToLocalTime());