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

StackOverflow https://stackoverflow.com/questions/152774

  •  02-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

Quel est le meilleur moyen de dé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 une précision à la minute près, 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.

Était-ce utile?

La solution

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

}

Autres conseils

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 développez-le si nécessaire.

Il existe de bonnes solutions 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.

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));
}
    static DateTime TrimDate(DateTime date, long roundTicks)
    {
        return new DateTime(date.Ticks - date.Ticks % roundTicks);
    }

    //sample usage:
    static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now);
        Console.WriteLine(TrimDate(DateTime.Now, TimeSpan.TicksPerDay));
        Console.WriteLine(TrimDate(DateTime.Now, TimeSpan.TicksPerHour));
        Console.WriteLine(TrimDate(DateTime.Now, TimeSpan.TicksPerMillisecond));
        Console.WriteLine(TrimDate(DateTime.Now, TimeSpan.TicksPerMinute));
        Console.WriteLine(TrimDate(DateTime.Now, TimeSpan.TicksPerSecond));
        Console.ReadLine();
    }
DateTime dt = new DateTime()
dt = dt.AddSeconds(-dt.Second)

Le code ci-dessus coupe les secondes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top