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

Откуда: Жуковский
Сообщений: 1255
Привет, использую в одном проекте тип
  TSQLTimeStamp = record
    Year: Word;
    Month: Word;
    Day: Word;
    Hour: Word;
    Minute: Word;
    Second: Word;
    Fractions: LongWord;
  end;

из модуля Data.SqlTimSt.

Отображаются в том числе миллисекунды. Для отображения и сохранения в XML использую функцию
function SQLTimeStampToStr(const Format: string; DateTime: TSQLTimeStamp): string;

Вот таким образом, например:
  SubNode.Text := SqlTimeStampToStr('dd.mm.yyyy hh:nn:ss.zzz', aAction.Start);

Нормально сохраняется, вот узел из XML
<start>17.02.2021 15:30:20.500</start>


Для загрузки из XML использую
function StrToSQLTimeStamp(const S: string; const FormatSettings: TFormatSettings): TSQLTimeStamp;

(Там готовых вариантов - 2, этот и то же без FormatSettings).
Обрезаются миллисекунды.
Задаю свойства FormatSettings вот так:
var FS: TFormatSettings;
begin
  FS := TFormatSettings.Create;
  FS.ShortDateFormat := 'dd.mm.yyyy'; //дату показывает нормально
  FS.LongDateFormat := 'dd.mm.yyyy'; //это вообще наверное не нужно
  FS.LongTimeFormat := 'hh:nn:ss.zzz';
  FS.ShortTimeFormat := 'hh:nn:ss.zzz';
  ...
  Ovr.Start := StrToSQLTimeStamp(aNode.ChildValues['start'], FS);
  ...

Миллисекунды обрезает при преобразовании строки. Я заглянул, как реализована функция, пока не до конца разобрался, ну и напишу, если что, свою для разбора строки, но может быть кто-то сталкивался с такой ситуацией иил похожим, знает, что задать в FormatSettings или еще какой-то нюанс, чтобы просто воспользоваться этой функцией и чтобы из строки передались миллисекунды? Там в функции StrToSQLTimeStamp сначала строка преобразуется в TDateTime, а потом уже в TSQLTimeStamp.

Сообщение было отредактировано: 17 фев 21, 13:33
17 фев 21, 13:39    [22282247]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
В XE3 и Rio так
function TryStrToSQLTimeStamp(const S: string; var TimeStamp: TSQLTimeStamp; const FormatSettings: TFormatSettings): Boolean;
var
  DT: TDateTime;
begin
  Result := TryStrToDateTime(S, DT, FormatSettings);
  if Result then
  begin
    TimeStamp := DateTimeToSQLTimeStamp(DT);
    if TimeStamp.Fractions = 0 then
      TimeStamp.Fractions := ExtractMSecFromString(S, FormatSettings);

    Result := IsSqlTimeStampValid(TimeStamp);
  end;
  if not Result then
    TimeStamp := NullSQLTimeStamp;
end;

function DateTimeToSQLTimeStamp(const DateTime: TDateTime): TSQLTimeStamp;
var
  F: Word;
begin
  DecodeDate(DateTime, Result.Year, Result.Month, Result.Day);
  DecodeTime(DateTime, Result.Hour, Result.Minute, Result.Second, F);
  Result.Fractions := F;
end;


Сообщение было отредактировано: 17 фев 21, 13:46
17 фев 21, 13:53    [22282263]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1255
_Vasilisk_,
спасибо за подсказку/наводку, заменил (после того, как посмотрел на реализацию ExtractMSecFromString) в XML-файле разделитель между секундами и миллисекундами с '.' на ':' (time separator), нормально разобралось, миллисекунды норм. прочитались.
Т.е. вот такое прочитало нормально
<start>17.02.2021 15:30:20:300</start>


Сообщение было отредактировано: 17 фев 21, 13:59
17 фев 21, 14:02    [22282274]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
s62
заменил (после того, как посмотрел на реализацию ExtractMSecFromString) в XML-файле разделитель между секундами и миллисекундами с '.' на ':' (time separator), нормально разобралось, миллисекунды норм. прочитались.
Не то сделали. Верните обратно и добавьте
FS.DecimalSeparator = '.';
17 фев 21, 19:41    [22282464]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1255
_Vasilisk_,
проверю. Но, как сделал, меня вполне устраивает. При отображении на форме я показываю через точку, а то, что в xml хранится через двоеточие, никому особо не мешает. Разве что кто-то вручную править файл станет и не обратит внимания, что нужно двоеточие.
17 фев 21, 22:48    [22282519]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1255
Переделал. Чтобы везде одинаково было, так всё-таки красивее в плане логики.
17 фев 21, 23:19    [22282532]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1255
_Vasilisk_, спасибо.
18 фев 21, 00:04    [22282540]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
Вообще формат времени в XML это не абы кому как нравится, а стандарт. Так что никаких : между сек и мсек
18 фев 21, 10:41    [22282631]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1255
deleted

Сообщение было отредактировано: 18 фев 21, 11:26
18 фев 21, 11:29    [22282654]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12572
Fr0sT-Brutal
формат времени в XML это не абы кому как нравится, а стандарт.
Который записывается принципиально по другому. А с форматом dd.mm.yyyy hh:nn:ss.zzz уже не важно точка там или двоеточие
18 фев 21, 12:15    [22282689]     Ответить | Цитировать Сообщить модератору
 Re: StrToSQLTimeStamp отобразить миллисекунды  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
_Vasilisk_
Который записывается принципиально по другому. А с форматом dd.mm.yyyy hh:nn:ss.zzz уже не важно точка там или двоеточие

А ну да, там SQL, а не XML
18 фев 21, 13:12    [22282753]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить