powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UnixToDateTime потокобезопасная функция?
7 сообщений из 7, страница 1 из 1
UnixToDateTime потокобезопасная функция?
    #39733970
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В потоке делаю преобразование

Код: pascal
1.
2.
uses System.DateUtils;
dt:= UnixToDateTime(Val, false);



когда потоков много иногда вылетает два типа ошибок:
1. is not a valid timestamp '-2125364912.12043000'
2. division by zero

я могу смотреть не туда и не так, и вообще сложность программ на уровне А+Б.

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

Кто-нибудь сталкивался с таким?
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734104
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbя могу смотреть не туда и не так

Правильным будет смотреть:
1) Стэк вызовов при получении ошибки;
2) Исходники этой процедуры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734186
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходников UnixToDateTime под рукой нет, но что-то подсказывает, что там обычная математика и thread safe должно быть. Я бы смотрел в соседний код (подобные ошибки говорят о том, что где-то затирается память левым вызовом free, присвоением не туда, выходом за пределы массива и т.п.). Надо включить в настройках проекта компилятора RangeCheck (и другие проверки).
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734196
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
JaDiИсходников UnixToDateTime под рукой нет, но что-то подсказывает, что там обычная математика и thread safe должно быть. Я бы смотрел в соседний код (подобные ошибки говорят о том, что где-то затирается память левым вызовом free, присвоением не туда, выходом за пределы массива и т.п.). Надо включить в настройках проекта компилятора RangeCheck (и другие проверки).

Обычная математика только в версии до 2010
Код: pascal
1.
2.
3.
4.
function UnixToDateTime(const AValue: Int64): TDateTime;
begin
  Result := AValue / SecsPerDay + UnixDateDelta;
end;



начиная с XE, там такой трэшак, что мама не горюй
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734212
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,
этот код, если не учитывать локальные настройки (без GetTimeZoneInformation), а вот с локальными да, там идет запрос к системным библиотекам Windows.
В итоге я взял код из Jcl, в комментах GunSmoker писал

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function DateTimeToLocalDateTime(DateTime: TDateTime): TDateTime;
var
TimeZoneInfo: TTimeZoneInformation;
begin
ResetMemory(TimeZoneInfo, SizeOf(TimeZoneInfo));
case GetTimeZoneInformation(TimeZoneInfo) of
TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_UNKNOWN:
Result := DateTime - (TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / MinutesPerDay;
TIME_ZONE_ID_DAYLIGHT:
Result := DateTime - (TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / MinutesPerDay;
else
raise EJclDateTimeError.CreateRes(@RsMakeUTCTime);
end;
end;



Только не стал заморачиваться с MinutesPerDay , а заменил на константу 24*60
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734215
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при старте приложения один раз получаю TimeZoneInfo, считаю смещение

Код: pascal
1.
delta:= (TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / MinutesPerDay


или
Код: pascal
1.
delta:=(TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / MinutesPerDay



и
Код: pascal
1.
 Result := AValue / SecsPerDay + UnixDateDelta + delta
...
Рейтинг: 0 / 0
UnixToDateTime потокобезопасная функция?
    #39734217
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее

Код: pascal
1.
Result:= (AValue/86400) + 25569 - Delta;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / UnixToDateTime потокобезопасная функция?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]