Нам нужно указать время с точностью до ближайшего произвольного интервала (представленного, например, интервалом времени или длительностью).
Предположим для примера, что нам нужно указать его с точностью до десяти минут. например, 13:02 становится 13:00, а 14:12 - 14: 10
Без использования Nodatime вы можете сделать что-то вроде this:
// Floor
long ticks = date.Ticks / span.Ticks;
return new DateTime( ticks * span.Ticks );
, которое будет использовать тики временного промежутка для представления даты и времени в определенное время c.
Кажется, NodaTime демонстрирует некоторую сложность, которую мы раньше не рассматривали. Вы можете написать такую функцию:
public static Instant FloorBy(this Instant time, Duration duration)
=> time.Minus(Duration.FromTicks(time.ToUnixTimeTicks() % duration.BclCompatibleTicks));
Но эта реализация не выглядит правильной. «От пола до ближайших десяти минут», похоже, зависит от часового пояса / смещения времени. Хотя может быть 13:02 в UT C, в Непале со смещением +05: 45, время будет 18: 47.
Это означает, что в UT C, переходя к ближайшие десять минут означали бы вычитание двух минут, в то время как в Непале это означало бы вычитание семи минут.
Мне кажется, что я должен иметь возможность округлить ZonedDateTime или OffsetDateTime каким-либо образом произвольным промежутком времени. Я могу подойти ближе, написав такую функцию, как эта
public static OffsetDateTime FloorToNearestTenMinutes(this OffsetDateTime time)
{
return time
.Minus(Duration.FromMinutes(time.Minute % 10))
.Minus(Duration.FromSeconds(time.Second));
}
, но это не позволяет мне указать произвольную длительность, поскольку OffsetDateTime не имеет понятия о тиках.
Как мне правильно округлить значение Instant / ZonedDateTime / OffsetDateTime с произвольным интервалом с учетом часовых поясов?