C# 连接1个日期字符串+;1时间字符串并转换为日期时间

C# 连接1个日期字符串+;1时间字符串并转换为日期时间,c#,datetime,C#,Datetime,Iam从excel文件读取2列: 一列具有以下值: 2012年11月7日 第二列具有以下值: 18:45 当我阅读第二列时,它实际上在前面显示了一个默认日期。 dr[3]。ToString()“30/12/1899 6:45:00 PM”字符串 我想把第一列和第二列连接起来。但现在我有正常的输入格式例外 我试图通过字符串操作从第二列中删除日期部分 这是我的密码 DateTime dateEvent = DateTime.Parse(dr[1].ToString()); date

Iam从excel文件读取2列:

一列具有以下值: 2012年11月7日

第二列具有以下值: 18:45

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

我想把第一列和第二列连接起来。但现在我有正常的输入格式例外

我试图通过字符串操作从第二列中删除日期部分

这是我的密码

 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);
尝试:

尝试:


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

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;

或者,您可以使用我的库,它有单独的
LocalDate
LocalTime
概念,可以轻松组合成
LocalDateTime

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

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;
或者,您可以使用我的库,它有单独的
LocalDate
LocalTime
概念,可以很容易地组合成
LocalDateTime

我建议使用,这样您就可以明确地说出您需要的日期部分,例如

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;
我建议使用,这样你就可以明确说出你需要的日期的哪些部分

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;

同样的例外:看看我的代码:DateTime dateEvent=DateTime.ParseExact(string.Format(“{0}{1}”、dr[1].ToString()、dr[3].ToString().IndexOf(“”+1)、“dd/MM/yyyyy HH:MM”、CultureInfo.InvariantCulture);为什么
dr[3].ToString().IndexOf(“”+1)
??不应该是dr[3]。ToString()?dr[3]返回的是一个日期+一个时间,即使在excel文件中它只是一个时间18:45确定。将我的答案更新为仅使用时间。您正在查找的是
子字符串,而不是
IndexOf
相同的异常:查看我的代码:DateTime dateEvent=DateTime.ParseExact(string.Format({0}{1}),dr[1]。ToString(),dr[3]。ToString().IndexOf(“”+1),“dd/MM/yyyy HH:MM”,CultureInfo.InvariantCulture);为什么
dr[3].ToString().IndexOf(“”+1)
??不应该是dr[3]。ToString()
?dr[3]返回的是一个日期+一个时间,即使在excel文件中它只是一个时间18:45确定。将我的答案更新为仅使用时间。您正在查找的是
子字符串,而不是
IndexOf
@LuisEValencia:是的-看起来您正在毫无原因地进行字符串转换。(编辑…)指定的强制转换的第一行无效。我被告知,我们可以假定格式始终为DD-MM-YYYY。dr[3]=“07/11/2012”@LuisEValencia:你调试过它了吗,看看实际的类型是什么?(如果是字符串,请转换为该字符串,而不是调用
ToString
)我强烈建议您尽可能避免解析。如果您确实需要解析,请参阅我编辑的代码-现在您已经告诉我们时间字符串的格式,应该可以了。我将第一行更改为DateTime date=(DateTime.parse(dr[1].ToString()).date;但它不起作用fine@LuisEValencia:我仍然会试图弄清为什么您不能从
日期时间
开始获取它。“转换越少越好。@LuisEValencia:是的,看起来你在毫无理由地进行字符串转换。”。(编辑…)指定的强制转换的第一行无效。我被告知,我们可以假定格式始终为DD-MM-YYYY。dr[3]=“07/11/2012”@LuisEValencia:你调试过它了吗,看看实际的类型是什么?(如果是字符串,请转换为该字符串,而不是调用
ToString
)我强烈建议您尽可能避免解析。如果您确实需要解析,请参阅我编辑的代码-现在您已经告诉我们时间字符串的格式,应该可以了。我将第一行更改为DateTime date=(DateTime.parse(dr[1].ToString()).date;但它不起作用fine@LuisEValencia:我仍然会试图弄清为什么您不能从
日期时间
开始获取它。转化率越低越好。