从 SqlDataReader 读取的字符串的正确日期格式

Proper date formatting of string read from a SqlDataReader

我正在从 SqlDataReader 读取日期字段,我想将其写入标签。

我的这一行代码如下所示:

lblTDate.Text = string.Format("{0:D}", (DT2(["TDate"].ToString()));

标签显示,例如,“4/7/2016 12:00:00 AM”,但我希望它显示 "Sunday, April 07, 2016"。

我在 this site 上读到,使用 {0:D} 应该可以,但它不起作用。

SQL 服务器 table 中的字段是 Date 字段,而不是 DateTime 字段,这使得时间显示更加令人费解向上。但是,无论如何,我怎样才能让我的标签以我想要的格式显示日期?

试试这个:

lblTDate.Text = Convert.ToDateTime(DT2["TDate"]).ToString("dddd, MMMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture);
CultureInfo culture = new CultureInfo("en-Us");
DateTimeFormatInfo dtfi = culture.DateTimeFormat;

var myDate = new DateTime(2016, 7, 4, 12, 0, 0);

string month = culture.TextInfo.ToTitleCase(dtfi.GetMonthName(myDate.Month));
string dayOfWeek = culture.TextInfo.ToTitleCase(dtfi.GetDayName(myDate.DayOfWeek));
string fullDate = $"{dayOfWeek}, {month} {myDate.Day}, {myDate.Year}";

Console.Write(fullDate);

您不希望在将 indexer 返回的对象传递给 String.Format 之前将其转换为字符串。通过省略 ToString 调用,您将得到您想要的。

lblTDate.Text = string.Format("{0:D}", DT2["TDate"]);

这使 String.Format 实现可以使用 DateTime 类型的 IFormattable 实现,这使得您找到的格式字符串可以工作。一旦它是一个字符串,String.Format 实现就无法知道要做什么。

或者将值转换为 IFormattable 接口,如下所示:

var fmt = DT2["creationdate"] as IFormattable;
if (fmt != null)
{
    lblTDate.Text = fmt.ToString(
        "dddd, MMMM dd, yyyy",
        System.Globalization.CultureInfo.InvariantCulture);
}

但是您必须提供一个 IFormatProvider 实现,通常以 CultureInfo 实例的形式 class。

请注意,在上述两个选项中,您不必先将值转换为 DateTime。