zona timezoneinfo now horaria cambiar .net datetime formatting timezone tostring

.net - timezoneinfo - datetime zona horaria c#



¿Cómo mostrar DateTime con una zona horaria abreviada? (8)

Depende del nivel de robustez que necesite.

Probablemente necesites algún tipo de truco en ambos sentidos. Una manera fácil sería dividir la cadena por espacios y luego concatenar la primera letra de cada palabra. es decir

string[] words = tzname.Split(" ".ToCharArray()); string tzabbr = ""; foreach (string word in words) tzabbr += word[0];

Eso no funcionará para cada zona horaria del planeta, pero funcionará para la mayoría de ellos. Si lo necesita más sólido, probablemente necesite crear un mapa que asigne nombres de zonas horarias a sus abreviaturas.

Conozco la clase System.TimeZone así como los muchos usos del método DateTime.ToString () . Lo que no he podido encontrar es una forma de convertir un DateTime a una cadena que, además de la información de fecha y hora, contiene la abreviatura de tres letras de Time Zone (de hecho, de manera muy parecida a la información de herramientas de StackOverflow para la visualización del tiempo funciona).

Para que un ejemplo sea fácil de seguir y de consumir, sigamos con el ejemplo de StackOverflow. Si observa la información sobre herramientas que se muestra en tiempos relativos, se muestra con la fecha completa, el tiempo que incluye segundos en formato de doce horas, una designación AM / PM y luego la abreviación de zona horaria de tres letras (en su caso, Coordinado Tiempo Universal). Me doy cuenta de que podría obtener fácilmente GMT o UTC utilizando los métodos integrados, pero lo que realmente quiero es el tiempo, ya que es local, en este caso, en un servidor web.

Si nuestro servidor web ejecuta Windows Server 2k3 y tiene su zona horaria configurada en CST (o, hasta que se restablezca el horario de verano , CDT ¿verdad?), Me gustaría que nuestra aplicación web ASP.NET muestre DateTimes relativa a esa zona horaria así como formateado para mostrar un "CST" en el extremo. Me doy cuenta de que podría codificar fácilmente esto, pero en aras de la solidez, realmente preferiría una solución basada en el servidor que ejecuta la configuración del entorno del sistema operativo del código.

En este momento, tengo todo menos la abreviatura de zona horaria usando el siguiente código:

myDateTime.ToString("MM/dd/yyyy hh:mm:ss tt")

Que muestra:

10/07/2008 03:40:31 PM

Todo lo que quiero (¡y no es mucho, lo prometo!) Es que diga:

10/07/2008 03:40:31 PM CDT

Puedo usar System.TimeZone.CurrentTimeZone y usarlo para mostrar correctamente "Central Daylight Time", pero ... eso es demasiado largo en aras de la brevedad. ¿Estoy atascado escribiendo una rutina de manipulación de cadenas para quitar el espacio en blanco y las letras que no sean mayúsculas? Si bien eso podría funcionar, parece increíblemente piratearme ...

Googlear y mirar aquí no produjo nada aplicable a mi pregunta específica.


Crearía una tabla de búsqueda que convierta el nombre de la zona horaria a su abreviatura. Si no se encuentra la coincidencia, puede devolver el nombre completo de la zona.

Ver abreviaturas de zona horaria .


Hay una biblioteca disponible gratuitamente, TZ4NET , que tiene estas abreviaturas disponibles. Antes de .NET 3.5, esta era una de las únicas alternativas para convertir entre zonas horarias también.

Si no desea una biblioteca separada, puede generar un mapa de abreviaturas razonables utilizando las clases TimeZoneInfo y luego solo proporcionarlas a su usuario.


Aquí está mi método de hack rápido que acabo de hacer para solucionar esto.

public static String TimeZoneName(DateTime dt) { String sName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(dt) ? TimeZone.CurrentTimeZone.DaylightName : TimeZone.CurrentTimeZone.StandardName; String sNewName = ""; String[] sSplit = sName.Split(new char[]{'' ''}); foreach (String s in sSplit) if (s.Length >= 1) sNewName += s.Substring(0, 1); return sNewName; }


Si saca la abreviatura de DaylightName / StandardName, va a ser mejor construir la cadena usando un StringBuilder, ya que las cadenas son inmutables.

public static string ToCurrentTimeZoneString(this DateTime date) { string name = TimeZone.CurrentTimeZone.IsDaylightSavingTime(date) ? TimeZone.CurrentTimeZone.DaylightName : TimeZone.CurrentTimeZone.StandardName; return name; } public static string ToCurrentTimeZoneShortString(this DateTime date) { StringBuilder result = new StringBuilder(); foreach (string value in date.ToCurrentTimeZoneString().Split('' '')) { if (value.IsNotNullOrEmptyWithTrim()) { result.Append(char.ToUpper(value[0])); } } return result.ToString(); }

Por supuesto, una matriz que contiene KeyValuePair es probablemente la mejor para una empresa multinacional. Si quiere afeitarse unos minutos después de una fecha límite apretada, y está en una empresa de EE. UU., Esto funciona.


Ok, han pasado 4 años (y casi una semana), es hora de que traigamos LINQ a la discusión ...

Uniendo las ideas de Criag y Bob ...

public static String TimeZoneName2(DateTime dt) { var return ToCurrentTimeZoneShortString(dt) .Split(new char[]{'' ''}, StringSplitOptions.RemoveEmptyEntries); return sSplit.Aggregate("", (st,w)=> st +=w[0]); }

A menos que pueda confiar en TimeZone para que nunca devuelva una cadena con dos espacios consecutivos:

public static String TimeZoneName3(DateTime dt) { return ToCurrentTimeZoneShortString(dt).Split('' '') .Aggregate("", (st,w)=> st +=w[0]); }


Si está utilizando <= .Net 3.0, descargue TZ4Net y use OlsonTimeZone.CurrentTimeZone.StandardAbreviation para> .Net 3.0 use NodaTime u otro. Los nombres de las zonas horarias no se ajustan a ninguna convención en la que pueda confiar en la manipulación simple de cadenas para construir la abreviatura de un acrónimo. Incorrecto el 5% de las veces sigue siendo incorrecto.


Use nodatime .

La siguiente función toma un DateTime en hora UTC y lo formatea con la zona horaria abreviada del sistema local. Use x en la cadena de formato para la zona horaria abreviada. Busque el formateo personalizado aquí .

public static string ConvertToFormattedLocalTimeWithTimezone(DateTime dateTimeUtc) { var tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); // Get the system''s time zone var zdt = new ZonedDateTime(Instant.FromDateTimeUtc(dateTimeUtc), tz); return zdt.ToString("MM''/''dd''/''yyyy'' ''hh'':''mm'':''ss'' ''tt'' ''x", CultureInfo.InvariantCulture); }