web-dev-qa-db-fra.com

Comment définir un fuseau horaire (ou un type) d'une valeur DateTime?

Je veux stocker l'heure UTC stricte dans une variable DateTime et la sortir au format ISO 8601.

Pour faire le dernier que j'ai utilisé .ToString ("aaaa-MM-jjTHH: mm: sszzz"), et il a découvert que le fuseau horaire est UTC + 01: 00.

J'ai essayé d'utiliser .Kind = DateTimeKind.Utc, mais il dit que la propriété Kind n'a pas de setter.

Comment spécifier explicitement l'heure en UTC? Comment la propriété Kind est-elle définie?

38
Ivan

Alors que la propriété DateTime.Kind n'a pas de setter, la méthode statique DateTime.SpecifyKind crée une instance DateTime avec une valeur spécifiée pour Kind.

Il existe également plusieurs surcharges du constructeur DateTime qui prennent un paramètre DateTimeKind

31
Frank Boyne

Si vous souhaitez profiter du fuseau horaire de votre machine locale, vous pouvez utiliser myDateTime.ToUniversalTime() pour obtenir l'heure UTC à partir de votre heure locale ou myDateTime.ToLocalTime() pour convertir l'heure UTC en heure de la machine locale.

// convert UTC time from the database to the machine's time
DateTime databaseUtcTime = new DateTime(2011,6,5,10,15,00);
var localTime = databaseUtcTime.ToLocalTime();

// convert local time to UTC for database save
var databaseUtcTime = localTime.ToUniversalTime();

Si vous devez convertir l'heure de/vers d'autres fuseaux horaires, vous pouvez utiliser TimeZoneInfo.ConvertTime() ou TimeZoneInfo.ConvertTimeFromUtc().

// convert UTC time from the database to japanese time
DateTime databaseUtcTime = new DateTime(2011,6,5,10,15,00);
var japaneseTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
var japaneseTime = TimeZoneInfo.ConvertTimeFromUtc(databaseUtcTime, japaneseTimeZone);

// convert japanese time to UTC for database save
var databaseUtcTime = TimeZoneInfo.ConvertTimeToUtc(japaneseTime, japaneseTimeZone);

Liste des fuseaux horaires disponibles

classe TimeZoneInfo sur MSDN

46
SandRock

Vous pouvez également l'essayer, il est facile à mettre en œuvre

TimeZone time2 = TimeZone.CurrentTimeZone;
DateTime test = time2.ToUniversalTime(DateTime.Now);
var singapore = TimeZoneInfo.FindSystemTimeZoneById("Singapore Standard Time");
var singaporetime = TimeZoneInfo.ConvertTimeFromUtc(test, singapore);

Modifiez le texte à l'heure standard que vous souhaitez modifier.

Utilisez la fonctionnalité TimeZone de C # pour l'implémenter.

6
Sandeep Nair