当kind为Utc时,从datetime UTC转换为datetimeoffset时出错

时间:2016-04-03 09:59:32

标签: c# datetime timezone datetimeoffset

将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;
        }

2 个答案:

答案 0 :(得分:6)

一些事情:

  • 如果您确实需要切换Kind的{​​{1}}而不调整其值,请使用DateTime。它比处理蜱更清洁。但是,我认为你真的不需要这样做。

  • 请勿使用DateTime.SpecifyKindToLocalTime。这两个都将在转换过程中使用服务器的时区设置。

  • 我不确定您的真实代码实际上是在解析字符串,因为您表示它来自数据库。如果它来自数据库,则不应涉及字符串解析。只需执行以下操作:

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