【问题标题】:How to convert datetime field to string like 1st Feb 2011?如何将日期时间字段转换为字符串,如 2011 年 2 月 1 日?
【发布时间】:2016-06-15 07:27:33
【问题描述】:

如何在 C# 中将日期时间字段转换为格式为 1st Feb 2011 的字符串? doj 是 sql server 中的 datetime 字段。

string DateOfJoin = dt.Rows[0]["DOJ"].ToString();//2011-02-01 00:00:00.000

【问题讨论】:

  • 您的字符串是1st Jan 2015 还是2/1/2011 12:00:00 AM?该数据表中第一列的类型是什么?
  • 我需要这样的格式。日月年。我的字符串是 2/1/2011 12:00:00 AM
  • 2/1/2011 可以是1st Feb2nd Jan 不是 1st Jan
  • DataTime.ToString() 中已经有很多可用的格式。如果您想要更多定制的东西,您可以尝试在DateTime 上编写扩展方法。

标签: c# asp.net datetime


【解决方案1】:

首先,2/1/2011 可以是 2 月 1 日或 1 月 2 日不是 1 月 1 日。

其次,让我们将您的string 解析为DateTime

DateTime dt = DateTime.ParseExact(dt.Rows[0]["DOJ"].ToString(),
                                  "M/d/yyyy hh:mm:ss tt",
                                   CultureInfo.InvariantCulture);

或者您可以将其显式转换为DateTime

DateTime dt = (DateTime)dt.Rows[0]["DOJ"];

第三,.NET 在 BCL 中没有内置方式来生成日期后缀。但是Lazlowwrite a method 对我来说似乎没问题;

static string GetDaySuffix(int day)
{
    switch (day)
    {
        case 1:
        case 21:
        case 31:
            return "st";
        case 2:
        case 22:
            return "nd";
        case 3:
        case 23:
            return "rd";
        default:
            return "th";
    }
}

你可以像这样的方法;

string DateOfJoin = String.Format("{0}{1} {2}",
                                  dt.Day,
                                  GetDaySuffix(dt.Day),
                                  dt.ToString("MMM yyyy", CultureInfo.InvariantCulture));

生成

【讨论】:

  • 感谢您的努力。
  • @krishnamohan 很高兴为您提供帮助。
【解决方案2】:

使用下面的格式得到类似的不带后缀see explanation

 string DateOfJoin = dt.Rows[0]["DOJ"].ToString("dd MMMM yyyy");

但是,要获得后缀,您需要将其分解,以便将日期分开,即

string DateOfJoin = dt.Rows[0]["DOJ"].ToString("dd MMMM yyyy");

如果你真的需要后缀,我会在下面使用

string day = dt.Rows[0]["DOJ"].ToString("dd");
day = GetDaySuffix(Int32.Parse(day));

这个用一个函数来添加我原来找到的here的后缀

  string GetDaySuffix(int day)
{
    switch (day)
    {
        case 1:
        case 21:
        case 31:
            return "st";
        case 2:
        case 22:
            return "nd";
        case 3:
        case 23:
            return "rd";
        default:
            return "th";
    }
}



 string DateOfJoin = String.Format("{0} {1}", day, dt.Rows[0]["DOJ"].ToString("MMMM yyyy"));

未经测试,但应该是有用的开始

【讨论】:

    【解决方案3】:
    Var dt = DateTime.Parse(DateOfJoin);
    dt.ToString('F');
    

    更多格式见下页底部

    Msdn DateTime

    【讨论】:

    • F 作为char?我很确定没有这样的过载。
    【解决方案4】:

    根据指定的区域性,可以通过将对象转换为 DateTime 然后使用格式参数调用ToString() 来实现长日期字符串。

    string DateOfJoin = ((DateTime)dt.Rows[0]["DOJ"]).ToString("D");
    

    进一步参考here

    编辑:使用诸如“1st”、“2nd”之类的内容进行格式化需要您编写一个自定义方法来评估日期数并将正确的字符串附加到它上面,例如:

    private string GetSuffix(DateTime dt)
    {
       if(dt.Days % 10 == 1)
       {
          return dt.Days.ToString() + "st";
       }
       else if(dt.Days % 10 == 2)
       {
          return dt.Days.ToString() + "nd";
       }
       else if(dt.Days % 10 == 3)
       {
          return dt.Days.ToString() + "rd";
       }
       else
       {
          return dt.Days.ToString() + "th";
       } 
    }
    

    然后将这部分字符串添加到 DateTime 的 ToString("Y") 中,如:

    string DateOfJoin = GetSuffix((DateTime)dt.Rows[0]["DOJ"]) + " " + ((DateTime)dt.Rows[0]["DOJ"]).ToString("Y");
    

    【讨论】:

    • 根据 OP 的评论,第一列似乎不是 DateTime。
    • 得到这样的输出 - 2011 年 2 月 1 日,星期二。但我需要 2011 年 2 月 1 日
    【解决方案5】:

    可以使用以下方法完成此策略:

    DateTime date = new DateTime(2015, 01, 01);
    // 1st Jan 2015
    string s = Ordinal.Add(date.Day) + date.ToString(" MMM yyyy", System.Globalization.CultureInfo.InvariantCulture); 
    

    这里Ordinal类实现如下:

    static class Ordinal {
        public static string Add(int num) {
            if(num <= 0) return num.ToString();
            switch(num % 100) {
                case 11:
                case 12:
                case 13:
                    return num + "th";
            }
            switch(num % 10) {
                case 1: return num + "st";
                case 2: return num + "nd";
                case 3: return num + "rd";
                default: return num + "th";
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      试试这个

       string DateOfJoin =Convert.ToDateTime( dt.Rows[0]["DOJ"]).ToString("dd MMMM yyyy HH:mm:ss");
       string DateOfJoin =Convert.ToDateTime( dt.Rows[0]["DOJ"]).ToString("dd MMMM yyyy");
      

      【讨论】:

      • 给出错误 - 方法 tostring 没有重载需要一个参数
      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多