2013-06-14 2 views
4

Почему DateTimeToMilliseconds в DateUtils.pas помечен как внутренний? Могу ли я использовать его?Почему DateTimeToMilliseconds в DateUtils.pas помечен как внутренний?

{ Internal, converts a date-time to milliseconds } 
function DateTimeToMilliseconds(const ADateTime: TDateTime): Int64; 
var 
    LTimeStamp: TTimeStamp; 
begin 
    LTimeStamp := DateTimeToTimeStamp(ADateTime); 
    Result := LTimeStamp.Date; 
    Result := (Result * MSecsPerDay) + LTimeStamp.Time; 
end; 

[Delphi XE]


Я нашел это на About.com:

Опыт показывает, что создание двух значений TDateTime, используя функцию и EncodeDateTime, которые находятся на расстоянии друг от друга другой - только миллисекунда, функция возвращает миллисекунды между ними, а не возврат, как ожидалось, доказывая, что это неточно.

Так что, если мне не все равно несколько milisecs, я должен использовать его.

+2

Какую версию Delphi вы используете? Блок DateUtils провел капитальный ремонт в XE, что сделало эти функции предельно точными до миллисекунды. –

+0

У меня есть Delphi XE Professional – Ampere

+0

Эта статья о статье относится к старой версии Delphi - я не мог видеть дату, но, вероятно, Delphi 7. Если вы будете следовать ссылкам в ней, вы в конечном итоге попадете в отчет о контроле качества, точный код, который вы цитируете как исправление! Впоследствии он был добавлен в Delphi, как указано ниже и мной ниже @NickHodges. –

ответ

7

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

Позже, когда расчеты готовы, значение Int64 снова возвращается к значению TDateTime.

Маркировка internal заключается в том, чтобы подчеркнуть, что эта функция представляет собой деталь реализации, которая не должна использоваться вне библиотеки. То есть при работе с значениями TDateTime используйте общедоступные функции/процедуры.

Это небольшой тест функции MilliSecondsBetween:

program TestMSecBetween; 
{$APPTYPE CONSOLE} 

uses 
    System.SysUtils,System.DateUtils; 

var 
    d1,d2 : TDateTime; 
    i,iSec,iMin,iHour,iMSec; 
    isb : Int64; 
begin 
    d1 := EncodeDateTime(2013,6,14,0,0,0,0); 
    for i := 0 to 1000*60*60*24-1 do 
    begin 
    iHour := (i div (1000*60*60)) mod 24; 
    iMin := (i div (1000*60)) mod 60; 
    iSec := (i div 1000) mod 60; 
    iMSec := i mod 1000; 
    d2 := EncodeDateTime(2013,6,14,iHour,iMin,iSec,iMSec); 
    isb := MilliSecondsBetween(d2,d1); 
    if (isb <> i) then 
     WriteLn(i:10,iHour:3,iMin:3,iSec:3,iMSec:4,isb:3); 
    end; 
    ReadLn; 
end. 

Вы можете расширить тест более чем на один день, чтобы увидеть, если есть некоторые аномалии.

+3

Для получения дополнительной информации см. Статью [Delphi.about.com] (http://delphi.about.com/od/objectpascalide/a/accurate-difference-between-two-delphi-tdatetime-values.htm), где упоминается источник этого метода, [предложение Джона Хербстера] (http://qc.embarcadero.com/wc/qcmain.aspx?d=56957) для повышения точности методов даты/времени. Если вы хотите использовать этот метод самостоятельно, сделайте локальную копию. Не редактируйте исходный файл DateUtils.pas для чего-то меньшего, чем это. –

+0

> Опыт показывает, что создание двух значений TDateTime с использованием функции и EncodeDateTime, которые далеки друг от друга только миллисекундой, функция возвращает MillisecondsBetween, а не возврат, как ожидалось, доказывая, что это неточно. --------------------------------------- так что если меня не волнует несколько milisec I может использовать его? – Ampere

+0

Вы можете скопировать функцию и использовать ее, да. Но сначала убедитесь, что это действительно необходимо. Большинство практических способов работы с значениями TDateTime должны быть покрыты SysUtils и DateUtils. –

1

Нет причин, по которым вы не могли бы использовать его, он не устарел и не использовался внутренне.

Он просто помечен как «внутренний», потому что заголовок функции не находится в разделе интерфейса. Если вы копируете заголовок там, он должен работать.

Что мы делаем, если мы «исправляем» стороннее устройство, подобное этому, копируем его в каталог в нашем собственном пути поиска (с именем PatchLibs) перед изменением. Таким образом, вы не можете «повредить» исходный файл, и вам не нужно беспокоиться о том, как восстановить исходные блоки.

+0

Не редактируйте источник VCL/RTL для чего-то столь же незначительного, как это! Вы должны очень осторожно редактировать источник VCL - вы пропускаете обновления и исправления и можете вызывать проблемы совместимости. Сделайте это только для серьезных важных ошибок, которые не могут быть решены каким-либо другим способом. Для чего-то вроде этого просто сделайте копию метода где-то еще. –

+0

Я его не отредактирую :) – Ampere

Смежные вопросы