有没有更好的方法将DateTime修剪为特定的精度?

Llo*_*ten 49 .net c# datetime

将DateTime对象修剪为特定精度的最佳方法是什么?例如,如果我的DateTime值为'2008-09-29 09:41:43',但我只想要精确到分钟,有没有更好的方法来做到这一点?

private static DateTime TrimDateToMinute(DateTime date)
{
    return new DateTime(
        date.Year, 
        date.Month, 
        date.Day, 
        date.Hour, 
        date.Minute, 
        0);
}
Run Code Online (Sandbox Code Playgroud)

我真正想要的是让它变量,以便我可以将其精度设置为秒,分钟,小时或日.

Bar*_*bat 86

static class Program
{
    //using extension method:
    static DateTime Trim(this DateTime date, long roundTicks)
    {
        return new DateTime(date.Ticks - date.Ticks % roundTicks, date.Kind);
    }

    //sample usage:
    static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now);
        Console.WriteLine(DateTime.Now.Trim(TimeSpan.TicksPerDay));
        Console.WriteLine(DateTime.Now.Trim(TimeSpan.TicksPerHour));
        Console.WriteLine(DateTime.Now.Trim(TimeSpan.TicksPerMillisecond));
        Console.WriteLine(DateTime.Now.Trim(TimeSpan.TicksPerMinute));
        Console.WriteLine(DateTime.Now.Trim(TimeSpan.TicksPerSecond));
        Console.ReadLine();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在使它成为一个通用的扩展方法,那么值得保留DateTimeKind(Unspecified/Utc/Local):return new DateTime(date.Ticks - date.Ticks%roundTicks,date.Kind); (12认同)

Rik*_*ous 7

您可以使用枚举

public enum DateTimePrecision
{
  Hour, Minute, Second
}

public static DateTime TrimDate(DateTime date, DateTimePrecision precision)
{
  switch (precision)
  {
    case DateTimePrecision.Hour:
      return new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0);
    case DateTimePrecision.Minute:
      return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, 0);
    case DateTimePrecision.Second:
      return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second);
    default:
      break;
  }
}
Run Code Online (Sandbox Code Playgroud)

并根据需要进行扩展.

  • 当然,如果需要,您可以将代码调整为舍入而不是截断;我经常发现截断感觉更自然,因为这实际上就是时钟的行为方式。 (2认同)

roc*_*ast 5

我喜欢这个方法。有人提到保留 Date Kind 等很好。这样做是因为您不必创建新的 DateTime。DateTime 是从原始 DateTime 正确克隆的,它只是减去剩余的刻度。

public static DateTime FloorTime(DateTime dt, TimeSpan interval) 
{
  return dt.AddTicks(-1 * (dt.Ticks % interval.Ticks));
}
Run Code Online (Sandbox Code Playgroud)

用法:

dt = FloorTime(dt, TimeSpan.FromMinutes(5)); // floor to the nearest 5min interval
dt = FloorTime(dt, TimeSpan.FromSeconds(1)); // floor to the nearest second
dt = FloorTime(dt, TimeSpan.FromDays(1));    // floor to the nearest day
Run Code Online (Sandbox Code Playgroud)