代码之家  ›  专栏  ›  技术社区  ›  Adam Tegen

如何从不带工作日的日期时间获取长日期格式

  •  15
  • Adam Tegen  · 技术社区  · 15 年前

    我正在寻找一种了解当地情况的方法来获得一个没有工作日的长约会时间。就这样的野兽存在吗?

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

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

    编辑

    我想看到的例子:

    • 美国:2009年12月5日
    • FR FR:5 D_©CEMBRE 2009
    • 2009年12月5日

    tolongdatestring()返回以下内容:

    • 美国:2009年12月5日,星期六
    • fr fr:samedi 5 d_©cembre 2009年
    • Es Es:S_Bado,05 de Diciembre de 2009年
    14 回复  |  直到 6 年前
        1
  •  8
  •   Adam Tegen    15 年前

    这似乎起到了作用。

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

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

        2
  •  7
  •   Moslem Hadi    11 年前
    String formattedDate = DateTime.Now.Date.ToLongDateString().Replace(DateTime.Now.DayOfWeek.ToString()+ ", ", "")
    
        3
  •  3
  •   user7116 hacken    15 年前

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

    public static string CorrectedLongDatePattern(CultureInfo cultureInfo)
    {
        var info = cultureInfo.DateTimeFormat;
    
        // This is bad, mmmkay?
        return Regex.Replace(info.LongDatePattern, "dddd,?",String.Empty).Trim();
    }
    
        4
  •  2
  •   David Rutten    15 年前

    如果长日期序列也是特定于文化的,那么恐怕你运气不好,你必须为此编写实际的代码。否则,一个集合 formatting tags 会成功的。

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

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

        5
  •  1
  •   Curt    9 年前

    这是一个古老的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;
     }
    
        6
  •  1
  •   Nagama Inamdar    7 年前

    我已根据Bart Calixto的建议扩展到解决dd-mmm-yy yy格式问题(在澳大利亚,我们也使用英国日期格式dd/mm/yy)

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

    此代码修复了问题(我的版本是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
    

    在调用你需要设置文化的函数之前,我是在从 http://ipinfo.io

    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日

    亚当,你同意这解决了你提到的格式问题吗?

    谢谢巴特,代码很好。

    别忘了添加 Dim cult As System.Globalization.CultureInfo 之后 继承system.web.ui.page

        7
  •  0
  •   itsclarke    8 年前

    为什么不把长日期去掉工作日出现的第一部分呢?

    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
    
        8
  •  0
  •   Bart Calixto    8 年前

    旧的帖子,但我用的是:

    public static string ToLongDateWithoutWeekDayString(this DateTime source)
    {
        return source.ToLongDateString()
                     .Replace(source.DayOfWeek.ToString(), "")
                     .Trim(',', ' ');
    }
    
        9
  •  0
  •   Michal Kováč    6 年前

    我的解决方案:

    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);
    
        10
  •  0
  •   franzo    6 年前

    改进已接受的答案, 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() .

    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()); 
    }
    
        11
  •  0
  •   VDWWD    6 年前

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

    string formattedDate = DateTime.Now.ToLongDateString().Replace(System.Globalization.DateTimeFormatInfo.CurrentInfo.GetDayName(DateTime.Now.DayOfWeek), "").TrimStart(", ".ToCharArray());
    
        12
  •  -1
  •   waqasahmed    15 年前

    尝试:

    DateTime time = ....
    string formmattedDate = time.Day.ToString() + " " + time.ToString("MMMM");
    
        13
  •  -1
  •   Rafael Herscovici    11 年前

    怎么了?

    var ci = CultureInfo.CreateSpecificCulture("nl-NL");
    var date1 = DateTime.ParseExact(date, "dd MMM yyyy", ci);
    
        14
  •  -1
  •   Mindless    10 年前

    只需指定格式:

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