Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Статья о типе TDateTime  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5907
думаю, многим было бы интересно почитать:

Почему мне не нравится TDateTime
Сентябрь 3, 2009 — Шарахов А.П.


ОФФ (задачка):
написать функцию округления TDateTime-параметра до 5 минут (т.е. 19:52--> 19:50, a 07:34-->07:35)
публикуйте решения в тэгах spoiler
+ мой вариант

function RoundDateTimeTo5Min(AValue: TDateTime): TDateTime;
var
   fPartOfTheDay : double;
begin
   fPartOfTheDay:=24*60/5;

   Result:=Round(AValue*fPartOfTheDay)/fPartOfTheDay;
end;

10 янв 17, 15:19    [20089665]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22336
Кроик Семён
написать функцию округления TDateTime-параметра до 5 минут

На практике такое бывает нужно или просто так?

+
С ходу только аналитика всяких продаж в голову лезет. Но там обычно часа хватает.
10 янв 17, 15:24    [20089705]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5907
wadman
На практике такое бывает нужно или просто так?

Нет, функция из моего сегодняшнего программирования.
Пользователь получает график и кликая мышкой в него заполняет таблицу с колонкой даты/времени, в которой договорились о точности 5 минут
10 янв 17, 15:31    [20089767]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4264
Кроик Семён,

Я бы все же воспользовался DecodeDateTime, EnCodeDateTime и Round
10 янв 17, 15:50    [20089918]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22336
Gerasimenko
Я бы все же воспользовался DecodeDateTime, EnCodeDateTime и Round

Тогда +1. Это конфигурабельно на случай, если вдруг ему захочется другие интервалы.
Но если есть база, то в ней проще сделать нечто вроде календаря, но по времени в разных разрезах и с индексами по ним.
10 янв 17, 15:58    [20089955]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
JaDi
Member

Откуда: JayDi из Сызрани
Сообщений: 2608
wadman
На практике такое бывает нужно или просто так?

У меня такое было на практике.

Была система контроля доступа (СКУД), от которой брались логи входа/выхода сотрудников по территории. Логи с точностью до секунды. Дальше их надо было обрабатывать и формировать табель с рабочим временем сотрудников и последующим подсчетом отработанных и не отработанных часов. Естественно, появилась необходимость округлять точное время до целых минут (точнее, там был более сложный алгоритм, но не суть) -- чтобы сотрудникам лишний час не прибавили/убавили по этим логам (мало ли кто-то замешкался с карточкой или, наоборот, решил схитрить). И чтобы табельщикам было легче работать с целыми отрезками, а не минутами/секундами.
10 янв 17, 16:02    [20089979]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5907
Gerasimenko
Кроик Семён,

Я бы все же воспользовался DecodeDateTime, EnCodeDateTime и Round


Не самый элегантный способ. Представляешь простыню из IF 'ов для программирования ситуации округления со сменой дня/месяца/года?

31.12.2016 23:58 --> 01.01.2017 00:00
11 янв 17, 14:32    [20093873]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
rgreat
Member

Откуда:
Сообщений: 3198
Кроик Семён,

Добавь к TDateTime 0.003472 (4.9999 минут) и округляй в меньшую сторону. Обойдешься без IF-ов.
11 янв 17, 14:43    [20093944]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4264
Кроик Семён
Gerasimenko
Кроик Семён,

Я бы все же воспользовался DecodeDateTime, EnCodeDateTime и Round


Не самый элегантный способ. Представляешь простыню из IF 'ов для программирования ситуации округления со сменой дня/месяца/года?

31.12.2016 23:58 --> 01.01.2017 00:00


+ зато дешево надежно и практично


И да... слухи о простыне сильно преувеличены...
11 янв 17, 14:44    [20093945]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4264
Кроик Семён
Gerasimenko
Кроик Семён,

Я бы все же воспользовался DecodeDateTime, EnCodeDateTime и Round


Не самый элегантный способ. Представляешь простыню из IF 'ов для программирования ситуации округления со сменой дня/месяца/года?

31.12.2016 23:58 --> 01.01.2017 00:00

округлил минуты, добавил (отнял) разницу к начальной IncMinute
11 янв 17, 14:52    [20093997]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5907
Gerasimenko
Кроик Семён
пропущено...


Не самый элегантный способ. Представляешь простыню из IF 'ов для программирования ситуации округления со сменой дня/месяца/года?

31.12.2016 23:58 --> 01.01.2017 00:00

округлил минуты, добавил (отнял) разницу к начальной IncMinute


я не против IncMinute, я в недоумении относительно способа DecodeDateTime ... EnCodeDateTime, ведь если неокругленное датавремя разобрано на отдельные год/месяц/день/час/минута/секунда, то как же тогда без простыни из IF 'ов, к чему предлагаешь применить IncMinute?
11 янв 17, 15:18    [20094119]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4264
Кроик Семён
Gerasimenko
пропущено...

округлил минуты, добавил (отнял) разницу к начальной IncMinute


я не против IncMinute, я в недоумении относительно способа DecodeDateTime ... EnCodeDateTime, ведь если неокроглыенное датавремя разобрано на отдельные год/месяц/день/час/минута/секунда, то как же тогда без простыни из IF 'ов, к чему предлагаешь применить IncMinute?
к начальной дате
11 янв 17, 15:19    [20094125]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 5907
OK, а зачем тогда EnCodeDateTime?
11 янв 17, 15:24    [20094144]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4264
Кроик Семён
OK, а зачем тогда EnCodeDateTime?
Можно округлить милисекунды... можно не сипользовать
11 янв 17, 15:26    [20094158]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Bred eFeM
Member

