将日期和时间字符串合并为一个 DateTime

3

给定两个具有以下值的字符串:

31/05/2013 0:00:00
21:22

什么是将它们合并成一个DateTime数据类型的最有效方法,以获得以下结果:
31/05/2013 21:22

第一个字符串中的时间部分 "0:00:00" 将被忽略,将使用第二个字符串中的 "time"。

你的“ignored”的意思是可以是任何值吗? - Mare Infinitus
是的,它可以是任何值,例如“31/05/2013 12:34:12”,而不是“31/05/2013 0:00:00”。 - Willy
8个回答

8

使用TimeSpan对象和DateTime.Add(yourTimeSpan);,例如:

DateTime dt = new DateTime(2013,05,31);
var dts = dt.Add(new TimeSpan(0, 21, 22, 0, 0));

进一步扩展答案,您可以先解析日期和时间,例如:

DateTime dt = DateTime.Parse("05/31/2013 0:00:00");
TimeSpan ts = TimeSpan.Parse("21:22");
var dts = dt.Add(ts);

请记住,我不会检查错误的日期或时间值。如果您不确定值是否为真实日期/时间,请使用DateTime.TryParse并妥善处理。


3
这是一个概念示例--他只需解析它。 - George Johnston
或者他可以使用操作符 + (DateTime s, TimeSpan t) - It'sNotALie.
DateTime.Parse/TryParse都非常快。如果你有很多解析错误,TryParse比捕获Parse将抛出的异常更快(这就是它存在的原因)。但是,如果你的日期格式不总是相同的话,这会变得更加棘手,所以希望它们是一致的,并且全球化上下文可以帮助你解决问题。最坏的情况是你可以使用TryParseExact方法,但是由于它必须解析你的表达式,然后解析日期,所以速度要慢得多。即便如此,如果一个人输入这些字符串,它仍然非常快。 - sammy_winter

1
按照@George所说,将第一个值解析为DateTime,然后将另一个值解析为TimeSpan,最后将TimeSpan添加到第一个解析的值中。
另一种选择是获取第一个值的前10个字符的子字符串,并将其与第二个值连接起来,并将其解析为DateTime。

0

假设第一个字符串叫做one,第二个字符串叫做two,只需执行以下操作:

DateTime result = DateTime.Parse(one).Date + DateTime.Parse(two).TimeOfDay;

0
string strDate = "31/05/2013 0:00";
string strTime = "21:22";
strDate = strDate.Replace("0:00", strTime);
DateTime date = Convert.ToDateTime(strDate);

0

如果你刚开始只有字符串,你可以这样做:

var dateString = "31/05/2013 00:00";
var timeString = "21:22";
var dateTimeString = dateString.Substring(0, 11) + timeString;
var output = DateTime.ParseExact(dateTimeString, "dd/MM/yyyy HH:mm", null);

假设您确信此格式不会改变(这是一种危险的假设),那么这将有效。否则,您将不得不分别解析日期和时间字符串,并像其他人建议的那样使用传统的日期操作。例如:

var ci = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
var dateString = "31/05/2013 00:00";
var timeString = "21:22";
var output = DateTime.Parse(dateString, ci) + TimeSpan.Parse(timeString, ci);

0
  DateTime date = DateTime.ParseExact("31/05/2013 0:00:00", "dd/MM/yyyy h:mm:ss", CultureInfo.InvariantCulture);
  TimeSpan span = TimeSpan.ParseExact("21:22", "t", CultureInfo.InvariantCulture);
  DateTime result = date + span;

0
如果你真的只涉及到字符串,那么:
string strDate = "31/05/2013 0:00:00";
string strTime = "21:22";
string strDateTime = strDate.Split(' ')[0] + " " + strTime;

0
如果您可以安全地假设您得到的是两位数的月份和日期,四位数的年份以及日期后面有一个空格:
var date = "31/05/2013 0:00:00";
var time = "21:22";
var dateTime = DateTime.Parse(date.Substring(0,11) + time);

如果输入格式的假设不够坚实,您可以使用正则表达式来提取日期,而不是使用Substring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接