如何在没有工作日的情况下从DateTime获取长日期格式

Ada*_*gen 17 .net datetime internationalization datetime-format

我正在寻找一种能够在没有工作日的情况下获取长日期时间的语言环境.这样的野兽存在吗?

下面是我用来获取包含工作日的长日期格式的代码:

DateTime time = ...
String formattedDate = time.ToLongDateString();
Run Code Online (Sandbox Code Playgroud)

编辑

我希望看到的例子:

  • en-us:2009年12月5日
  • fr-fr:2009年5月5日
  • es-es:05 de diciembre de 2009

ToLongDateString()返回以下内容:

  • en-us:2009年12月5日星期六
  • fr-fr:samedi5décembre2009
  • es-es:sábado,05 de diciembre de 2009

Rez*_*eza 9

String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
Run Code Online (Sandbox Code Playgroud)


Ada*_*gen 8

这似乎可以解决问题.

  1. 枚举所有有效的日期时间模式:CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. 选择最长的模式(可能这是最佳匹配):
    • 是CultureInfo.DateTimeFormat.LongDatePattern的子字符串
    • 不包含"ddd"(短日名称)
    • 不包含"dddd"(长日名称)

这似乎是我想要的字符串.

见下面的代码:

class DateTest
{
    static private string GetDatePatternWithoutWeekday(CultureInfo cultureInfo)
    {
        string[] patterns = cultureInfo e.DateTimeFormat.GetAllDateTimePatterns();

        string longPattern = cultureInfo.DateTimeFormat.LongDatePattern;

        string acceptablePattern = String.Empty;

        foreach (string pattern in patterns)
        {
            if (longPattern.Contains(pattern) && !pattern.Contains("ddd") && !pattern.Contains("dddd"))
            {
                if (pattern.Length > acceptablePattern.Length)
                {
                    acceptablePattern = pattern;
                }
            }
        }

        if (String.IsNullOrEmpty(acceptablePattern))
        {
            return longPattern;
        }
        return acceptablePattern;
    }

    static private void Test(string locale)
    {
        DateTime dateTime = new DateTime(2009, 12, 5);

        Thread.CurrentThread.CurrentCulture  = new CultureInfo(locale);

        string format = GetDatePatternWithoutWeekday(Thread.CurrentThread.CurrentCulture);

        string result = dateTime.ToString(format);

        MessageBox.Show(result);            
    }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,如果长格式的中间名称夹在中间,它可能不会起作用.为此,我应该选择具有最长公共子串而不是最长完全匹配的模式.


fra*_*nzo 5

改进已接受的答案,GetAllDateTimePatterns可以采用参数将结果限制为与标准格式字符串相关的模式,例如长日期模式的“D”。

\n\n

例如,GetAllDateTimePatterns(\'D\')目前正在为 en-US 返回此内容:

\n\n
"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" \n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 zh-HK 来说:

\n\n
"yyyy\'\xe5\xb9\xb4\'M\'\xe6\x9c\x88\'d\'\xe6\x97\xa5\'", "yyyy\'\xe5\xb9\xb4\'MM\'\xe6\x9c\x88\'dd\'\xe6\x97\xa5\'", "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5", "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5, dddd"\n
Run Code Online (Sandbox Code Playgroud)\n\n

假设它们按某种偏好或流行顺序列出,我们可以选择第一个不包含星期几的选项。

\n\n

以下是扩展方法,因此您可以简单地使用myDateTime.ToLongDateStringWithoutDayOfWeek()myDateTime.ToLongDateTimeStringWithoutDayOfWeek()

\n\n
public static string ToLongDateStringWithoutDayOfWeek(this DateTime d)\n{\n    return d.ToString(\n               CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(\'D\')\n                   .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) \n               ?? "D");\n}\n\npublic static string ToLongDateTimeStringWithoutDayOfWeek(this DateTime d, bool includeSeconds = false)\n{\n    char format = includeSeconds ? \'F\' : \'f\';\n    return d.ToString(\n               CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(format)\n                   .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) \n               ?? format.ToString()); \n}\n
Run Code Online (Sandbox Code Playgroud)\n


VDW*_*WWD 5

这是 Reza 的改进答案,它在某些本地化中无法正常工作。

string formattedDate = DateTime.Now.ToLongDateString()
   .Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
   .TrimStart(", ".ToCharArray());
Run Code Online (Sandbox Code Playgroud)