加入1个日期字符串+ 1个时间字符串并转换为datetime

时间:2012-11-23 13:51:00

标签: c# datetime

我从excel文件中读取2列:

一列有价值: 2012年7月11日

第二列有价值: 18:45

当我阅读第二列时,它实际上显示了它前面的默认日期。         dr [3] .ToString()“30/12/1899 6:45:00 PM”string

我想加入第二列的第一列。但是现在我有正常的输入格式异常

我尝试使用字符串操作

从第二列中删除日期部分

这是我的代码

 DateTime dateEvent = DateTime.Parse(dr[1].ToString());
        dateEvent.Add(TimeSpan.Parse(dr[3].ToString().Substring(dr[3].ToString().IndexOf(" ")+1)));

Udpate 1:

DateTime dateEvent = DateTime.ParseExact(string.Format("{0} {1}", dr[1].ToString(), dr[3].ToString().IndexOf(" ") + 1), "dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture);

3 个答案:

答案 0 :(得分:1)

尝试DateTime.ParseExact method

string date = dr[1].ToString();
string time = dr[3].ToString();
time = time.Substring(time.IndexOf(' ') + 1);
DateTime.ParseExact(string.Format("{0} {1}", date, time), "dd/MM/yyyy HH:mm:ss tt", CultureInfo.InvariantCulture);

答案 1 :(得分:1)

编辑:再看一遍,我强烈怀疑你根本不需要进行任何解析。我怀疑你可以使用:

DateTime date = ((DateTime) dr[1]).Date;
TimeSpan time = ((DateTime) dr[3]).TimeOfDay;
DateTime combined = date + time;

你不应该盲目地调用值ToString(),而不要理解类型是什么:通常它是正确的类型,你可以节省一些可能有损的字符串转换。


假设您进行解析(而不是让Excel为您转换为DateTime),我建议对这两个部分使用DateTime.ParseExact

  • 对于第一部分,请使用dd/MM/yyyy
  • 格式
  • 对于第二部分,请使用dd/MM/yyyy hh:mm tt
  • 格式

我建议明确使用不变文化 - 假设你真的知道这种格式是完全修复的。 (如果你不这样做,那就是一个更大的问题。)

然后像这样加入他们:

DateTime combined = date.Date + time.TimeOfDay;

或者,您可以使用我的Noda Time库,该库具有单独的LocalDateLocalTime概念,可以轻松组合到LocalDateTime ...

答案 2 :(得分:1)

我建议您使用DateTime.ParseExact,以便具体说出您需要的日期部分。

var date = DateTime.ParseExact(dr[1], "dd/MM/yyyy", CurrentCulture.InvariantCulture).Date;
var time = DateTime.ParseExact(dr[3], "HH:mm", CurrentCulture.InvariantCulture).TimeOfDay;
var eventDate = date + time;