删除DateTime.UctNow.TimeOfDay的Millisecond部分的最简单方法是什么?

时间:2012-03-19 10:03:19

标签: c# datetime casting

我有一个理论为什么下面的代码没有产生我需要的结果:

 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来获取我需要的时间。是否有更短,更有效的方式?

稳定性和速度对我来说是最重要的。

提前致谢

5 个答案:

答案 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