2011-06-04 13 views
32

Quiero almacenar una hora UTC estricta en una variable DateTime y enviarla en formato ISO 8601.¿Cómo establecer una zona horaria (o una clase) de un valor de DateTime?

Para hacer lo último que he usado .ToString ("aaaa-MM-ddTHH: mm: sszzz"), y ha descubierto que la zona horaria es UTC + 01: 00.

He intentado utilizar .Kind = DateTimeKind.Utc, pero dice que la propiedad Kind no tiene setter.

¿Cómo especifico explícitamente que la hora está en UTC? ¿Cómo se establece la propiedad Kind?

Respuesta

26

Mientras que la propiedad DateTime.Kind no tiene un setter, el método estático DateTime.SpecifyKind crea una instancia de DateTime con un valor especificado para Kind.

Altenatively hay varios DateTime constructor overloads que toma un parámetro DateTimeKind

+1

El 'DateTimeKind' solo contiene local, no especificado y UTC. Probablemente no sea posible. Quiero usar una zona horaria particular. – hardywang

+2

@hardywang Si todo lo que necesita es especificar una hora y un desplazamiento de UTC, entonces puede usar [DateTimeOffset] (https://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx). Si realmente necesita identificar un huso horario en particular, entonces necesita combinar DateTime con un [TimeZoneInfo] (https://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx). Consulte [Elegir entre DateTime, DateTimeOffset y TimeZoneInfo] (https://msdn.microsoft.com/en-us/library/bb384267.aspx) para una discusión. –

31

Si desea obtener provecho de su máquina zona horaria local puede utilizar myDateTime.ToUniversalTime() para obtener la hora UTC de la hora local o myDateTime.ToLocalTime() para convertir la hora UTC a el tiempo de la máquina local.

// 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 necesita convertir el tiempo de/a otros zonas horarias, es posible utilizar TimeZoneInfo.ConvertTime() o 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); 

List of available timezones

TimeZoneInfo class on MSDN

3

Puede probar esto así, es fácil de implementar

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

Cambie el texto al que el tiempo estándar que desea cambiar.

Utilice TimeZone característica de C# para implementar.

Cuestiones relacionadas