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

时间:2009-09-08 16:45:54

标签: .net datetime internationalization datetime-format

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

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

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

修改

我希望看到的例子:

  • en-us:2009年12月5日
  • fr-fr:5décembre2009
  • 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

16 个答案:

答案 0 :(得分:8)

这似乎可以解决问题。

  1. 枚举所有有效的日期时间模式:CultureInfo.DateTimeFormat.GetAllDateTimePatterns
  2. 选择最长的模式(可能这是最佳匹配):
    • 是CultureInfo.DateTimeFormat.LongDatePattern的子字符串
    • 不包含“ddd”(短日名称)
    • 不包含“dddd”(漫长的一天名称)
  3. 这似乎是我想要的字符串。

    见下面的代码:

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

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

答案 1 :(得分:7)

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

答案 2 :(得分: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();
}

答案 3 :(得分:2)

如果LongDate序列也是特定于文化的,那么我担心你运气不好而且你必须为此编写实际代码。否则,formatting tags的集合将起作用。

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

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

答案 4 :(得分: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;
 }

答案 5 :(得分:1)

我已经扩展了Bart Calixto关于修复dd MMM yyyy格式问题的建议(在澳大利亚我们也使用英国日期格式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日

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

感谢Bart,这是非常好的代码。

别忘了在之后添加Dim cult As System.Globalization.CultureInfo 继承System.Web.UI.Page

答案 6 :(得分:1)

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

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

答案 7 :(得分: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

答案 8 :(得分:0)

旧帖子,但我用这个:

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

答案 9 :(得分: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. 从字符串
  4. 中的任何位置删除剩余的双倍空格

    对每种文化进行测试
    CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
    

答案 10 :(得分:0)

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

例如,GetAllDateTimePatterns('D')当前在美国返回此值:

"dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" 

这对于zh-HK:

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

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

def amifunc2(instance_id):

        client = boto3.client('ssm', region_name = 'us-east-1')

        ec2_response = client.send_command(
            InstanceIds=[
         instance_id
         ],
           DocumentName='AWS-RunShellScript',
            Parameters={
          'commands': [
               '#!/bin/bash',
---
               'admin_users=( user.number.1 user.number.2 user.number.3 user.number.4 )',
               'for i in ${admin_users[@]}; do aws ssm send-command --document-name "arn:aws:ssm:doc-name" --targets "Key=instanceids,Values=$instance_id" --parameters \'"{"username":["\'$i\'"]}"\' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-east-1 --query "Command.CommandId"; sleep 5; done',

示例:

2020年6月15日(zh-CN)
15.六月,2020(da-DK)
2020年6月15日(id-ID)

答案 12 :(得分:0)

这个问题有多少个答案有点搞笑(而且它仍然是一个问题)。不妨和我的解决方案一起加入派对:

    CultureInfo culture = CultureInfo.CurrentCulture; // or replace with the culture of your choosing

    string pattern = culture.DateTimeFormat.LongDatePattern
        .Replace("dddd, ", "")
        .Replace(",dddd", "");

    return dt.ToString(pattern, culture);

然后,无论一周中的哪一天在其余时间之前或之后,您都涵盖了这两种情况。

答案 13 :(得分:-1)

尝试:

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

答案 14 :(得分:-1)

出了什么问题:

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

答案 15 :(得分:-1)

只需指定格式:

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