У меня для вас плохие новости.Каркас не поддерживает формат, который вы ищете.Следующий код подтверждает это:
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());