【问题标题】:Convert DateTime in DataRow to a formatted date string将 DataRow 中的 DateTime 转换为格式化的日期字符串
【发布时间】:2016-12-27 01:47:06
【问题描述】:

我希望有些东西我看不清楚,但为了简化,我有以下代码

foreach (DataRow row in dt.Rows)
{
  row["StartOn"] = Convert.ToDateTime(row["StartOn"].ToString()).ToString("MMM dd").ToString();
}

如果我运行以下代码,我会得到“Aug 09”

Convert.ToDateTime(row["StartOn"].ToString()).ToString("MMM dd").ToString();

如果我在此更改后查看行 [“StartOn”] 中的内容,它包含“8/9/2016 12:00:00 AM”

我无法将我的 DataRow 格式化为“MMM dd”格式

【问题讨论】:

  • 格式化后你希望看到什么? MMM 是月份的缩写。 dd 是日期。所以你得到的是正确的。
  • 由于迭代每一行,我想将“8/9/2016 12:00:00 AM”的行值转换为“Aug 09”的字符串值。似乎当我尝试替换 row["StartOn"] 值时,它失败了。因为它不保存新的格式化字符串。迭代完成后,DataRow 仍会显示“8/9/2016 12:00:00 AM”
  • 您正试图将“Aug 9”字符串存储到日期时间中。 ConvertToDatetime 会将其放回 DateTime 对象中,假设由于您不提供它,所以年份是 2016 年,时间是上午 12:00,即一天的开始
  • 将列类型更改为字符串。
  • 不,不要将列类型更改为字符串。相反,每当您要输出该列时,将其格式化为仅输出月份和日期。没有理由不能在数据库中拥有完全限定的 DateTime,而只是在要输出或以任何其他方式使用时才使用月份和日期

标签: c# datetime datatable datarow


【解决方案1】:

StartOn 显然是 DateTime 类型。 DateTime 类型没有格式。它们是指定年、月、日期和时间(以及其他内容)的对象。您在转换中所做的只是去除时间,以便新日期时间的时间为上午 12:00。

【讨论】:

  • 是的,这正是我想做的,时间与我无关,我需要将 DataRows 值替换为“Aug 09”
  • 你不懂。您不能只将字符串存储在 DateTime 类型对象中。很明显,表格行的“StartOn”字段是一个 DateTime 对象。因此,为了将该字符串放入“StartOn”,您正在执行 Convert.ToDateTime,它添加了 DateTime 对象所需的所有信息(年、月、日、时间等)
  • 知道了,我的印象是 row["StartOn"] 仍然是 DataRow 类型,它的值可以用字符串替换。是创建新数据表并向新表添加字符串值的最佳解决方案吗?
  • 不,您可能不需要将“StartOn”替换为任何内容。将其保留为完全限定的 DateTime。然后,无论何时使用它,用于输出或其他任何您想要的,您都可以只使用您感兴趣的部分。
  • 您可能缺少的是这样一个事实,即在 C# 中,当您从数据表中获取一行并使用字符串对其进行索引时,您正在引用其中的特定列(或字段)表行。具有您的字符串给出的名称的列(或字段)。
【解决方案2】:

dt.Columns["StartOn"] 是什么。我怀疑这是DateTime。让我将您的单行代码分解为 2 行。

string s = Convert.ToDateTime(row["StartOn"].ToString()).ToString("MMM dd").ToString();
row["StartOn"] = s;

在第 1 行中,您将 DateTime 对象转换为字符串对象。但是在第 2 行,您隐式地将 string 转换为 DateTime

var dt = new DataTable();
dt.Columns.Add("StartOn", typeof(DateTime));
dt.Rows.Add(DateTime.Today);

foreach (DataRow row in dt.Rows) {
    var data = Convert.ToDateTime(row["StartOn"].ToString()).ToString("MMM dd").ToString();
    Console.WriteLine($"Type of stored data is: {data.GetType()}");
    row["StartOn"] = data;
}

// fetch the data
var fetchedData = dt.Rows[0][0];
Console.WriteLine($"Type of Fetched Data is: {fetchedData.GetType()}");

顺便说一句,您可以使用以下行进行转换

((DateTime)row["StartOn"]).ToString("MMM dd");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2015-10-11
    • 2013-12-28
    相关资源
    最近更新 更多