作为连续Azure webjob的控制台应用程序不会以UTC格式转换Time.ToUniversalTime()

时间:2017-06-07 19:38:10

标签: c# azure utc azure-webjobs

我有一个简单的控制台应用程序在Azure中作为连续webjob运行,当我调试它时,在我转换时间时使用UTC提供正确的输出时间     new DateTime(Time).ToUniversalTime() 但是当我在webjob中运行它时,它仍然提供当地时间而不是通用时间。

long double

太平洋标准时间下午3:43

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

3 个答案:

答案 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);

另见C# DateTime to UTC Time without changing the time

答案 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门户网站上更改了网站的时区。谢谢你的帮助。