292

Вопрос по .net, c# – Как обрезать миллисекунды от .NET DateTime

Я пытаюсь сравнить метку времени из входящего запроса с сохраненным значением в базе данных. Конечно, SQL Server сохраняет некоторую точность времени в миллисекундах, а при чтении в .NET DateTime он включает эти миллисекунды. Однако входящий запрос в систему не обеспечивает такой точности, поэтому мне нужно просто отбросить миллисекунды.

Мне кажется, что я упускаю что-то очевидное, но я не нашел элегантного способа сделать это (C #).

  • Error: User Rate Limit ExceededisError: User Rate Limit Exceededvar now = DateTime.Parse(DateTime.Now.ToString())Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededd.AddMilliseconds(-d.Millisecond)Error: User Rate Limit Exceededd.Ticks % TimeSpan.TicksPerMillisecondError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Jeff Putz
  • Error: User Rate Limit Exceeded

    от Jeff Putz
  • Error: User Rate Limit ExceededMillisecond propertyError: User Rate Limit ExceededintegerError: User Rate Limit Exceeded23:48:49.1234567Error: User Rate Limit Exceeded123Error: User Rate Limit Exceeded23:48:49.0004567Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededSystem.DateTime.GetDatePart.

    от
13 ответов
  • 129

    Code:

    var date = DateTime.Now;
    
    date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);
    

  • 27

    Code:

    DateTime d = DateTime.Now;
    d = d.AddMilliseconds(-d.Millisecond);
    

  • 2

    Просто...

    //Remove milliseconds
    DateTime date = DateTime.Now;
    date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);
    

    И больше...

    //Remove seconds
    DateTime date = DateTime.Now;
    date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null);
    
    //Remove minutes
    DateTime date = DateTime.Now;
    date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null);
    
    //and go on...
    

  • 9

    Вместо того чтобы отбрасывать миллисекунды

    а затем сравнивать, почему бы не сравнить разницу?

    DateTime x; DateTime y;
    bool areEqual = (x-y).TotalSeconds == 0;
    

    или же

    TimeSpan precision = TimeSpan.FromSeconds(1);
    bool areEqual = (x-y).Duration() < precision;
    

  • 8

    Иногда вы хотите усечь что-то на основе календаря

    например, год или месяц. Вот способ расширения, который позволяет вам выбрать любое разрешение.

    public enum DateTimeResolution
    {
        Year, Month, Day, Hour, Minute, Second, Millisecond, Tick
    }
    
    public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second)
    {
        switch (resolution)
        {
            case DateTimeResolution.Year:
                return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind);
            case DateTimeResolution.Month:
                return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind);
            case DateTimeResolution.Day:
                return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind);
            case DateTimeResolution.Hour:
                return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour));
            case DateTimeResolution.Minute:
                return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute));
            case DateTimeResolution.Second:
                return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond));
            case DateTimeResolution.Millisecond:
                return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond));
            case DateTimeResolution.Tick:
                return self.AddTicks(0);
            default:
                throw new ArgumentException("unrecognized resolution", "resolution");
        }
    }
    

  • 8

    Менее очевидно, но более чем в 2 раза быстрее:

    // 10000000 runs
    
    DateTime d = DateTime.Now;
    
    // 484,375ms
    d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
    
    // 1296,875ms
    d = d.AddMilliseconds(-d.Millisecond);
    

  • 46

    Вот метод расширения

    основанный на предыдущем ответе, который позволит вам усечь любое разрешение ...

    Usage:

    DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
    DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)
    

    Class:

    public static class DateTimeUtils
    {
        /// <summary>
        /// <para>Truncates a DateTime to a specified resolution.</para>
        /// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
        /// </summary>
        /// <param name="date">The DateTime object to truncate</param>
        /// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
        /// <returns>Truncated DateTime</returns>
        public static DateTime Truncate(this DateTime date, long resolution)
        {
            return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
        }
    }
    

  • 1

    Year, theDate

    2 Методы расширения для решений, упомянутых выше

        public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
        {
            DateTime thisDate = new DateTime(theDate..Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
            compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);
    
            return thisDate > compareDate;
        }
    
    
        public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
        {
            DateTime thisDate = new DateTime(theDate..Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
            compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);
    
            return thisDate >= compareDate;
        }
    

    использование:

    bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);
    

  • 1

    И с помощью ToLongDateString() // its show 19 February 2016.

    DateID.Text = DateTime.Today.ToShortDateString();
    
    Use ToShortDateString() //Date 2-02-2016
    Use ToShortDateString() // Time 
    

    И с помощью

    ToLongDateString() // its show 19 February 2016.
    

  • 499

    Следующее будет работать для DateTime

    который имеет дробные миллисекунды, а также сохраняет свойство Kind (Local, Utc или Undefined).

    DateTime dateTime = ... anything ...
    dateTime = new DateTime(
        dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), 
        dateTime.Kind
        );
    

    или эквивалент и короче:

    dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));
    

    Это можно обобщить в метод расширения:

    public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
    {
        if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
        if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
        return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
    }
    

    который используется следующим образом:

    dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
    dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
    dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
    ...
    

  • 1

    Новый метод String Date = DateTime.Today.ToString("dd-MMM-yyyy");

    Новый метод

    String Date = DateTime.Today.ToString("dd-MMM-yyyy"); 
    

    // определить параметр передачи строки dd-mmm-yyyy return 24-feb-2016

    Или показано в текстовом поле

    txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");
    

    // положить на PageonLoad

  • 1

    Чтобы округлить до второго:

    dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)
    

    ЗаменитьTicksPerMinute округлить до минуты.

    Если ваш код чувствителен к производительности, будьте осторожны с

    new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)
    

    Мое приложение тратит 12% процессорного времени вSystem.DateTime.GetDatePart.

  • 1

    Относительно ответа Диадистиса. Это сработало для меня

    за исключением того, что мне пришлось использовать Floor для удаления дробной части деления перед умножением. Так,

    d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
    

    становится

    d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);
    

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

    Eppsy