C#时间格式.本地化为法语如何获得5:45的输出"5h 45"?

Jus*_*tin 6 c# localization time-format datetime-format

我正在尝试为法国客户设置日期格式.

我需要格式化Times,如以下示例所示......

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")
Run Code Online (Sandbox Code Playgroud)

如何才能使"mm"仅在> 00时出现?

我想避免使用扩展方法或代理类,因为我觉得这应该构建到框架中.显然是法国时代的标准格式.

我的字符串"H\h mm"实际上来自资源文件.即...

myDateTime.ToString(Resources.Strings.CustomTimeFormat);
Run Code Online (Sandbox Code Playgroud)

cod*_*ife 4

我有一些坏消息要告诉你。该框架支持您正在寻找的格式。下面的代码证明了这一点:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序显示所有支持的日期时间格式。它们都不支持 18:00 ==> 18 h 等概念。

您最好的选择是编写扩展方法或类似的方法。

文化敏感方法:构建扩展助手类:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样测试:

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());
Run Code Online (Sandbox Code Playgroud)