Cómo convertir DateTime de tipo DateTimeKind.Unspecified a DateTime.Kind.Utc en C # (.NET)

He heredado el código C # que tiene una gran cantidad de DateTimes en los que la propiedad Kind es DateTimeKind.Unspecified. Estos se ingresan en Datetime.ToUniversalTime () que devuelve un datetime UTC (agrega 7 horas en mi caso). Así es como funciona ToUniversalTime (); ver MSDN. El problema es que estos DateTimes de hecho ya están en hora UTC. Se extraen de una base de datos de SQL Server Compact 4.0. Fueron almacenados allí en UTC. Mi pregunta principal es:

  1. ¿Cómo modifico la propiedad Kind de DateTime para que sea UTC y no sin especificar? No quiero cambiar la hora ni la fecha. Por ejemplo, una fecha del 1 de abril de 2013, a las 9:05 a.m. con su propiedad Kind de “Sin especificar” debe convertirse en una fecha del 1 de abril de 2013, a las 9:05 UTC.

Si pudiera dejarme llevar por una (s) pregunta (s) de seguimiento, sería:

  1. ¿Se devuelven necesariamente los valores de Sql Server Compact como “Sin especificar”? Dentro de Sql Server Compact, se almacenan como tipo (datetime, no null). Mirando el código, parece que se acaba de poner en la base de datos, pero no hay disposiciones para marcarlos como UTC o nada. ¿Hay una mejor manera de manejar las cosas? ¿Hay una manera sencilla de asegurar que los DateTimes salgan de SQL Compact como UTC?

Por favor, hágamelo saber si puedo proporcionar más detalles. Soy nuevo en este código base y sigo teniendo mi cerebro a mi alrededor, así que tengo problemas para describir el problema a la perfección.

Dave

Tal vez necesitas algo como esto:

var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified); var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc); 

Acerca del método SpecifyKind() de MSDN :

El método SpecifyKind crea un nuevo objeto DateTime utilizando el parámetro de tipo especificado y el valor de tiempo original.

Creará nuevo objeto, nuevo tipo y mismo valor de tiempo. No puede cambiar el tipo de objeto existente, necesita crear uno nuevo con los mismos valores y tipo diferente.

Respecto a otras preguntas aquí están los tipos soportados en SQL Compact . Y aquí está el problema con respecto a DateTimeOffset . Parece que aún no está soportado en Sql Compact.

Yo uso un método de extensión:

 public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind) { var NewDT = New DateTime(DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, DT.Second, DT.Millisecond, DTKind); Return NewDT; } 

Esto es mucho más corto de usar en LINQ que tener que escribir DateTime.SpecifyKind(unspecified, DateTimeKind.Utc) cada vez.

Por ejemplo:

 table.Where((x) x.StartTimeStampUTC.SetKind(DateTimeKind.Utc).ToString("G") = GUIStartTimeStampTxt.Text) 

Podrías combinar las dos respuestas anteriores para una solución más limpia …

 public static DateTime SetKind(this DateTime DT, DateTimeKind DTKind) { return DateTime.SpecifyKind(DT, DTKind); }