web-dev-qa-db-fra.com

Existe-t-il un meilleur moyen de réduire un DateTime à une précision spécifique?

Quel est le meilleur moyen de couper un objet DateTime avec une précision spécifique? Par exemple, si j'ai un DateTime avec une valeur de '2008-09-29 09:41:43', mais que je veux seulement que la précision soit précise, y a-t-il un meilleur moyen de le faire que cela?

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

Ce que je voudrais vraiment, c’est de le rendre variable afin que je puisse régler sa précision sur la seconde, la minute, l’heure ou le jour.

44
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();
    }

}
75
Bartek Szabat

Vous pouvez utiliser une énumération

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

et élargir au besoin.

7
Rikalous

Quelques bonnes solutions sont présentées ici, mais lorsque je dois le faire, je fais simplement:

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

J'espère que ça aide.

1
Marcos Arruda

J'aime cette méthode. Quelqu'un a mentionné qu'il était bon de conserver le type de date, etc. Cela permet de ne pas créer de nouvelle date, mais simplement de soustraire les ticks restants.

private DateTime FloorToHour(DateTime dt)
{
  return dt.AddTicks(-1 * (dt.Ticks % TimeSpan.TicksPerHour));
}
0
rocketsarefast