private static DateTime SwitchToUtcTime(DateTime value, UnspecifiedDateTimeHandling dateTimeHandling)
        {
            switch (value.Kind)
            {
            case DateTimeKind.Unspecified:
                if (dateTimeHandling == UnspecifiedDateTimeHandling.AssumeUtc)
                {
                    return(new DateTime(value.Ticks, DateTimeKind.Utc));
                }
                else
                {
                    return(new DateTime(value.Ticks, DateTimeKind.Local).ToUniversalTime());
                }

            case DateTimeKind.Utc:
                return(value);

            case DateTimeKind.Local:
                return(value.ToUniversalTime());
            }
            return(value);
        }
 public static DateTime EnsureDateTime(DateTime value, TimeZoneInfo timeZone, DateTimeHandling dateTimeHandling, UnspecifiedDateTimeHandling unspecifiedDateTimeHandling)
 {
     if (dateTimeHandling == DateTimeHandling.Utc)
     {
         if (timeZone == null)
         {
             return(SwitchToUtcTime(value, unspecifiedDateTimeHandling));
         }
         return(SwitchToUtcTime(value, timeZone, unspecifiedDateTimeHandling));
     }
     else if (dateTimeHandling == DateTimeHandling.Local)
     {
         if (timeZone == null)
         {
             return(SwitchToLocalTime(value, unspecifiedDateTimeHandling));
         }
         return(SwitchToLocalTime(value, timeZone, unspecifiedDateTimeHandling));
     }
     else if (dateTimeHandling == DateTimeHandling.Current)
     {
         if (value.Kind == DateTimeKind.Utc)
         {
             return(EnsureDateTime(value, timeZone, DateTimeHandling.Utc, unspecifiedDateTimeHandling));
         }
         else if (value.Kind == DateTimeKind.Local)
         {
             return(EnsureDateTime(value, timeZone, DateTimeHandling.Local, unspecifiedDateTimeHandling));
         }
         else
         {
             if (unspecifiedDateTimeHandling == UnspecifiedDateTimeHandling.AssumeUtc)
             {
                 return(EnsureDateTime(value, timeZone, DateTimeHandling.Utc, unspecifiedDateTimeHandling));
             }
             else if (unspecifiedDateTimeHandling == UnspecifiedDateTimeHandling.AssumeLocal)
             {
                 return(EnsureDateTime(value, timeZone, DateTimeHandling.Local, unspecifiedDateTimeHandling));
             }
             else
             {
                 ThrowUnsupportedOption(unspecifiedDateTimeHandling.ToString());
                 return(value);
             }
         }
     }
     else
     {
         ThrowUnsupportedOption(dateTimeHandling.ToString());
         return(value);
     }
 }
        private static DateTime SwitchToLocalTime(DateTime value, TimeZoneInfo timeZone, UnspecifiedDateTimeHandling dateTimeHandling)
        {
            switch (value.Kind)
            {
            case DateTimeKind.Unspecified:
                if (dateTimeHandling == UnspecifiedDateTimeHandling.AssumeLocal)
                {
                    return(string.Equals(timeZone.Id, TimeZoneInfo.Local.Id, StringComparison.Ordinal) ? new DateTime(value.Ticks, DateTimeKind.Local) : value);
                }
                else
                {
                    return(TimeZoneInfo.ConvertTimeFromUtc(new DateTime(value.Ticks, DateTimeKind.Utc), timeZone));
                }

            case DateTimeKind.Utc:
                return(TimeZoneInfo.ConvertTimeFromUtc(value, timeZone));

            case DateTimeKind.Local:
                return(TimeZoneInfo.ConvertTime(value, timeZone));
            }
            return(value);
        }
 public static DateTime EnsureDateTime(DateTime value, DateTimeHandling dateTimeHandling, UnspecifiedDateTimeHandling unspecifiedDateTimeHandling)
 {
     return(EnsureDateTime(value, null, dateTimeHandling, unspecifiedDateTimeHandling));
 }