Перейти к содержанию
Fire Monkey от А до Я
  • 0

Дата/время в сервисе


Rusland

Вопрос

В сервисе сохраняю дату и время вот так:

var
  IniFile: TIniFile;
  SDT: string;
  FS: TFormatSettings;
begin
  IniFile := TIniFIle.Create(System.IOUtils.TPath.Combine(
                               System.IOUtils.TPath.GetDocumentsPath, 'D.ini'));
  try
    FormatSettings.ShortDateFormat:='yyyy-mm-dd';
    FormatSettings.DateSeparator := '-';
    FormatSettings.LongTimeFormat := 'hh:nn:ss';
    FormatSettings.TimeSeparator := ':';

    SDT:=DateTimeToStr(Now());

    IniFile.WriteString('SERVER','LastOnline',SDT);
    
  finally
    IniFile.free;
  end;

Получаю 31.05.2016 11:08

Тот же самый код в основном приложении выдает 2016-05-31 11:08

В чем моя ошибка?

PS. Что происходит в сервисе дебагером посмотреть не удается, Дельфи просто не реагирует на точки останова

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 1

У вас ошибка в коде, неверно SDT:=DateTimeToStr(Now()), а вот так верно SDT:=DateTimeToStr(ADateTime,FormatSettings). Вы не использовали выставленные в FormatSettings значения.

Но есть и другие варианты хранения:

var
  IniFile: TIniFile;
  SDT: string;
  FS: TFormatSettings;
  ADateTime : TDateTime;
  ADateTimeUnix : Int64;
begin
  IniFile := TIniFIle.Create(System.IOUtils.TPath.Combine(
                               System.IOUtils.TPath.GetDocumentsPath, 'D.ini'));
  try
    ADateTime:=Now();
// Ваш вариант
    FormatSettings.ShortDateFormat:='yyyy-mm-dd';
    FormatSettings.DateSeparator := '-';
    FormatSettings.LongTimeFormat := 'hh:nn:ss';
    FormatSettings.TimeSeparator := ':';
    SDT:=DateTimeToStr(ADateTime,FormatSettings); // Обратите внимание на второй параметр

// Вариант с использованием настроек устройства
    FS:=TFormatSettings.Create; // В FS теперь настройки локали устройства
    SDT:=DateTimeToStr(ADateTime,FS);

// Вариант с использованием ISO8601
    SDT:=DateToISO8601(ADateTime);

//Вариант хранения в Unix формате - наиболее надежный в плане обратимости
    ADateTimeUnix:=DateTimeToUnix(ADateTime);
    SDT:=ADateTimeUnix.ToString;

    IniFile.WriteString('SERVER','LastOnline',SDT);
  finally
    IniFile.free;
  end;
end;

Если не нужна человекочитаемость ini файла, то лучше хранить в UNIX формате

Ссылка на комментарий
  • 0

Евгений Корепов, я уже пробовал и так:

    FormatSettings.ShortDateFormat:='yyyy-mm-dd'; 
    FormatSettings.DateSeparator := '-';
    FormatSettings.LongTimeFormat := 'hh:nn:ss';
    FormatSettings.TimeSeparator := ':';

    SDT:=DateTimeToStr(Now(),FormatSettings);

и так

    FS:=TFormatSettings.Create; 
    FS.ShortDateFormat:='yyyy-mm-dd';
    FS.DateSeparator := '-';
    FS.LongTimeFormat := 'hh:nn:ss';
    FS.TimeSeparator := ':';
    SDT:=DateTimeToStr(Now(),FS);

все равно в файле сохраненный вид такой: 31.06.2016 13:34  (и да, формат даты и времени на планшете именно такие)... именно в сервисе так происходит

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

 

3 минуты назад, Rusland сказал:

Евгений Корепов, я уже пробовал и так:


    FormatSettings.ShortDateFormat:='yyyy-mm-dd'; 
    FormatSettings.DateSeparator := '-';
    FormatSettings.LongTimeFormat := 'hh:nn:ss';
    FormatSettings.TimeSeparator := ':';

    SDT:=DateTimeToStr(Now(),FormatSettings);

