c# - timezoneinfo - Convertir UTC DateTime a otra zona horaria
timezoneinfo c# (5)
Echa un vistazo a la estructura DateTimeOffset :
// user-specified time zone
TimeZoneInfo southPole =
TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");
// an UTC DateTime
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc);
// DateTime with offset
DateTimeOffset dateAndOffset =
new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime));
Console.WriteLine(dateAndOffset);
Para DST vea el método TimeZoneInfo.IsDaylightSavingTime .
bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow);
Tengo un valor UTC DateTime que proviene de un registro de base de datos. También tengo una zona horaria especificada por el usuario (una instancia de TimeZoneInfo). ¿Cómo convierto ese DateTime de UTC a la zona horaria local del usuario? Además, ¿cómo puedo determinar si la zona horaria especificada por el usuario está actualmente observando el horario de verano? Estoy usando .NET 3.5.
Gracias mark
La mejor manera de hacer esto es simplemente usar TimeZoneInfo.ConvertTimeFromUtc
.
// you said you had these already
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
// it''s a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);
El único problema es que el valor DateTime
entrante puede no tener el tipo DateTimeKind.Local
. Debe ser Utc
, o Unspecified
.
La respuesta de Antartica solo funciona para las zonas horarias que coinciden con UTC. Estoy bastante traumatizado con esta función DateTimeOffset
y después de horas de prueba y error, he logrado producir una función práctica de extensión de conversión que funciona con todas las zonas horarias.
static public class DateTimeFunctions
{
static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc)
{
if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
return new DateTimeOffset(convertedTime, toUtcOffset);
}
}
Ejemplo:
var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
Puede usar una función dedicada dentro de TimeZoneInfo si desea convertir un DateTimeOffset en otro DateTimeOffset:
DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
DateTimeOffset.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
);
// TO get Currrent Time in current Time Zone of your System
var dt = DateTime.Now;
Console.WriteLine(dt);
// Display Time Zone of your System
Console.WriteLine(TimeZoneInfo.Local);
// Convert Current Date Time to UTC Date Time
var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local);
Console.WriteLine(utc);
// Convert UTC Time to Current Time Zone
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);
Console.WriteLine(pacific);
Console.ReadLine();