C # Форматирование времени. Локализация на французский Как получить вывод "5h 45" на 5:45?
-
28-09-2019 - |
Вопрос
Я пытаюсь отформатировать даты для французского клиента.
Мне нужно отформатировать время, как показано в следующих примерах ...
06:00 -> 6 ч
08:45 -> 8 ч 45
10:30 -> 10 ч 30
15:00 -> 15 ч
17:22 -> 17 ч 22
18:00 -> 18 ч
Я смог использовать Пользовательские форматирование даты и времени. Отказ Но я, кажется, застрял на этом обозначении, что французский (по меньшей мере) не показывает минуты, если они нулевые «00».
В настоящее время я использую следующий формат.
myDateTime.ToString("H \h mm")
Как я могу сделать это так «мм», только появляется только когда> 00?
Я хотел бы избежать использования метода расширения или прокси-класса, поскольку я чувствую, что это должно быть встроено в рамки. Видимо его стандартное форматирование для французских времен.
Моя струна «H H mm» фактически исходит из файла ресурса. то есть ...
myDateTime.ToString(Resources.Strings.CustomTimeFormat);
Решение
У меня есть какие-то плохие новости для вас. Рамки не Поддержите формат, который вы ищете. Следующий код доказывает это:
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));
}
}
}
Приложение отображает все поддерживаемые форматы DateTime. Никто из них не поддерживает концепцию 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());
Другие советы
Следуя на идее метода расширения Code4Life, вот метод расширения. = 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);
}
Это может быть не красиво, но если они настаивают
if (Locality == france)
myDateTime.ToString(Resources.Strings.CustomTimeFormat).Replace("00","") ;
else
myDateTime.ToString(Resources.Strings.CustomTimeFormat);
Вот решение я иду с:
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, таких как ...
- H h мм
- DDDD D MMMM YYYY H H MM TT
Идея вот я изменив FormatString, чтобы удалить «мм», если минуты равны нулю. До сих пор позволяют рамки делать тяжелую работу.
Это тоже не красиво:
myDateTime.ToString(myDateTime.Minute == 0 ? @"H \h" : @"H \h mm")