и так


    FS:=TFormatSettings.Create; 
    FS.ShortDateFormat:='yyyy-mm-dd';
    FS.DateSeparator := '-';
    FS.LongTimeFormat := 'hh:nn:ss';
    FS.TimeSeparator := ':';
    SDT:=DateTimeToStr(Now(),FS);

все равно в файле сохраненный вид такой: 31.06.2016 13:34  (и да, формат даты и времени на планшете именно такие)... именно в сервисе так происходит

FormatDateTime('yyyy-mm-dd hh:nn:ss', Date)

так не пробовал ?

Ссылка на комментарий
  • 0
20 минут назад, master webs сказал:

а что значит  nn ?  yyyy-mm-dd hh:nn:ss

разве не yyyy-mm-dd hh:mm:ss должно быть

 

DateTime.Now.ToString("yyyy-mm-dd hh:mm:ss ") 

mm

 - Displays the month as a number with a leading zero (01-12). If the mm specifier immediately follows an h or hh specifier, the minute rather than the month is displayed.

nn - Displays the minute with a leading zero (00-59).

http://docwiki.embarcadero.com/Libraries/XE5/en/System.SysUtils.FormatDateTime

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0
  • Модераторы

я пользуюсь вот такой штукой, правда не в сервисе

function MakeDateTime: string;
var
   Buf: TFormatSettings;
begin
   Buf := FormatSettings;
   Buf.DateSeparator := '-';
   Buf.ShortDateFormat := 'yyyy-mm-dd';
   Result := DateTimeToStr(Now, Buf);
end;

 

Ссылка на комментарий
  • 0
56 минут назад, ZuBy сказал:

я пользуюсь вот такой штукой, правда не в сервисе


function MakeDateTime: string;
var
   Buf: TFormatSettings;
begin
   Buf := FormatSettings;
   Buf.DateSeparator := '-';
   Buf.ShortDateFormat := 'yyyy-mm-dd';
   Result := DateTimeToStr(Now, Buf);
end;

 

Аналогичная проблема

Ссылка на комментарий
  • 0

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

var

y1,m1,d1:word;
ts1:string;

begin

decodedate(now(),y1,m1,d1);
ts1:=inttostr(y1)+ '-'+ inttostr(m1)+ '-'+inttostr(d1);

//Ну в общем вы поняли

Так потом про это забыл, 10 лет работало и до сих пор безотказно работает)))

Только там еще функция была, если однозначные цифры в дате и месяце, то есть 1, 2 .....9 то там в string впереди вставлялся 0 (ноль)

 

Изменено пользователем Vitaldj
Ссылка на комментарий
  • 1

У меня есть смутное подозрение, что код сервиса почему-то не обновляется. Т.е ваш сервис остается самой первой версии, какой был установлен. Ничем другим объяснить такое поведение я не могу :) 

Попробуйте кроме сохранения в ини писать в лог, что ли...

Ссылка на комментарий
  • 0
2 минуты назад, kami сказал:

У меня есть смутное подозрение, что код сервиса почему-то не обновляется. Т.е ваш сервис остается самой первой версии, какой был установлен. Ничем другим объяснить такое поведение я не могу :) 

Попробуйте кроме сохранения в ини писать в лог, что ли...

Я делал Clean - Build сервиса (и не один раз) чтобы точно быть уверенным, что он обновился.

Когда я пытаюсь писать в лог из сервиса, то в лог ничего не приходит (не только здесь, а вообще). Единственное что в сервисе у меня есть поток, так вот из потока сообщения в лог приходят нормально (из основного приложения тоже норм). Происходят какие-то трудноуловимые ошибки либо в самой среде, либо у меня в коде... скорее последнее, но как определить в чем проблема непонятно.

 

Ссылка на комментарий
  • 0

Похоже в словах kami есть правда... будто код не меняется... решил я переделать в UNIX-формат как посоветовал Евгений Корепов:

    ADateTimeUnix:=DateTimeToUnix(Now());
    SDT:=ADateTimeUnix.ToString;

    IniFile.WriteString('SERVER','LastOnline',SDT);

o_O

И вот что я вижу при чтении:

'31.05.16 17:21:52' 

Время меняется, значит файл перезаписывается... но почему на изменение кода не реагирует? Я уже и папки Android и JavaClasses вручную удалял

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...