我想将任何列的日期动态格式化为yyyy-MM-dd
。我知道我可以有条件地将特定列设置为此日期格式,但是否有任何方法可以为具有日期的所有列动态执行此操作。目前我在这里使用的try catch
适用于所有日期,但问题是任何不是日期的列,即 3.8707 的值将变为01/03/8707
csv输出
foreach (var array in from DataRow myrow in dt.Rows select row.ItemArray)
{
for (i = 0; i < array.Length; i++)
{
try
{
DateTime date = DateTime.Parse(array[i].ToString());
swOut.Write(date.Year + '-' + date.Month + '-' + date.Day + ",");
}
catch (Exception)
{
swOut.Write(array[i] + ",");
}
}
swOut.WriteLine();
}
答案 0 :(得分:1)
您应该使用已经可用的功能,而不是制作自己的日期时间格式解析器。当您知道确切的格式时,DateTime.TryParseExact是您在日期中转换字符串的工具。如果您知道CSV中存在日期的格式,那么以您喜欢的字符串格式转换日期是另一项任务,可以通过覆盖特定于日期时间的ToString()轻松解决。
在您的代码中,您使用的是try catch会降低性能。
string[] values = lines1[i].Split(',');
if (values.Length >= 3)
{
DateTime dt;
if (DateTime.TryParseExact(values[0], "d-MMM-yyyy",
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None, out dt))
{
values[0] = dt.ToString("yyyy-MM-dd");
lines1[i] = String.Join(",", values);
}
}
答案 1 :(得分:1)
Click here 并使用我编写的扩展方法Extensions
复制静态类 toDate(...)
(不要忘记添加using System.Globalization;
)。
如果您正在使用它,您可以像这样做,而不必捕获异常:
var arrayItems = from DataRow myrow in dt.Rows select row.ItemArray;
foreach (var array in arrayItems)
{
for (var i = 0; i < array.Length; i++)
{
var strItem = (array[i] ?? "").ToString();
var date=strItem.toDate("yyyy-MM-dd");
if (!date.HasValue) {
swOut.Write(strItem + ",");
}
else
{
swOut.Write(date.Value.Year + '-' +
date.Value.Month + '-' + date.Value.Day + ",");
}
}
swOut.WriteLine();
}
请注意如果您必须匹配其他数据格式,只需更改功能.toDate("yyyy-MM-dd")
中的参数即可。您甚至可以指定多种可接受的数据格式,如下所示:
string[] dateFmt = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
然后在循环内部你可以使用它:
var date=strItem.toDate(dateFmt);
这样,它们将被解释和解析,然后它们将被转换为YYYY-MM-dd
并写入.csv
文件,正如您在Write
语句中指定的那样for
循环。
答案 2 :(得分:0)
您可以检查列的类型。像这样:
if(array[i] is DateTime)
{
var date=(DateTime)array[i];
swOut.Write(date.Year + '-' + date.Month + '-' + date.Day + ",");
}
else
swOut.Write(array[i] + ",");