C# 控制台应用程序作为连续Azure webjob不转换UTC中的Time.ToUniversalTime()

C# 控制台应用程序作为连续Azure webjob不转换UTC中的Time.ToUniversalTime(),c#,azure,utc,azure-webjobs,C#,Azure,Utc,Azure Webjobs,我有一个简单的控制台应用程序,在Azure中作为连续的webjob运行,当我调试时在本地运行,当我使用 新日期时间(Time).ToUniversalTime() 但当我在webjob中运行它时,它仍然给出本地时间而不是世界时间 Console.WriteLine(MyData.Time.ToUniversalTime()+“”+DateTime.Now.ToUniversalTime()) 太平洋标准时间下午3:43 Kudu控制台(webjob):2017年6月7日下午3:38:46 201

我有一个简单的控制台应用程序,在Azure中作为连续的webjob运行,当我调试时在本地运行,当我使用 新日期时间(Time).ToUniversalTime() 但当我在webjob中运行它时,它仍然给出本地时间而不是世界时间

Console.WriteLine(MyData.Time.ToUniversalTime()+“”+DateTime.Now.ToUniversalTime())

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

Kudu控制台(webjob):2017年6月7日下午3:38:46 2017年6月7日晚上10:43:52


在本地控制台上:2017年6月7日10:38:46 PM 2017年6月7日10:43:52 PM

该行为是设计的,与Azure无关。当你写作时

var dt = new DateTime(2017, 05, 23, 8, 00, 00, 0);
它把它当作当地时间。因此,当然,根据您所在机器的时区,您会得到不同的UTC时间(在Azure虚拟机的情况下,恰好与UTC时间相同)

要将输入的时间视为UTC,您需要编写:

var dt2 = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
另见

尝试了此控制台。WriteLine(新的日期时间(2017,05,23,8,00,00,0)。ToUniversalTime()+“”+DateTime.Now.ToUniversalTime());即使这样,在Kudu控制台上也没有给出预期结果,在Kudu控制台上:2017年5月23日上午8:00:00 2017年7月6日下午11:04:23在本地控制台上:2017年5月23日下午3:00:00 2017年7月6日下午11:04:23

本地和Azure Web App实例之间的区别在于Azure Web App实例中的默认时区为UTC。根据测试结果,本地计算机上的时区为UTC+07:00。如果按年/月/日/小时/月/分钟创建DateTime的新实例,它将使用系统的默认时区

不建议将日期时间保存为“年/月/日/小时/月/分钟”格式的字符串。它将丢失时区信息。如果您的代码在具有不同时区的计算机上运行,则会导致一些问题

如果确实需要以字符串形式存储日期时间信息,则可以使用时区符号(例如2017、05、23、8、00、00、00 UTC+07:00)存储日期时间信息。要从字符串中获取datetime,我们需要添加偏移小时数

var dateTime = new DateTime(2017, 05, 23, 8, 00, 00, 0, DateTimeKind.Utc).AddHours(7);
或者,您可以在保存日期时间之前将其转换为GMC时间。之后,可以使用DateTimeKind参数创建DateTime的新实例

var dateTime = new DateTime(2017, 05, 23, 8, 00, 00, 0, DateTimeKind.Utc);

我在Azure portal上更改了网站的时区。谢谢你的帮助

请尝试根据隔离到非WebJobs repo。另外,您在Azure中看到的具体本地时间是什么?默认情况下,Azure VMs上的本地时间是UTC。即使我将本地时间(即UTC中的PST)转换为UTC,它仍然以PST显示时间。。其中,如果我在本地运行转换后的时间显示(UTC)。请按照建议尝试隔离。尝试隔离后,它仍在PST中显示时间。您可以添加您正在使用的完整控制台应用程序测试代码吗?另外,您是否在Azure Web应用程序中将时区设置为非默认值?我以本地时间获取数据的时间,因此我需要将其转换为世界时,然后将其类型指定为Utc,如下所示:因此在Azure中,我希望我的时间为Utc,即
LocalTime=new DateTime(2017,05,23,8,00,00,0)应打印出2017年5月23日下午3:00:00,以实现此
var dt=新日期时间(2017年5月23日8:00,00,0);var dt2=DateTime.SpecifyKind(dt.ToUniversalTime(),DateTimeKind.Utc)应该正常工作吗?您说您在本地时间获取数据,但没有指定时区。如果没有明确时区,你就无法有意义地与当地时间合作。如果要将web应用设置为使用特定的本地时区,请选择user。我更改了网站的时间。谢谢你的帮助。既然你的问题已经解决了,请将有用的回复标记为答案。它将帮助其他人快速发现并解决类似问题。