2010-10-08 9 views
6

Estoy intentando formatear las fechas para un cliente francés.C# Formato de hora. Localización en francés ¿cómo obtengo la salida "5h 45" para 5:45?

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 sido capaz de utilizar Custom Date and Time Formatting. 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 para 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); 
+0

Aunque soy francés no sabía no ponemos 00 –

+0

Jaja. ¿@GôTô quizás es una cosa canadiense francesa? – Justin

+1

Sí, quizás los canadienses franceses son raros: P (es una broma!) –

Respuesta

4

tengo malas noticias para usted. El marco no admite el formato que está buscando. El siguiente código lo demuestra:

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 Cultura: construir una clase de extensión ayudante:

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(); 
     } 
    } 
} 

Puede probar de esta manera:

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()); 
+0

Los puntos importantes de su respuesta están muy bien escritos y me encantan los exámenes incluidos. Publiqué mi propia respuesta, que es un poco más genérica para acomodar todos los formatos personalizados de DateTime que el usuario pueda desear usar. – Justin

1

No podría ser bonita, pero si insisten

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

Eso no es bonito, pero no creo que haya otra opción:/ –

2

Siguiendo sobre la idea método de extensión de code4life, aquí está 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); 
} 
+0

debe hacerlo sensible a la cultura ... – code4life

+0

Muhahaha, es: "ToCanadianTimeString". –

+0

@ code4life: puedo pensar en un par de maneras de consultar la cultura actual o pasar una cultura. Actualizaré el ejemplo a uno de ellos un poco más tarde si eso es lo que quieres decir. – Moudis

1

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

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); 
} 

Lo hará al menos trabajo para diferentes formatos de DateTime como ...

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

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

0

Esto no es bastante bien:

myDateTime.ToString(myDateTime.Minute == 0 ? @"H \h" : @"H \h mm") 
Cuestiones relacionadas