北京时间为例

如果输入时间不带时区信息,会转为unspecified类型,该类型转Local时会当作当前为utc来处理,也就是会直接+8 ,而当要转utc时,则把当前时间当local,直接-8.

而输入时间带时区信息时,或者使用DateTime.Now获取时间时,会转为local,这个在进行local和utc转换时,不会出问题

            var time1 = DateTime.Parse("2018-10-29T19:00:00"); //不带时区信息
            var time2 = DateTime.Parse("2018-10-29T19:00:00.000009+08:00"); //带时区信息
            var time3 = Convert.ToDateTime(DateTime.Now.Year.ToString() + "-01-01");//不带时区信息
            var time4 = DateTime.Now; //带时区信息
            var time = DateTime.Now;
            Console.WriteLine(string.Format("time1:\r\nnow:{0}\r\nlocal:{1}\r\nutc:{2}\r\n", time1, time1.ToLocalTime(), time1.ToUniversalTime())); //转local要加8小时,转utc要减8小时
            Console.WriteLine(string.Format("time2:\r\nnow:{0}\r\nlocal:{1}\r\nutc:{2}\r\n", time2, time2.ToLocalTime(), time2.ToUniversalTime())); //当前时间即为local,转utc要减8小时
            Console.WriteLine(string.Format("time3:\r\nnow:{0}\r\nlocal:{1}\r\nutc:{2}\r\n", time3, time3.ToLocalTime(), time3.ToUniversalTime())); //转local要加8小时,转utc要减8小时
            Console.WriteLine(string.Format("time4:\r\nnow:{0}\r\nlocal:{1}\r\nutc:{2}\r\n", time4, time4.ToLocalTime(), time4.ToUniversalTime())); //当前时间为local,转utc要减8小时