Как усечь миллисекунды прочь DateTime.NET

Использование ng-класса внутри ng-repeat

<table>
    <tbody>
            <tr ng-repeat="task in todos"
                ng-class="{'warning': task.status == 'Hold' , 'success': task.status == 'Completed',
              'active': task.status == 'Started', 'danger': task.status == 'Pending' } ">
                <td>{{$index + 1}}</td>
                <td>{{task.name}}</td>
                <td>{{task.date|date:'yyyy-MM-dd'}}</td>
                <td>{{task.status}}</td>
            </tr>
    </tbody>
</table>

Для каждого состояния в task.status для строки используется другой класс.

319
задан Jeff Putz 16 June 2009 в 14:43
поделиться

8 ответов

Следующее будет работать для 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
...
534
ответ дан 23 November 2019 в 01:00
поделиться

Я знаю, что ответ является довольно поздним, но лучший способ избавиться от миллисекунд

var currentDateTime = DateTime.Now.ToString("s");

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

-1
ответ дан 23 November 2019 в 01:00
поделиться
var date = DateTime.Now;

date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);
139
ответ дан 23 November 2019 в 01:00
поделиться

Instead of dropping the milliseconds then comparing, why not compare the difference?

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

or

TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;
9
ответ дан 23 November 2019 в 01:00
поделиться

Менее очевидно, но более чем в 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);
7
ответ дан 23 November 2019 в 01:00
поделиться
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);
27
ответ дан 23 November 2019 в 01:00
поделиться

Относительно ответа Диадистиса. Это сработало для меня, за исключением того, что мне пришлось использовать Floor, чтобы удалить дробную часть деления перед умножением. Итак,

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

становится

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

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

Эппси

1
ответ дан 23 November 2019 в 01:00
поделиться

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

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

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

Класс:

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);
    }
}
57
ответ дан 23 November 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: