0

我正在从 excel 文件中读取 2 列:

一列有值:07/11/2012

第二列有值: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)));

更新1:

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

3 回答 3

1

尝试DateTime.ParseExact方法

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);
于 2012-11-23T13:54:16.677 回答
1

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

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

您不应该只是盲目地调用ToString()值,而不了解类型是什么:通常它正是正确的类型,并且您可以为自己节省可能有损失的字符串转换。


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

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

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

然后像这样将它们连接在一起:

DateTime combined = date.Date + time.TimeOfDay;

或者,您可以使用我的Noda Time库,它有单独的LocalDateLocalTime概念,可以很容易地组合成一个LocalDateTime...

于 2012-11-23T13:54:48.080 回答
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;
于 2012-11-23T14:00:35.167 回答