【问题标题】:datatable datetime column dont have milliseconds数据表日期时间列没有毫秒
【发布时间】:2015-10-09 03:31:57
【问题描述】:

我的数据库列中有一个日期时间值为 yyyy-MM-dd HH:mm:ss.fff。

但是当我将它放入 .net 数据表并将其作为 DateTime...我没有得到毫秒部分。

我是否缺少任何类型的演员表?

Convert.ToDateTime(dtRow[colIndex])

这是我的代码,其中 dtRow 是我的数据表中的特定列。

编辑:

String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}", Convert.ToDateTime(dtRow[colIndex]))

“2014-07-28 15:18:43.000”

其中实际值为“2014-07-28 15:18:43.866”。

谢谢!

【问题讨论】:

  • 它不是字符串 - 它是日期时间数据类型。
  • 您如何访问结果集?您为什么尝试将其解析为字符串?如果您使用 ADO.NET 和 SqlDataReader,只需调用其 GetDateTime 方法。无需转换任何东西。
  • 这是数据表,不是数据读取器——我正在处理大量数据。
  • 放弃Convert.ToDateTime 电话。如果值已经是DateTime,则无需转换任何内容。

标签: c# datetime datatable milliseconds


【解决方案1】:

我遇到了这个导致我来到这里的问题。默认的“ToString”使用 CurrentCulture,它(最有可能)使用保留毫秒的格式。因此解析等不起作用,因为这会将其转换为字符串(这是问题!)并再次返回,从而删除 ms。

但是,“对象”是 DateTime。这意味着您可以简单地将项目转换为 DateTime 变量并使用它。在我的例子中,我有一个来自 SQL 语句的日期时间,我需要将其存储为字符串 - 并注意到它们在解析时都有 .000 毫秒。

我的特殊要求是我不知道列的类型 - 因此最后是默认的 ToString。

private static string ConvertFieldToString(DataRow row, string fieldName)
{
  if (row.IsNull(fieldName))
     return null;

  if (row[fieldName].GetType() == typeof(DateTime))
  {
     DateTime dt = (DateTime)row[fieldName];
     return dt.ToString("yyyy-MM-dd hh:mm:ss.fff tt");
  }
  return row.ToString();
}

输出将如下所示:2018-04-18 03:30:43.233 PM

在 MSDN 上阅读更多信息:https://msdn.microsoft.com/en-us/library/k494fzbf(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    这将为您解决问题

    DateTime dt = DateTime.Parse(dtRow[colIndex]);
    String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}", dt)
    

    【讨论】:

    • 请查看我的编辑...如果值存在,您的代码将打印毫秒...但数据表本身会以某种方式削减该值。
    • 您需要在从 SQL 获取数据时执行String.Format,然后数据也会出现在datatable 中。请显示您从SQLDataTable 获取值的代码
    • 我作为 select * from table1 查询。
    【解决方案3】:

    试试这个:

    string dateString = dtRow[colIndex];
    string format = "yyyy-MM-dd HH:mm:ss.fff";
    
    DateTime result = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
    Console.WriteLine("{0} converts to {1}.", dateString, String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}", result));
    

    【讨论】:

      【解决方案4】:
          static void Main(string[] args)
          {
              var dt = new DataTable();
              dt.Columns.Add("id", typeof(int));
              dt.Columns.Add("date", typeof(DateTime));
      
              for (int i = 0; i < 10; ++i)
              {
                  var r = dt.NewRow();
                  r[0] = i;
                  r[1] = DateTime.Now.AddMinutes(-i);
                  dt.Rows.Add(r);
              }
      
              foreach (var r in dt.Rows.OfType<DataRow>())
              {
                  Console.WriteLine("{0} - {1:yyyy-MM-dd HH:mm:ss.fff}", r[0], r[1]);
              }
      
              Console.ReadLine();
          }
      

      如果添加到DataTable 的值是DateTime,你不需要转换任何东西,它已经是DateTime,格式化函数会很好地解决所有问题。如果您需要以编程方式访问单个属性,只需强制转换:

      DateTime timestamp = (DateTime)r[1];
      

      【讨论】:

        猜你喜欢
        • 2011-08-29
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 2018-10-15
        相关资源
        最近更新 更多