yyyy ssz formato ddthh cambiar c# localization datetime-format time-format

ssz - formato datetime c#



C#Formateo del tiempo. Localización en francés ¿cómo obtengo la salida "5h 45" para 5:45? (5)

Estoy intentando formatear las fechas para un cliente francés.

Necesito formatear Times como se muestra en los siguientes ejemplos ...

06:00 -> 6 h
08:45 -> 8 h 45
10:30 -> 10 h 30
15:00 -> 15 h
17:22 -> 17 h 22
18:00 -> 18 h

He podido usar el formato personalizado de fecha y hora . Pero parece que estoy atascado en esta notación de que los franceses (al menos en Canadá) no muestran los minutos si son cero "00".

Actualmente estoy usando el siguiente formato.

myDateTime.ToString("H /h mm")

¿Cómo puedo hacer que "mm" solo aparezca cuando> 00?

Me gustaría evitar el uso de un método de extensión o una clase proxy, ya que creo que esto debería integrarse en el marco. Aparentemente su formato estándar para tiempos franceses.

Mi cadena "H / h mm" proviene en realidad de un archivo de recursos. es decir...

myDateTime.ToString(Resources.Strings.CustomTimeFormat);


Aquí está la solución con la que voy:

public static string ToStringOverride(this DateTime dateTime, string format) { // Adjust the "format" as per unique Culture rules not supported by the Framework if (CultureInfo.CurrentCulture.LCID == 3084) // 3084 is LCID for fr-ca { // French Canadians do NOT show 00 for minutes. ie. 8:00 is shown as "8 h" not "8 h 00" if (dateTime.Minute == 0) { format = format.Replace("mm", string.Empty); } } return dateTime.ToString(format); }

Al menos funcionará para diferentes formatos de DateTime, como ...

  • H / h mm
  • dddd d MMMM aaaa H / h mm tt

La idea aquí es modificar el FormatString para eliminar "mm" si los minutos son cero. Aún dejando que el marco haga el trabajo duro.


Puede que no sea lindo, pero si insisten

if (Locality == france) myDateTime.ToString(Resources.Strings.CustomTimeFormat).Replace("00","") ; else myDateTime.ToString(Resources.Strings.CustomTimeFormat);


Siguiendo la idea del método de extensión de code4life, aquí hay un método de extensión. = p

public static string ToCanadianTimeString(this DateTime source) { if (source == null) throw new ArgumentNullException("source"); if (source.Minute > 0) return String.Format("{0:hh} h {0:mm}", source); else return String.Format("{0:hh} h", source); }


Tengo malas noticias para ti. El marco no es compatible con el formato que está buscando. El siguiente código prueba esto:

using System; using System.Globalization; namespace ConsoleApplication1 { public class Program { static void Main(string[] args) { // FR Canadian Console.WriteLine("Displaying for: fr-CA"); DisplayDatesForCulture("fr-CA"); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(); // FR French Console.WriteLine("Displaying for: fr-FR"); DisplayDatesForCulture("fr-FR"); Console.WriteLine(); Console.WriteLine("Press enter to exit."); Console.ReadLine(); } static void DisplayDatesForCulture(string culture) { var ci = CultureInfo.GetCultureInfo(culture); var dt = new DateTime(2010, 10, 8, 18, 0, 0); foreach (string s in ci.DateTimeFormat.GetAllDateTimePatterns()) Console.WriteLine(dt.ToString(s)); } } }

La aplicación muestra todos los formatos de fecha y hora compatibles. Ninguno de ellos admite el concepto de 18:00 ==> 18 h, etc.

Su mejor opción es escribir un método de extensión o un enfoque similar.

Enfoque sensible al cultivo: construir una clase de ayuda de extensión:

public static class DateHelper { public static string ToLocalizedLongTimeString(this DateTime target) { return ToLocalizedLongTimeString(target, CultureInfo.CurrentCulture); } public static string ToLocalizedLongTimeString(this DateTime target, CultureInfo ci) { // I''m only looking for fr-CA because the OP mentioned this // is specific to fr-CA situations... if (ci.Name == "fr-CA") { if (target.Minute == 0) { return target.ToString("H'' h''"); } else { return target.ToString("H'' h ''mm"); } } else { return target.ToLongTimeString(); } } }

Puedes probar así:

var dt = new DateTime(2010, 10, 8, 18, 0, 0); // this line will return 18 h Console.WriteLine(dt.ToLocalizedLongTimeString(CultureInfo.GetCultureInfo("fr-CA"))); // this line returns 6:00:00 PM Console.WriteLine(dt.ToLocalizedLongTimeString()); var dt2 = new DateTime(2010, 10, 8, 18, 45, 0); // this line will return 18 h 45 Console.WriteLine(dt2.ToLocalizedLongTimeString(CultureInfo.GetCultureInfo("fr-CA"))); // this line returns 6:45:00 PM Console.WriteLine(dt2.ToLocalizedLongTimeString());


Esto tampoco es bonito:

myDateTime.ToString(myDateTime.Minute == 0 ? @"H /h" : @"H /h mm")