2009-09-08 45 views
14

我正在寻找一种获取长时间日期时间而不是工作日的区域感知方式。只有这样的野兽存在?如何从DateTime中获取长日期格式而无需工作日

下面是我用得到的长日期格式,包括平日代码:

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

编辑

的,我想什么例子看看:

  • EN -us:2009年12月5日
  • fr-fr:5décembre2009
  • ES-ES:05日DICIEMBRE日2009年

ToLongDateString()返回如下:

  • EN-US:星期六,2009年12月5日
  • FR-FR:samedi 5décembre 2009年
  • ES-ES:sábado,05日DICIEMBRE日2009年

回答

8

这似乎这样的伎俩。

  1. 枚举所有有效的datetime模式: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);    
    } 
} 

从技术上讲,它可能不会,如果长格式有夹在中间的一天的工作为名。为此,我应该选择具有最长公共子串而不是最长精确匹配的模式。

0

尝试:

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

如果LongDate序列也是文化特定的,那么恐怕你运气不好,你将不得不为此编写实际的代码。否则,formatting tags的集合将会诀窍。

恐怕你要做的是在本地文化中创建7个字符串(每天一个)的数组,并从LongDate格式输出中删除这些字符串。然后确保你删除所有重复/的 - 和空格。

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

+0

问计于错误的结果(与星期几字符串),并试图将其Munge时间成可接受的形式(通过删除星期几)是一个非常贫穷的替代品只需简单地问一个日期字符串格式适当的第一位。 – 2009-09-08 17:34:49

+0

@ Stephen:我同意。但你如何知道当前文化的正确格式?年,月和日的顺序,分隔符字符等等。 – 2009-09-08 21:11:22

+1

@大卫 - 完全正确,你不能。如果它很重要,则必须研究每种文化的适当格式,正如Microsoft对cultureInfo.DateTimeFormat.LongDatePattern所做的那样。 – 2009-09-08 21:33:45

3

一个非常可怕的,可怕的方式来完成,这是从现有的LongDatePattern删除不想要的格式说明:

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

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

这很好,很简单,但不处理*所有情况。例如ka-GE是“yyyy'წლის'dd MM,dddd”。这个答案会留下最后的逗号 – 2009-09-08 19:01:03

+0

同意,这是一个“非常糟糕的,可怕的”解决方案:D您可以将其添加到正则表达式:/,?\ s * dddd,?/ – user7116 2009-09-08 20:31:40

+0

我认为将这个添加到正则表达式中会有所帮助,是的。 – 2009-09-08 21:01:21

5
String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "") 
-1

什么不妥:

var ci = CultureInfo.CreateSpecificCulture("nl-NL"); 
var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci); 
+0

这假设你想dd MMM yyyy,这将使用特定于区域的月份名称,但不是格式。查看问题中的示例。 – 2014-08-23 15:58:50

-1

只要指定格式:

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

假设你想MMMM dd,yyyy,它将使用特定于语言环境的月份名称,但不是格式。查看问题中的示例。 – 2014-08-23 15:59:45

1

这是一个很老很老THEAD,但我碰到它,因为它完全匹配的用例我需要解决。我最终写了一段可行的代码,所以我想我会将它包含在那些需要它的代码中。 (它有一些额外的技巧,像默认为当前日期,并允许无论是对文化的完整的日期字符串,或一个与一天的星期几删除):

public string DateString(DateTime? pDt = null, string lang, bool includeDayOfWeek = true) 
{ 
    if (pDt == null) pDt = DateTime.Now; 
    DateTime dt = (DateTime)pDt; 

    System.Globalization.CultureInfo culture = null; 
    try { culture = new System.Globalization.CultureInfo(lang); } 
     catch{ culture = System.Globalization.CultureInfo.InvariantCulture; } 

    string ss = dt.ToString("D", culture); 
    if (!includeDayOfWeek) 
    { 
     // Find day-of-week string, and remove it from the date string 
     // (including any trailing spaces or punctuation) 
     string dow = dt.ToString("dddd", culture); 
     int len = dow.Length; 
     int pos = ss.IndexOf(dow); 
     if (pos >= 0) 
     { 
      while (((len + pos) < ss.Length) && (!Char.IsLetterOrDigit(ss[len+pos]))) 
      len++; 
      ss = ss.Substring(0, pos) + ss.Substring(len+pos, ss.Length - (len+pos)); 
     } 
    } 
    return ss; 
} 
0

为什么不给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 
+0

因为在某些文化中,工作日可能不会出现在前面。 – 2017-11-01 15:59:18

0

旧的职位,但我用这样的:

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

我曾建议扩大由Bart卡利斯托修复DD MMM yyyy格式问题(在澳大利亚,我们还使用英国日期格式dd/mm/yy)

我还经常需要在澳大利亚和美国的日期格式之间进行转换。

此代码解决了这个问题(我的版本是VB)

Public Shared Function ToLongDateWithoutWeekDayString(source As DateTime, cult As System.Globalization.CultureInfo) As String 

Return source.ToString("D", cult).Replace(source.DayOfWeek.ToString(), "").Trim(","c, " "c) 

End Function 

喊你需要设置文化的功能之前,我这样做从01​​

Select Case Country.country 
      Case "AU" 
       cult = New CultureInfo("en-AU") 
      Case "US" 
       cult = New CultureInfo("en-US") 
      Case "GB" 
       cult = New CultureInfo("en-GB") 
     End Select 

Dim date1 As New Date(2010, 8, 18) 
lblDate.Text = ToLongDateWithoutWeekDayString(date1, cult) 
得到访问者的国后

设置AU或GB培养结果之后是2010

8月18日设置美国文化的结果2010年8月18日

Adam您是否同意这解决了您所指的格式问题?

感谢巴特,这是非常不错的代码。

不要忘记在 后继续添加Dim cult As System.Globalization.CultureInfo继承System.Web.UI。第

+0

我建议用'source.ToString(“dddd”,cult)'替换'source.DayOfWeek.ToString()',以便它可以与其他语言一起使用,而不仅仅是英语。 – 2017-09-12 20:33:10

0

我的解决办法:

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)); 

最后一行:

  1. 删除在启动剩余逗号
  2. 在启动
  3. 删除多余的空间,从任何地方移除剩余的双层空间,在字符串

测试为每一种文化从

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