Кодирование времени выпуска в Delphi 2010 - PullRequest
2 голосов
/ 28 февраля 2011

Когда мы используем функцию EncodeTime EncodeTime (wHour, wMinute, wSecond, wMilliseconds), она не присваивает значение результата в миллисекундах.

Мы используем ниже для кодирования даты и времени

Result := EncodeDate(wYear, wMonth, wDay) +
  EncodeTime(wHour, wMinute, wSecond, wMilliseconds);

Строка, которую мы хотим проанализировать в DateTime, имеет значение Apr 10 2008 7:21:31:460PM, но после кодирования мы получаем вывод в виде 10/04/2008 07:21:31.

Результат содержит только значение HH:MM:SS, а не значение в миллисекундах.

Пожалуйста, дайте нам знать, если есть какой-либо способ отформатировать значения и сохранить его в переменной вместе с миллисекунд.******************* функция, которую я пытаюсь *************

function DateTimeParser(theString :string):TDateTime;
var wYear,wMonth,wDay,wHour, wMinute, wSecond,wMilliseconds : Word  ;
Date,Month,Med :String;
Time : TDateTime;
testtime,testtime1 : TSystemTime;
var  myDateTime : TDateTime;
begin
 Month := Copy(theString,1,3) ;
 if Month ='Jan' then wMonth := 01
     else if  Month ='Feb' then  wMonth := 02
     else if  Month ='Mar' then  wMonth := 03
     else if  Month ='Apr' then  wMonth := 04
     else if  Month ='May' then  wMonth := 05
     else if  Month ='Jun' then  wMonth := 06
     else if  Month ='Jul' then  wMonth := 07
     else if  Month ='Aug' then  wMonth := 08
     else if  Month ='Sep' then  wMonth := 09
     else if  Month ='Oct' then  wMonth := 10
     else if  Month ='Nov' then  wMonth := 11
     else if  Month ='Dec' then  wMonth := 12
     else ShowMessage('Not a Valid Month');
wYear           :=  StrToInt(Copy(theString,8,4)) ;
wDay            :=  StrToInt(Copy(theString,5,2)) ;
wHour           :=  StrToInt(Copy(theString,13,2)) ;
wMinute         :=  StrToInt(Copy(theString,16,2)) ;
wSecond         :=  StrToInt(Copy(theString,19,2)) ;
wMilliseconds   :=  StrToInt(Copy(theString,22,3)) ;

ShowMessage(IntToStr(wMilliseconds));

{if Copy(theString,25,2)= 'PM' then
 wHour := wHour+12;}

Result := DateUtils.EncodeDateTime(wYear, wMonth, wDay,wHour, wMinute, wSecond, wMilliseconds);
//Result := Result+DateUtils.EncodeTime(wHour, wMinute, wSecond, wMilliseconds div 100);

 myDateTime:= EncodeDate(2009,11,28)+EncodeTime(14,23,12,001);
 ShowMessage(DatetimetoStr(myDateTime));
testtime1 := testtime;


Time :=EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
            ShowMessage(DateTimeToStr(Result));

**********************************************************************


end;

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 28 февраля 2011

Возможно, я неправильно понял проблему здесь, но, возможно, она сохраняется, но вы ее не видите.Отладчик не показывает миллисекунды и DateTimeToStr тоже не показывает.FormatDateTime со строкой форматирования.

var
    Date: TDateTime;
begin
    Date := EncodeDateTime(2011, 02, 28, 20, 43, 10, 12);

    //DateTimeToStr does not show milliseconds
    ShowMessage(DateTimeToStr(Date));

    //Use FormatDateTime with Format string
    ShowMessage(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz' , Date));
end;

База данных

Ваш тег dbexpress указывает, что вы пытаетесь сохранить datetime в базе данных,Я не знаю о dbexpress, но ADO усекает миллисекунды из datetime. Для сохранения в миллисекундах в SQL Server с ADO вы должны создать оператор вставки самостоятельно.Это может быть то же самое с dbexpress.

Вот некоторый код ADO, который сохранит datetime с миллисекундами в SQL Server

ADOCommand1.CommandText := 'insert into DateTbl values ('''+
    FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz' , Date)+''')';
ADOCommand1.Execute;

Точность datetime в SQL Server 3,33 миллисекунды.Это не то же самое, что в Delphi, поэтому, когда я сохраняю 2011-02-28 20:43:10.012, он сохраняется как 2011-02-28 20:43:10.013 в SQL Server.Это может быть проблемой для вас.

Одним из решений для вас может быть сохранение миллисекундной части datetime в отдельном целочисленном столбце.Таким образом, вы всегда будете хранить одно и то же значение, которое вы закодировали в Delphi, и вам не нужно создавать собственные операторы вставки.

DBExpress

Я провел некоторое тестирование с компонентами DBX, и они тоже усекают миллисекунды.

2 голосов
/ 28 февраля 2011

Это может быть неочевидно для вас, но в форматах даты и времени по умолчанию секунды и миллисекунды обычно разделяются точкой (.).Пример строки, которую вы показали в своем вопросе Apr 10 2008 7:21:31:460PM, имеет двоеточие (:) в этой позиции.Это может привести к падению миллисекунд.

2 голосов
/ 28 февраля 2011

используйте этот формат ЧЧ: ММ: СС.ZZZ

Приветствия

...