去除Millisecond';是DateTime.UctNow.TimeOfDay的一部分

本文关键字:UctNow TimeOfDay 一部分 DateTime Millisecond 去除 | 更新日期: 2023-09-27 18:28:10

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

 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的单个刻度的时间长度(以及处理此属性并返回结果的时间),这并不意味着DateTime.UtcNow.TimeOfDay.Milliseconds将减去DateTime.UtcNow.TimeOfDay 指定的确切毫秒数

我需要知道,在不需要使用大量处理器时间的情况下,从DateTime.UtcNow.TimeOfDay中删除毫秒数的最简单、最有效的方法是什么我的这个应用程序很大,而这个问题很简单。但是,当部署此应用程序时,它就没有不稳定的空间。必须修剪此毫秒,因为它被发送到SQL Server中的存储过程,并且此特定存储过程在DateTimes上不支持毫秒。我也经常遇到这个问题,但我通常会将日期转换为字符串(它本身就是一个强制转换),在毫秒的句号处拆分字符串,并使用索引位置0来获得我需要的时间。有没有更短、更有效的方法?

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

提前感谢

去除Millisecond';是DateTime.UctNow.TimeOfDay的一部分

不要在同一表达式中重复使用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);

有关自定义DateTime-ToString格式的所有信息都在MSDN上。

简单来说,像这样的东西:

endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd hh:mm:ss"); 

(根据需要更改格式)

如果您想在不出现任何问题的情况下删除毫秒。

 DateTime d = DateTime.Now;
 var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);

基本上,您可以从现有实例创建一个新的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;

使用C#DateTime格式,如MSDN中所述。你对毫秒计算的分析很可能是错误的。对于字符串串联,也可以使用StringBuilder