web-dev-qa-db-fra.com

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

J'ai hérité du code C # qui a énormément de DateTimes où la propriété Kind est DateTimeKind.Unspecified. Ceux-ci sont introduits dans Datetime.ToUniversalTime () qui donne un datetime UTC (cela ajoute 7 heures dans mon cas). Voici comment fonctionne ToUniversalTime (); voir MSDN. Le problème est que ces DateTimes sont en fait déjà en heure UTC. Ils sont extraits d'une base de données SQL Server Compact 4.0. Ils y étaient stockés à UTC. Ma principale question est:

  1. Comment puis-je modifier la propriété Kind d'un DateTime afin qu'il soit UTC et non non spécifié? 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 "Non spécifié" devrait devenir une heure du 1er avril 2013 à 9h05 UTC.

Si je pouvais me permettre une ou des questions complémentaires, ce serait:

  1. Les valeurs sont-elles nécessairement renvoyées par Sql Server Compact comme "non spécifiées"? Dans Sql Server Compact, ils sont stockés en tant que type (datetime, non null). En regardant le code, il semble qu'ils soient simplement mis dans la base de données, 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 simple de s'assurer que les DateTimes sortent de SQL Compact en UTC?

Veuillez me faire savoir si je peux fournir plus de détails. Je suis nouveau dans cette base de code et j'y parviens toujours, donc j'ai du mal à décrire le problème parfaitement.

Dave

25
Dave

Avez-vous peut-être 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() de MSDN :

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

Il créera un nouvel objet, un nouveau type et une même valeur de temps. Vous ne pouvez pas changer le type d'objet existant, vous devez en créer un nouveau avec les mêmes valeurs et un type différent.

En ce qui concerne les autres questions, voici les types pris en charge dans SQL Compact . Et voici le problème concernant DateTimeOffset . Il semble que ce ne soit pas encore pris en charge dans Sql Compact.

38
kat1330

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

C'est beaucoup plus court à utiliser dans LINQ que d'avoir à taper DateTime.SpecifyKind(unspecified, DateTimeKind.Utc) à chaque fois.

Par exemple:

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

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);
}
3
Paul Lambert