Comment convertir DateTime de type DateTimeKind.Unspecified à DateTime.Kind.Utc en C # (.NET)

J’ai hérité du code C # qui contient énormément de DateTimes où la propriété Kind est DateTimeKind.Unspecified. Ceux-ci sont introduits dans Datetime.ToUniversalTime (), qui renvoie une date / heure UTC (cela ajoute 7 heures dans mon cas). Voici comment ToUniversalTime () fonctionne. voir MSDN. Le problème est que ces dates sont en fait déjà dans l’heure UTC. Ils sont extraits d’une firebase database SQL Server Compact 4.0. Ils ont été stockés là-bas en UTC. Ma question principale est:

  1. Comment modifier la propriété Kind d’un DateTime afin qu’il s’agisse de l’heure UTC et non non spécifiée? Je ne veux pas changer l’heure ou la date. Ainsi, par exemple, une date du 1er avril 2013 à 9h05 avec sa propriété Kind de “Unspecified” devrait devenir une date / heure du 1er avril 2013 à 9h05 UTC.

Si je pouvais répondre à une question complémentaire, ce serait:

  1. Les valeurs renvoyées par Sql Server Compact sont-elles nécessairement “non spécifiées”? À l’intérieur de SQL Server Compact, ils sont stockés en tant que type (date / heure et non null). En regardant le code, il semble qu’ils soient simplement mis dans la firebase database, mais il n’y a aucune disposition pour les marquer comme UTC ou quoi que ce soit. Y a-t-il une meilleure façon de gérer les choses? Existe-t-il un moyen astucieux de s’assurer que les DateTimes proviennent de SQL Compact au format UTC?

S’il vous plaît laissez-moi savoir si je peux fournir plus de détails. Je connais cette base de code et j’y réfléchis encore. J’ai donc du mal à décrire le problème à la perfection.

Dave

Avez-vous besoin de quelque chose comme ça:

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

À propos de la méthode SpecifyKind() partir de MSDN :

La méthode SpecifyKind crée un nouvel object DateTime à l’aide du paramètre kind spécifié et de la valeur de l’heure d’origine.

Cela créera un nouvel object, un nouveau type et la même valeur temporelle. Vous ne pouvez pas changer le type d’object existant, vous devez en créer un avec les mêmes valeurs et un autre type.

En ce qui concerne une autre question, voici les types pris en charge dans SQL Compact . Et voici un problème concernant DateTimeOffset . On dirait que cela n’est pas encore supporté dans Sql Compact.

J’utilise une méthode d’extension:

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

Cela est beaucoup moins long à utiliser dans LINQ que de devoir taper DateTime.SpecifyKind(unspecified, DateTimeKind.Utc) chaque fois.

Par exemple:

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

Vous pouvez combiner les deux réponses ci-dessus pour une solution plus propre …

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