DataTable 转 CSV 日期格式
Posted
技术标签:
【中文标题】DataTable 转 CSV 日期格式【英文标题】:DataTable to CSV date format 【发布时间】:2014-12-26 18:09:07 【问题描述】:我正在尝试将包含多个列的 DataTable 导出为 CSV。我希望将 date_time 列导出为 CSV,同时保留数据库 date_time 格式 (YYY-MM-DD HH:mm:ss) 或类似的格式。
这是我的代码:
private void DataTableToCsv(string path, DataTable dt)
File.Delete(path);
StringBuilder sb = new StringBuilder();
string[] columnNames = dt.Columns.Cast<DataColumn>().
Select(column => column.ColumnName).
ToArray();
sb.AppendLine(string.Join(",", columnNames));
foreach (DataRow row in dt.Rows)
string[] fields = row.ItemArray.Select(field => field.ToString()).
ToArray();
sb.AppendLine(string.Join(",", fields));
File.WriteAllText(path, sb.ToString());
日期以不同的格式显示,这在我尝试从 mysql 中提取时出现错误。
【问题讨论】:
什么你得到了什么错误? 那么你必须显示你在哪里填写DataTable
,但是这个问题应该在另一个问题中解决。
这个问题是关于导出的,但是你提到了一个关于导入的问题。在哪里导入?
为清晰起见已编辑问题
【参考方案1】:
我知道已经有一个公认的答案,但是...
实际上有一种方法可以以一致的方式控制日期的格式,而无需为每种类型的数据指定格式:您可以使用IFormatProvider
首先,不带参数的object.ToString();
方法是使用您的线程/应用程序/系统中设置的当前 CultureInfo 来格式化您的对象。当您需要一致的格式时,这是有问题的,例如当您尝试将值保存到数据库中时。这不仅对日期有问题,对数字也有问题——例如,有些语言使用逗号作为小数分隔符或在数字中使用千位分隔符,而数据库不太喜欢这样。现在假设您的程序在具有不同语言集的计算机上运行...
话虽如此,但使用object.ToString(CultureInfo.InvariantCulture);
可以避免其中的许多问题。它与英语有关。那么,2014 年 10 月 31 日的结果将是:10/31/2014 08:35:52
显然仍然不是你想要的。
您可以通过自己稍微修改文化来进一步控制格式:
CultureInfo format = (CultureInfo) CultureInfo.InvariantCulture.Clone();
// those are the formats used by ToString() mathod:
format.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
format.DateTimeFormat.ShortTimePattern = "HH:mm:ss";
Console.WriteLine(DateTime.Now.ToString(format));
double ddd=13.11;
Console.WriteLine(ddd.ToString(format));
string sss = "some string";
// although this may not be a good idea:
Console.WriteLine(sss.ToString(format));
结果:
2014-10-31 08:39:53
13.11
some string
【讨论】:
感谢您的见解 Arie - 一个非常有帮助的答案,我将牢记在未来。 +1【参考方案2】:使用DateTime
值,您可以通过调用来控制输出
dateTimeField.ToString("yyyy-dd-MM");
目前您对所有字段一视同仁,并使用默认转换:
field => field.ToString()
您不能指定转换,因为object.ToString()
没有重载可以这样做;您必须分别为每种类型指定要使用的转换,即:
string[] fields = row.ItemArray.Select(field => ConvertToCsvValue(field)).ToArray();
和
static void ConvertToCsvValue(object value)
if (value is DateTime)
return ((DateTime)value).ToString("yyyy-dd-MM");
else
return value.ToString();
【讨论】:
【参考方案3】:数据库中的数据不知道任何格式;您遇到的行为与此相关并且是正确的。 填充 csv 时,您的代码采用 env/os/locale 的默认格式并将其应用于值。
要解决问题,您有一些可能的解决方案:
您更改了源 sql 代码以生成一个填充了格式化数据的 sql 文本字段(恕我直言,这是一个糟糕的选择)
您在准备 csv 时处理格式客户端;您必须修改代码以将正确的格式应用于日期字段一一处理字段
您更改数据表内容,将预期格式应用于日期字段(这可能会也可能不会,具体取决于所涉及字段的数据类型)
我更喜欢第二种或第三种解决方案,因为我更喜欢在客户端保持格式,但 YMMV 和您的帖子中没有足够的信息来做出正确的选择。
【讨论】:
以上是关于DataTable 转 CSV 日期格式的主要内容,如果未能解决你的问题,请参考以下文章
DateTime.Now.ToString("HH:mm:ss.fff");我希望这部分日期格式输出到.CSV文件时就是这么显示。
编辑列日期格式后不显示过滤日期 - Laravel Yajra Datatable