【问题标题】:How to format datetime column of datatable to "dd/MMM/yyyy hh:mm:ss tt" - "01/jan/2016 01:00:11 PM"如何将数据表的日期时间列格式化为“dd/MMM/yyyy hh:mm:ss tt”-“01/jan/2016 01:00:11 PM”
【发布时间】:2016-05-16 10:15:28
【问题描述】:

我有包含多个日期时间列的数据表,现在日期时间格式为 dd/MM/yyyy hh:mm:ss tt,这给了我输出 01/01/2016 10:00:00 AM 我想将其格式化为 dd /MMM/yyyy hh:mm:ss tt,预期输出 01/Jan/2016 10:00:00 AM。

我尝试了this,但它没有进行转换。

我的数据表有值

    timestamp
    06/01/2016 1:32 PM
    06/01/2016 3:33 AM
    07/01/2016 4:42 AM

    string query = "SELECT t1.[timestamp] FROM [REPORT] t1";
                    //I should not change this because i am not supposed to give alias name to column as per requirement
                    using (SqlConnection con = new SqlConnection(connectionString))
                    {
                        SqlCommand cmd = new SqlCommand(query, con);
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
                        DataTable dt = new DataTable();
                        dt=ds.Tables[0];
                        //dt REsult is 
                            //2016-01-06 03:33:27.810
                            //2016-01-06 03:33:27.810
                        // expected result is 
                            //2016/Jan/06 03:33:27.810
                            //2016/Jan/06 03:33:27.810
 foreach (DataColumn dcol in dt.Columns)
                {
                    if (dcol.DataType == typeof(DateTime))
                    {
                        dt.Columns[dcol.ColumnName].Convert(val => DateTime.Parse(val.ToString()).ToString("dd/MMM/yyyy"));
                    }
                }
                        dataGridView1.DataSource = dt;


                        dataGridView1.BindingContext = new BindingContext();

                    }

【问题讨论】:

  • 你能展示你的代码吗?
  • 嗨,我已经更新了代码,你可以检查一下

标签: c# winforms datatable


【解决方案1】:

DataTable 用于数据存储DataGridView 用于数据显示。所以保持表中的数据不变。更改网格中的格式数据显示。

dataGridView.Columns["timestamp"].DefaultCellStyle.Format = "dd/MMM/yyyy hh:mm:ss tt";

其中“时间戳”是您的列 DateTime 类型。
数据绑定后设置该属性。

【讨论】:

  • 这也是正确的,但如果你没有将它绑定到gridview,例如直接从windows服务导出到excel,它不会有帮助。所以在数据表级别这样做很重要,这样解决方案对任何情况都是可行的
【解决方案2】:

更改数据表数据类型的最佳方法是将数据表克隆为新数据表,然后克隆数据表将只有列名,没有数据。由于数据表没有数据,我们可以更改列的数据类型,然后将数据导入克隆数据表,并格式化日期时间,这将解决问题。示例代码如下:

当您应该只绑定 datagridview 时,您可以简单地使用:(另一个用户提供的答案

dataGridView.Columns["timestamp"].DefaultCellStyle.Format = "dd/MMM/yyyy hh:mm:ss tt";



string query = "SELECT t1.[timestamp] FROM [REPORT] t1";
            //I should not change this because i am not supposed to give alias name to column as per requirement
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand(query, con);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                DataTable dt = new DataTable();
                dt = ds.Tables[0];
                //dt REsult is 
                //2016-01-06 03:33:27.810
                //2016-01-06 03:33:27.810
                // expected result is 
                //2016/Jan/06 03:33:27.810
                //2016/Jan/06 03:33:27.810
                //foreach (DataColumn dcol in dt.Columns)
                //{
                //    if (dcol.DataType == typeof(DateTime))
                //    {
                //        dt.Columns[dcol.ColumnName].Convert(val => DateTime.Parse(val.ToString()).ToString("dd/MMM/yyyy"));
                //    }
                //}
                DataTable dtClone = new DataTable();
                List<string> colNameDateTime = new List<string>();
                dtClone = mysource.Clone();
                foreach (DataColumn dcol in dtClone.Columns)
                {
                    if (dcol.DataType == typeof(DateTime))
                    {
                        colNameDateTime.Add(dcol.ColumnName.ToString());
                        dtClone.Columns[dcol.ColumnName].DataType = typeof(string);
                    }
                }

                //foreach (DataColumn dcol in dtClone.Columns)
                //{
                foreach (DataRow dr in mysource.Rows)
                {
                    dtClone.ImportRow(dr);

                }
                //}
                foreach (DataColumn dcol in dtClone.Columns)
                {
                    if (colNameDateTime.Count > 0)
                    {
                        for (int i = 0; i < colNameDateTime.Count; i++)
                        {
                            if (colNameDateTime[i] == dcol.ColumnName.ToString())
                            {
                                dtClone.Columns[dcol.ColumnName].Convert(val => DateTime.Parse(val.ToString()).ToString("dd/MMM/yyyy hh:mm:ss tt"));
                            }
                        }
                    }
                }
                dataGridView1.DataSource = dtClone;


                dataGridView1.BindingContext = new BindingContext();

            }



static class ExtensionHelper
    {
public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
        {
            foreach (DataRow row in column.Table.Rows)
            {
                row[column] = conversion(row[column]);
            }
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多