Форматирование времени C #.Локализация на французский, как мне получить вывод "5h 45" для 5:45? - PullRequest
6 голосов
/ 08 октября 2010

Я пытаюсь отформатировать даты для французского клиента.

Мне нужно отформатировать Times, как показано в следующих примерах ...

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

Я смог использовать Пользовательское форматирование даты и времени .Но я, кажется, застрял в этой записи, что французы (по крайней мере, канадцы) не показывают минуты, если они равны нулю "00".

В настоящее время я использую следующий формат.

myDateTime.ToString("H \h mm")

Как я могу сделать так, чтобы «мм» появлялся только тогда, когда> 00?

Я бы хотел избежать использования метода расширения или прокси-класса, так как я чувствую, что это должно быть встроено вфреймворк.Очевидно, его стандартное форматирование для французского времени.

Моя строка "H \ h mm" на самом деле происходит из файла ресурсов.то есть ...

myDateTime.ToString(Resources.Strings.CustomTimeFormat);

Ответы [ 5 ]

4 голосов
/ 09 октября 2010

У меня для вас плохие новости.Каркас не поддерживает формат, который вы ищете.Следующий код подтверждает это:

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

Приложение отображает все поддерживаемые форматы даты и времени.Никто из них не поддерживает концепцию 18:00 ==> 18 ч и т. Д.

Ваш лучший вариант - написать метод расширения или аналогичный подход.

Культурачувствительный подход: создайте вспомогательный класс расширения:

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

Вы можете проверить так:

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());
2 голосов
/ 09 октября 2010

Следуя идее метода расширения code4life, вот метод расширения. = Р * * тысяча одна

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);
}
1 голос
/ 09 октября 2010

Вот решение, с которым я иду:

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

По крайней мере, он будет работать для различных форматов DateTime, таких как ...

  • Ч \ ч мм
  • дддд д мммм гггг ч \ ч мм тт

Идея в том, что я изменяю FormatString, чтобы удалить "mm", если минуты равны нулю. Все еще позволяя фреймворку выполнять тяжелую работу.

1 голос
/ 09 октября 2010

Это может быть не красиво, но если они настаивают

if (Locality == france)
myDateTime.ToString(Resources.Strings.CustomTimeFormat).Replace("00","") ;
else 
myDateTime.ToString(Resources.Strings.CustomTimeFormat);
0 голосов
/ 13 августа 2012

Это тоже не красиво:

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