C# 通过更改字符串值输入,强制DateTime.TryParse为UTC

C# 通过更改字符串值输入,强制DateTime.TryParse为UTC,c#,datetime,C#,Datetime,我有一个配置文件,要求以特定格式输入日期: "StartDate": "2017-05-27" 此数字的使用方式如下: DateTime startDate; DateTime.TryParse(MyConfig.StartDate, out startDate); 我意识到,当它在不同时区的服务器上运行时,返回的日期时间可能不是UTC类型的,因此对该日期时间的进一步操作,如滴答声或其他,可能会导致时间扭曲 DateTime startDate; DateTime.TryParse("201

我有一个配置文件,要求以特定格式输入日期:

"StartDate": "2017-05-27"
此数字的使用方式如下:

DateTime startDate;
DateTime.TryParse(MyConfig.StartDate, out startDate);
我意识到,当它在不同时区的服务器上运行时,返回的日期时间可能不是UTC类型的,因此对该日期时间的进一步操作,如滴答声或其他,可能会导致时间扭曲

DateTime startDate;
DateTime.TryParse("2017-05-27", out startDate);

if(startDate.Kind == DateTimeKind.Utc)
{
    "Ohhh yeah".Dump();
}
else
{
    "EH OH".Dump();
}

startDate.Dump();
如果我将字符串更改为
“2017-05-27Z”
,则不会强制将其设置为
DateTimeKind.Utc
。。。因为它仍然输出“EH-OH”,但有趣的是,
startDate.Dump()
输出的时间确实会改变一个小时,但它的种类不会改变:(


如何强制将配置字符串正确解析为UTC DateTime?(在不更改TryParse代码的情况下,我知道它有一个种类说明符)-这可能是不可能的,但这就是问题所在…是:)

我认为您不能。我相信,您使用的
TryParse
重载是最早的重载之一,它早于
DateTimeKind
(在.NET 2.0中引入)的存在。将
种类
设置为除
本地
以外的任何内容都可能被认为是一个突破性的改变。感谢@Damien\u异教徒如果改用这个TryParseExact会发生什么<代码>DateTime.TryParseExact(“2017-06-06”,“yyyy-MM-dd”,null,datetimestyle.AssumeUniversal,out DateTime startDate)你也可以使用带有签名的TryParse。。。唉,我想通过在配置中添加Z来强制将其设置为UTC,从而避免使用更新的代码重新部署50多个客户端?在这种情况下,您可能还需要为日期字符串指定一个时间。因此,您可以尝试使用
2017-05-27 00:00:00Z
,而不是
2017-05-27Z
(ISO标准规定,Z应该晚于时间,而不是日期)