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

.net 如何在没有工作日的情况下从DateTime获取长日期格式,.net,datetime,internationalization,datetime-format,.net,Datetime,Internationalization,Datetime Format,我正在寻找一种无需工作日就能获得长时间约会的地区感知方式。就这么一头野兽存在吗 下面是我用来获取长日期格式(包括工作日)的代码: DateTime time = ... String formattedDate = time.ToLongDateString(); 编辑 我想看到的例子如下: en美国:2009年12月5日 联邦公报:2009年12月5日 es:05 de diciembre de 2009 ToLongDateString()返回以下内容: en美国:2009年12月5

我正在寻找一种无需工作日就能获得长时间约会的地区感知方式。就这么一头野兽存在吗

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

DateTime time = ...
String formattedDate = time.ToLongDateString();
编辑

我想看到的例子如下:

  • en美国:2009年12月5日
  • 联邦公报:2009年12月5日
  • es:05 de diciembre de 2009
ToLongDateString()返回以下内容:

  • en美国:2009年12月5日,星期六
  • fr:samedi 5 décembre 2009
  • es:sábado,2009年5月
试试:

DateTime time = ....
string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM");

如果LongDate序列也是特定于区域性的,那么恐怕您运气不好,必须为此编写实际代码。否则,一个集合就可以了

恐怕您需要做的是在本地区域性中创建一个由7个字符串组成的数组(每天一个),然后从LongDate格式输出中删除这些字符串。然后确保删除所有重复的/'s-'和空格


希望有更好的方法,但我看不到。

实现这一点的一个非常糟糕、可怕的方法是从现有的LongDatePattern中删除不需要的格式说明符:

public static string CorrectedLongDatePattern(CultureInfo cultureInfo)
{
    var info = cultureInfo.DateTimeFormat;

    // This is bad, mmmkay?
    return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
}

