我有一个理论为什么下面的代码没有产生我需要的结果:
endDate = DateTime.UtcNow.AddDays(1).ToShortDateString() + " " +
DateTime.UtcNow.TimeOfDay.Subtract(
new TimeSpan(0, 0, 0, 0, DateTime.UtcNow.TimeOfDay.Milliseconds));
处理器必须计算DateTime.UtcNow.TimeOfDay.Milliseconds
,并且由于CPU的单个时间长度(以及处理此属性并返回结果的时间),它不表示{{1}将减去DateTime.UtcNow.TimeOfDay.Milliseconds
我需要知道,从DateTime.UtcNow.TimeOfDay
中删除毫秒数的最简单,最有效的方法是什么,而不必使用大量的处理器时间?此应用程序我很大,这个问题很简单。但是当部署此应用程序时,它没有空间使其不稳定。必须修剪此毫秒,因为它被发送到SQL Server中的存储过程,并且此特定存储过程不支持DateTimes上的毫秒。我也经常遇到这个问题,但我通常会将日期转换为字符串(它本身就是一个强制转换),在句点处以毫秒分割字符串,并使用索引位置0来获取我需要的时间。是否有更短,更有效的方式?
稳定性和速度对我来说是最重要的。
提前致谢
答案 0 :(得分:8)
您需要了解的有关自定义DateTime ToString format is here on MSDN.
的所有信息简单来说,就像这样:
endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd hh:mm:ss");
(根据需要改变格式)
答案 1 :(得分:8)
请勿在同一表达式中重复使用Now
/ UtcNow
属性。获取值一次,并在不同的地方使用相同的值:
DateTime now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " +
now.TimeOfDay.Subtract(
new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds));
如果您只想以特殊方式格式化日期,并且不需要实际的DateTime值,则可以跳过格式中的毫秒,例如:
endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
当您将值发送到数据库时,不应将其作为字符串发送,而应作为DateTime值发送:
DateTime now = DateTime.Now;
DateTime endDate = now - new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds);
答案 2 :(得分:3)
基本上,您从现有实例创建一个新的DateTime
实例,但将所有内容设置为“较小”,然后将毫秒设置为零。您可以使用扩展方法:
public static class DateTimeExtensions
{
public static DateTime ZeroMilliseconds(this DateTime dt)
{
return new DateTime(((dt.Ticks / 10000000) * 10000000), dt.Kind);
}
}
或者使用您的代码的完整示例:
var now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " + now.ZeroMilliseconds().TimeOfDay;
答案 3 :(得分:3)
如果你想在没有任何问题的情况下删除毫秒。
DateTime d = DateTime.Now;
var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
答案 4 :(得分:-1)
使用C#DateTime formatting,如MSDN中所述。你对毫秒计算的分析很可能是错误的。对于字符串连接也使用StringBuilder