Есть ли лучший способ обрезать дату-время с определенной точностью?[дубликат]

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

  •  02-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Каков наилучший способ обрезать объект 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);
}

Чего бы я действительно хотел, так это сделать его переменным, чтобы я мог установить его точность до секунды, минуты, часа или дня.

Это было полезно?

Решение

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

}

Другие советы

Вы могли бы использовать перечисление

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

и расширяйте по мере необходимости.

Здесь представлено несколько хороших решений, но когда мне нужно это сделать, я просто делаю:

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

Надеюсь, это поможет.

Мне нравится этот метод.Кто-то упомянул, что было бы неплохо сохранить вид даты и т.д.Это достигается тем, что, поскольку он не устанавливает новую дату, он просто вычитает оставшиеся тики.

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)

Приведенный выше код сократит количество секунд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top