将UTC中的DateTime转换为DateTimeOffset时出错 什么时候是Utc。 origDateTime来自webservice,因此我无法控制内容或格式。 在大多数情况下,它带有Kind =未指定(甚至在Utc中的时间很难)然后它正在工作,但在极少数情况下Kind = Utc然后转换为DateTimeOffset引发异常: “Utc DateTime实例的UTC偏移量必须为0. \ r \ nParameter name:offset” 我该如何解决?
try {
//cause error !!!!
DateTime databaseUtcTime = DateTime.Parse("4/2/2016 6:25:20 PM");
var localTimeTemp = databaseUtcTime.ToLocalTime();
DateTime origDateTime = localTimeTemp.ToUniversalTime();
//this is working
//DateTime origDateTime = DateTime.Parse("4/2/2016 6:25:20 PM");
string timeZoneName = "Pacific Standard Time";
TimeZoneInfo localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTimeOffset localTime = new DateTimeOffset(origDateTime, localTimeZone.GetUtcOffset(origDateTime));
return localTime;
}
catch (Exception ex) {
string msg = ex.Message;
return null;
}
答案 0 :(得分:6)
一些事情:
如果您确实需要切换Kind
的{{1}}而不调整其值,请使用DateTime
。它比处理蜱更清洁。但是,我认为你真的不需要这样做。
请勿使用DateTime.SpecifyKind
或ToLocalTime
。这两个都将在转换过程中使用服务器的时区设置。
我不确定您的真实代码实际上是在解析字符串,因为您表示它来自数据库。如果它来自数据库,则不应涉及字符串解析。只需执行以下操作:
ToUniversalTime
获得输入后,您可以使用DateTime databaseUtcTime = (DateTime) yourDataReader["YourDataField"];
函数进行转换。您现有的代码无法正确转换时间,只是在没有正确调整时间值的情况下指定偏移量。
由于您希望输出为TimeZoneInfo.ConvertTime
,因此最简单的方法是首先将输入datetimeoffset
转换为datetime
,使偏移为零(因为它来自UTC )。
datetimeoffset
然后转换起来相当简单:
DateTimeOffset dtoUtc = new DateTimeOffset(databaseUtcTime, TimeSpan.Zero);
答案 1 :(得分:1)
如果您始终将query("SystemWebView css:'*'")
设置为DateTimeKind
,那么您的问题将会得到解决,不是吗?
试试这个:
Unspecified
与您的示例集成:
DateTime origDateTime = new DateTime(origDateTimeUnspecifiedKind.Ticks, DateTimeKind.Unspecified);