Откуда:
Сообщений: 387
Кроик Семён
договорились о точности 5 минут
твое решение +/- 150 секунд.

А пользователь в курсе, что эти минуты старого/нового дня/месяца/года будут засчитаны в новый/старый день/месяц/год?

Статью приводишь, а "тип, приятный во всех отношениях" сам не используешь?

А ещё был/есть перевод часиков вперёд/назад…
11 янв 17, 16:02    [20094371]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gator
Member

Откуда: Москва
Сообщений: 13713
wadman
Кроик Семён
написать функцию округления TDateTime-параметра до 5 минут

На практике такое бывает нужно или просто так?

+
С ходу только аналитика всяких продаж в голову лезет. Но там обычно часа хватает.

Понятно, что миллисекунды никому не нужны. Разве что в локальной системе для перевода TimeTickets (gettickcount) в удобоваримый формат 'dddddd hh:mm:ss.zzz'

Немножко вспомним теорию :)
Об RTOS не говорим :))

8 байт аля Double.
Целая часть (4 байта) - ДАТА (оставим дельфийское начало на их совести)
После точки (4 байта) - время даже с миллисекундами

И БД их оклюглят по-своему, напр.,
MSSQL
DateTime значения округляются до секунд.000,.003 или.007
(и не надо тут про Datetime2 - у него аж 19 байтов)

Теперь картинка/скриншот - практика будет впереди.

У вас у всех дома часы синхронизированы?
Т.е. в холодильнике, плите, на стенке, на тумбочке...? Часто "синхронизируете?"
А в домашней сетке? (на работе в офисе - то же, но это не ваша нерешаемая проблема)
Время в железках - осоьбстатья. Часы идут по-разному, синхронизируются в различное время, и наступает "Bedlam in Time"
Кроме того все, надеюсь знают про "загадки округления"

Практика.

+ РОСНЕТ
РОСНЕТ
В благословенные времена РОСНЕТа было много разных железяк по всей стране.
И время за сутки на разных коробках (от Петропавловска до Калининграда) различалось до 5 минут)

Каждая коробка/шкаф могла/собирала тикеты (charging ticket).

По идее, наплевав неким "эпсилоном" на таймштампы легко определить конкретный сеанс по тикетам на входе, на выходе, в середине. И гадство! Ещё ТИКЕТЫ ТЕРЯЛИСЬ!!! Как биллинг считать?

А легко! ±30 мин. Сеть из-за этого не обеднеет. Какой идиёт будет бизнис строить на физлицах.

Также и региональные клиенты (Типа АО Электросвязь) наши поступали (тогда были модны "ночные" тарифы и пр.)

+ ПОЧТА и Экспресс-почта
ПОЧТА и Экспресс-доставка
Опять. Кого интересуют секунды?
Физ.клиента - да! Ну так и простите ему клиенту 10 мин и накажите курьера!
(один хрен невозможно доказать, что курьер прибыл ДО оговоренного срока)
ДА!!! Я так наказываю ленивых курьеров и оплачиваю обычный тариф, а не экспресс. Ибо не собираюсь в укладываться в 10 мин проверяя доставку.

+ СКУД
СКУД
(когда я на почте служил ямщиком)Турникеты и шлагбаумы. Около 50 дверей/выездов.
Ясен пень, не синхронизированы по времени. Тикеты теряются тоже.
Ну и кого волнуют секунды входа/выхода?
Тем более, сегодня сотрудник ушёл на 30 мин раньше, а завтра на 60 мин позже?
И докладная есть, и у начальства - чики-чики.
Вы предлагаете такое автоматизировать? хи-хи.

Хотя, честно сказать, стукача-то я приделал - чисто селектом за месяц выявлялись "регулярные нарушители", кто норовил придти попозже, а свалить пораньше"
Ну и что? Ценность не в просиженном времени, а в исполненной работе.


Нынче и вообще такая точность излишня.
Есть определяющие конвенции, протоколы, связь иногда отсутствует, а если что, следствие разберётся. Без миллисекунд.
Это журналюгам минуты интересны, а в реале - не так.
12 янв 17, 00:00    [20096233]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gator
Member

Откуда: Москва
Сообщений: 13713
Gator, А...
Забыл про МПС/РЖД написать.
Но там всё похоже...
Скоростемерные леты, проезд на красный, неисправные семафоры...
Нигде миллисекунды не нужны.
12 янв 17, 00:04    [20096240]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gator
Member

Откуда: Москва
Сообщений: 13713
И заодно... Объективный Контроль - the same. Хотя и скорости там - ОГОГО. Но предпосылка наступает раньше.
12 янв 17, 00:07    [20096245]     Ответить | Цитировать Сообщить модератору
 Re: Статья о типе TDateTime  [new]
Gator
Member

Откуда: Москва
Сообщений: 13713
Gator, с другой стороны, интервалы вполне можно считать в секундах. Их много в лезет в 4 или 8 беззнаковых байтов. И даже со знаком можно.
12 янв 17, 00:16    [20096263]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить