Jef*_*utz 319 .net c# datetime
我正在尝试将传入请求的时间戳与数据库存储值进行比较.SQL Server当然会保留一些毫秒的精度,当读入.NET DateTime时,它包括那些毫秒.但是,对系统的传入请求不提供该精度,因此我需要简单地删除毫秒.
我觉得我错过了一些明显的东西,但我还没有找到一种优雅的方法(C#).
Joe*_*Joe 534
以下内容适用于具有小数毫秒的DateTime,并且还保留Kind属性(Local,Utc或Undefined).
DateTime dateTime = ... anything ...
dateTime = new DateTime(
dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond),
dateTime.Kind
);
Run Code Online (Sandbox Code Playgroud)
或等同和更短的:
dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));
Run Code Online (Sandbox Code Playgroud)
这可以推广到扩展方法:
public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}
Run Code Online (Sandbox Code Playgroud)
使用如下:
dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
...
Run Code Online (Sandbox Code Playgroud)
ben*_*rce 139
var date = DateTime.Now;
date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);
Run Code Online (Sandbox Code Playgroud)
Sky*_*ers 57
这是一个基于前一个答案的扩展方法,可以让你截断到任何分辨率......
用法:
DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)
Run Code Online (Sandbox Code Playgroud)
类:
public static class DateTimeUtils
{
/// <summary>
/// <para>Truncates a DateTime to a specified resolution.</para>
/// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
/// </summary>
/// <param name="date">The DateTime object to truncate</param>
/// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
/// <returns>Truncated DateTime</returns>
public static DateTime Truncate(this DateTime date, long resolution)
{
return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
}
}
Run Code Online (Sandbox Code Playgroud)
chr*_*ean 27
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);
Run Code Online (Sandbox Code Playgroud)
而不是丢弃毫秒然后比较,为什么不比较差异?
DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;
Run Code Online (Sandbox Code Playgroud)
要么
TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;
Run Code Online (Sandbox Code Playgroud)
有时您希望截断为基于日历的内容,例如年份或月份.这是一种扩展方法,可让您选择任何分辨率.
public enum DateTimeResolution
{
Year, Month, Day, Hour, Minute, Second, Millisecond, Tick
}
public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second)
{
switch (resolution)
{
case DateTimeResolution.Year:
return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind);
case DateTimeResolution.Month:
return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind);
case DateTimeResolution.Day:
return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind);
case DateTimeResolution.Hour:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour));
case DateTimeResolution.Minute:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute));
case DateTimeResolution.Second:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond));
case DateTimeResolution.Millisecond:
return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond));
case DateTimeResolution.Tick:
return self.AddTicks(0);
default:
throw new ArgumentException("unrecognized resolution", "resolution");
}
}
Run Code Online (Sandbox Code Playgroud)
不太明显,但速度提高了2倍以上:
// 10000000 runs
DateTime d = DateTime.Now;
// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);
Run Code Online (Sandbox Code Playgroud)
向下舍入到第二个:
dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
Run Code Online (Sandbox Code Playgroud)
替换TicksPerMinute
为四舍五入到分钟。
如果您的代码对性能敏感,请谨慎使用
new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
Run Code Online (Sandbox Code Playgroud)
我的应用程序在System.DateTime.GetDatePart 中花费了 12% 的 CPU 时间。
一种轻松阅读的方法是...
//Remove milliseconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);
Run Code Online (Sandbox Code Playgroud)
和更多...
//Remove seconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null);
//Remove minutes
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null);
//and go on...
Run Code Online (Sandbox Code Playgroud)
据我了解,它很容易理解,但缺乏性能。
不是最快的解决方案,但简单易懂:
DateTime d = DateTime.Now;
d = d.Date.AddHours(d.Hour).AddMinutes(d.Minute).AddSeconds(d.Second)
Run Code Online (Sandbox Code Playgroud)