这似乎奏效了

  • 枚举所有有效的日期时间模式:CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  • 选择最长的模式(可能这是最佳匹配):
    • 是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);            
        }
    }
    
    从技术上讲,如果长格式有一天被夹在中间的话,它可能就不起作用了。为此,我应该选择具有最长公共子串的模式,而不是最长精确匹配的模式。

    有什么问题:

    String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
    
    var ci = CultureInfo.CreateSpecificCulture("nl-NL");
    var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci);
    

    只需指定格式:

    DateTime.ToString("MMMM dd, yyyy");
    

    这是一个古老的thead,但我遇到它是因为它完全符合我需要解决的用例。最后,我写了一段代码,可以正常工作,所以我想我应该为那些需要它的人提供它。(它还有一些额外的技巧,例如默认为当前日期,并允许区域性的完整日期字符串,或删除星期几的字符串):

    public string DateString(DateTime?pDt=null,string lang,bool includeDayOfWeek=true)
    {
    如果(pDt==null)pDt=DateTime.Now;
    DateTime dt=(DateTime)pDt;
    System.Globalization.CultureInfo culture=null;
    试试{culture=newsystem.Globalization.CultureInfo(lang);}
    catch{culture=System.Globalization.CultureInfo.InvariantCulture;}
    字符串ss=dt.ToString(“D”,区域性);
    如果(!包括星期日)
    {
    //查找星期几字符串,并将其从日期字符串中删除
    //(包括任何尾随空格或标点符号)
    字符串dow=dt.ToString(“dddd”,culture);
    int len=道指长度;
    int pos=标准指数(道指);
    如果(位置>=0)
    {
    而((len+pos)
    为什么不获取LongDate并删除工作日出现的第一部分

    DateTime date = Convert.ToDateTime(content["DisplayDate"]); 
      //-->3/15/2016 2:09:13 PM
    
    string newDate = date.ToString("D", new CultureInfo("es-ES")); 
      //--> martes, 15 de marzo de 2016
    
    var index = newDate.IndexOf(",") + 1;
      //--> 7
    
    string finalDate = newDate.Substring(index);
      //--> 15 de marzo de 2016
    

    旧帖子,但我用的是:

    public static string ToLongDateWithoutWeekDayString(this DateTime source)
    {
        return source.ToLongDateString()
                     .Replace(source.DayOfWeek.ToString(), "")
                     .Trim(',', ' ');
    }
    

    我已经详细介绍了Bart Calixto提出的解决dd-MMM-yyyy格式问题的建议(在澳大利亚,我们也使用英国日期格式dd/mm/yy)

    我还经常需要在Aust和US日期格式之间转换

    此代码修复了问题(我的版本是VB)

    在调用您需要设置区域性的函数之前,我是在从以下位置获取访问者的国家/地区后这样做的

    设置AU或GB后,培养结果为2010年8月18日

    设定美国文化后的结果是2010年8月18日

    Adam你同意这可以解决你提到的格式问题吗

    谢谢,巴特,这是非常好的代码

    别忘了将Dim cult添加为System.Globalization.CultureInfo 继承System.Web.UI.Page

    我的解决方案:

    DateTime date = DateTime.Now;
    CultureInfo culture = CultureInfo.CurrentCulture;
    string dayName = date.ToString("dddd", culture);
    string fullDate = date.ToString("f", culture);
    string trim = string.Join(" ", fullDate.Replace(dayName, "").TrimStart(',').TrimStart(' ').Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); 
    
    最后一行:

  • 在开始时删除剩余的逗号
  • 在开始时删除剩余空间
  • 从字符串中的任何位置删除剩余的双空格
  • 针对来自的每个培养基进行测试

    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
    

    在公认答案的基础上,
    GetAllDateTimePatterns
    可以使用参数将结果限制为与标准格式字符串相关的模式,例如长日期模式的“D”

    例如,
    GetAllDateTimePatterns('D')
    当前正在为en-US返回以下内容:

    "dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" 
    
    中弘香港有限公司:

    "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"
    
    假设他们是按某种偏好或流行程度的顺序列出的,我们可以选择不包含星期几的第一个选项

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


    这是来自Reza的一个改进答案,它在某些本地化中不能正确工作

    string formattedDate = DateTime.Now.ToLongDateString()
       .Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
       .TrimStart(", ".ToCharArray());
    

    您可以将标准月/日模式(m)与自定义年(yyyy)连接起来:

    示例:

    2020年6月15日(英国-美国)
    15朱尼,2020年(丹麦首都)

    15 Juni,2020(id)

    要求错误的结果(一个包含星期几的字符串)并试图将其转换为可接受的形式(通过删除星期几)是一个非常糟糕的替代方法,而不是简单地要求一个格式正确的日期字符串。@Stephen:我同意。但是如何知道当前区域性的正确格式?年、月、日的顺序,分隔符等等@David-完全正确,你不能。如果重要的话,您必须研究每个区域性的适当格式,就像Microsoft对cultureInfo.DateTimeFormat.L所做的那样
    "dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" 
    
    "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy年MMMd日", "yyyy年MMMd日, dddd"
    
    public static string ToLongDateStringWithoutDayOfWeek(this DateTime d)
    {
        return d.ToString(
                   CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns('D')
                       .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) 
                   ?? "D");
    }
    
    public static string ToLongDateTimeStringWithoutDayOfWeek(this DateTime d, bool includeSeconds = false)
    {
        char format = includeSeconds ? 'F' : 'f';
        return d.ToString(
                   CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(format)
                       .FirstOrDefault(a => !a.Contains("ddd") && !a.Contains("dddd")) 
                   ?? format.ToString()); 
    }
    
    string formattedDate = DateTime.Now.ToLongDateString()
       .Replace(DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "")
       .TrimStart(", ".ToCharArray());
    
    string formattedDate = date.ToString("M") + ", " + date.ToString("yyyy");