web-dev-qa-db-ja.com

DateTimeを特定の精度にトリミングするより良い方法はありますか?

DateTimeオブジェクトを特定の精度にトリミングする最良の方法は何ですか?たとえば、「2008-09-29 09:41:43」の値を持つDateTimeがあるが、精度を分単位にしたい場合、これよりも優れた方法はありますか?

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

私が本当に望んでいるのは、変数の精度を秒、分、時間、または日のいずれかに設定できるようにすることです。

48
Lloyd Cotten
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();
    }

}
83
Bartek Szabat

列挙を使用できます

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;
  }
}

必要に応じて拡張します。

7
Rikalous

ここにいくつかの良い解決策がありますが、これを行う必要があるときは、単に次のようにします。

DateTime truncDate;
truncDate = date.Date; // trim to day
truncDate = date.Date + TimeSpan.Parse(string.Format("{0:HH:00:00}", date)); // trim to hour
truncDate = date.Date + TimeSpan.Parse(string.Format("{0:HH:mm}", date)); // trim to minute
truncDate = date.Date + TimeSpan.Parse(string.Format("{0:HH:mm:ss}", date)); // trim to second

それが役に立てば幸い。

1
Marcos Arruda

私はこの方法が好きです。誰かが日付の種類などを保持することは良いことだと述べました。これは、新しいDateTimeを作成する必要がないため、これを実現します。 DateTimeは元のDateTimeから適切に複製され、残りのティックを単純に減算します。

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

使用法:

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
0
rocketsarefast