Тоже решил побаловаться
Код:
/// <Description>Извлечение даты и времени из формата UnixTime от 01.01.2000</Description>
/// <GroupName>Дата и время</GroupName>
function_block UDT_to_DT // от 01.01.2000
var_input
UDT: udint := 0; //дата и время в формате Unix от 01.01.2000 в секундах
end_var
var_output
day: udint;
month: udint;
year: udint;
hour: udint;
min: udint;
sec: udint;
week: udint;
end_var
var
day_in_month: array [1..12] of udint := [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
uiDay: udint;
days_to_year, days_to_month: udint;
is_leap_year : bool;
end_var
if UDT = 0 then UDT := dt_to_udint(get_date_time()); end_if
// Определяем год
year := UDT / 31556926 + 2000;
//Количество дней с 01.01.2000 до начала текущего года
days_to_year := (year - 2000) * 365 + (year - 1997)/4 - (year - 1901)/100 + (year - 1601)/400;
//Количество дней с начала года
uiDay := UDT / 86400 - days_to_year + 1;
//Месяц
month := uiDay * 86400 / 2629743 + 1;
//Проверяем год на високосность
is_leap_year := (year mod 400 = 0) or ((year mod 4 = 0) and (year mod 100 <> 0));
//Количество дней до начала месяца
days_to_month := day_in_month[month] + bool_to_udint(is_leap_year and month > 2);
//День
day := uiDay - days_to_month;
//Время
hour := (UDT / 3600) mod 24;
min := (UDT / 60) mod 60;
sec := UDT mod 60;
//День недели
week := ((UDT / 86400 + 6) mod 7);
if week = 0 then week := 7; end_if
end_function_block