我有一个简单的控制台应用程序在Azure中作为连续webjob运行,当我调试它时,在我转换时间时使用UTC提供正确的输出时间 new DateTime(Time).ToUniversalTime() 但是当我在webjob中运行它时,它仍然提供当地时间而不是通用时间。
long double
Kudu console(webjob):6/7/2017 3:38:46 PM 6/7/2017 10:43:52 PM
on local Console:6/7/2017 10:38:46 PM 6/7/2017 10:43:52 PM
答案 0 :(得分:3)
行为是设计使然,与Azure无关。当你写
var dt = new DateTime(2017, 05, 23, 8, 00, 00, 0);
它将其视为当地时间。因此,您当然会根据您所在计算机的时区获得不同的UTC时间(在Azure VM的情况下,它与UTC时间相同)。
要将您输入的时间视为UTC,您需要写:
var dt2 = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
答案 1 :(得分:0)
试过这个Console.WriteLine(new DateTime(2017,05,23,8,50,00,0).ToUniversalTime()+"" + DateTime.Now.ToUniversalTime());在本地控制台:5/23/2017 3:00:Kudu控制台:5/23/2017 8:00:00 AM 6/7/2017 11:04:23 PM 00 PM 6/7/2017 11:04:23 PM
本地和Azure Web App实例之间的区别在于Azure Web App实例中的默认时区是UTC。根据您的测试结果,您当地的时区是UTC + 07:00。如果按年/月/日/小时/月/分钟创建DateTime的新实例,它将使用系统的默认时区。
建议不要将日期时间保存为使用此格式的字符串'年/月/日/小时/月/分钟'。它会丢失时区信息。如果您的代码在具有不同时区的计算机上运行,则会导致一些问题。
如果您确实需要将日期时间信息存储在字符串中,则可以使用时区符号存储日期时间信息(例如2017,05,23,8,50,00.00 UTC + 07:00)。要从字符串中获取日期时间,我们需要添加偏移小时数。
var dateTime = new DateTime(2017, 05, 23, 8, 00, 00, 0, DateTimeKind.Utc).AddHours(7);
或者您可以在保存之前将datetime转换为GMC时间。之后,您可以使用DateTimeKind参数创建DateTime的新实例。
var dateTime = new DateTime(2017, 05, 23, 8, 00, 00, 0, DateTimeKind.Utc);
答案 2 :(得分:0)
我在Azure门户网站上更改了网站的时区。谢谢你的帮助。