Имя: Пароль:
1C
1C 7.7
v7: Секунды перевести в Дату, как?
, ,
0 Orfin
 
18.01.19
12:20
Изначально цель сделать операции с датами как в 8ке. Т.е к Дата Время прибавить/отнять секунды и получить новые Дата время. Например, 01.01.2019 23:50:00  + 3600 секунд = 02.01.2019 00:50:00

Так я перевожу из Даты в Секунду, наверное правильно.

Функция ПеревестиДатуВСекунды(Знач Дата1)
    
    ВсегоДней1 = Дата1 - Дата(1,1,1);    
    ВСекундах1 = ВсегоДней1 * 86400;
    
    Возврат ВСекундах1;
    
КонецФункции // ПеревестиВремяВСекунды

Теперь нужно обратно, как это правильно сделать?

Нашел в интернете функцию по переводу секунд в время, она работает, хотел по подобию сделать, что бы секунды перевести в Дату

Функция ПеревестиИзСекундВВремя(Знач sec)
    
        часов = Цел(sec/(3600));
    минут = Цел((sec-часов*3600 )/60);
    сек = sec-часов*3600-минут*60;
    рез = Строка(Формат(часов,"Ч(0)2"))+":"+Строка(Формат(минут,"Ч(0)2"))+":"+Строка(Формат(сек,"Ч(0)2"));
    
    Возврат рез;
    
КонецФункции // ПеревестиИзСекундВВремя

по подобию вышло что то типа такого ...

Годов = Цел(sec/(СекундВГоде));
Месяцев = Цел((sec-Годов*СекундВГоде)/СекундВМесяце);
Дней = Цел((sec-Годов*СекундВГоде - Месяцев*СекундВМесяце)/86400);

но тут проблема в том, что не известно сколько секунд в Годе или месяце, бывает ведь 28, 30, 31 день в месяце.
1 SleepyHead
 
гуру
18.01.19
12:21
(0) А в каком месяце сколько дней, ты тоже не знаешь? И не умеешь определять месяц по дате?
2 Масянька
 
18.01.19
12:23
(0) А обязательно секунды?
3 Orfin
 
18.01.19
12:26
(1) Не знаю, на входе функции только секунды

(2) Есть еще варианты?
просто операции с датой время удобно совершать в секундах.
т.е Дату время переводим в секунды, совершаем операции, потом обратно.
4 Orfin
 
18.01.19
12:29
Рассмотрю любые варианты, главное что бы в 7.7 можно было делать так, как писал выше, например
01.01.2019 23:50:00  + 3600 секунд = 02.01.2019 00:50:00
5 AlS
 
18.01.19
12:32
А если как-то так
ДеньГода = Цел((sec-Годов*СекундВГоде)/СекундВДне);

а дальше уже с этим поиграться ?
6 Масянька
 
18.01.19
12:34
(4) Из общего журнала в ТиС:
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
//
//******************************************************************************
// ПолучитьВремяДокументаЧислом(Док)
//
// Параметры:
//  Док - документ, чьё время надо получить
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Преобразует время документа в число.
//
Функция ПолучитьВремяДокументаЧислом(Док)
    Перем Ч,М,С;  
    Док.ПолучитьВремя(Ч,М,С);
    Возврат 3600*Ч+60*М+С;
КонецФункции // ПолучитьВремяДокументаЧислом()

//******************************************************************************
// УстановитьВремяДокументаЧислом(Док, Сек)
//
// Параметры:
//  Док - документ, чьё время надо установить
//  Сек - число, новое время документа в секундах (с начала дня)
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Устанавливает новое время документа.
//
Процедура УстановитьВремяДокументаЧислом(Док, Сек)
    Перем Ч,М,С;
    Ч=Цел(Сек/3600);
    Сек=Сек-Ч*3600;
    М=Цел(Сек/60);
    С=Сек-М*60;
    Док.УстановитьВремя(Ч,М,С);
КонецПроцедуры // УстановитьВремяДокументаЧислом()

Получаешь свое время числом. Прибавляешь свои секунды (числом). Из числа получаешь время.
Кушаешь печеньки (Ёпрст)
7 Pahomich
 
18.01.19
12:34
В чем проблема? Напиши нужную библиотек функций даты и времени, помести в глобальный модуль.
8 uno-group
 
18.01.19
12:38
Зачем с месяцем заморачиваться есть же НомерДняГода
9 Orfin
 
18.01.19
12:40
(6) операции со временем у меня уже получаются.
т.е я перевожу время в секунды и обратно, всё ок.
проблема с датой.

Функция ПеревестиВремяВСекунды(Знач Время)
    
    Спис = глРазложить(Время, ":");
    Часы1 = Число(Спис.ПолучитьЗначение(1));
    Минуты1 = Число(Спис.ПолучитьЗначение(2));
    Секунды1 = Число(Спис.ПолучитьЗначение(3));
    
    ВСекундах1 = Часы1 * 3600 + Минуты1 * 60 + Секунды1;
    
    Возврат ВСекундах1;
    
КонецФункции // ПеревестиВремяВСекунды

с секундами совершаем опрецаии. и обратно

Функция ПеревестиИзСекундВВремя(Знач sec)
    
    //    hours = sec / 3600  % 24;
    //    minutes = sec / 60 % 60;
    //    seconds = sec % 60;    
    //
    //    Возврат Строка(hours) +":"+ Строка(minutes) +":"+ Строка(seconds);
    
    часов = Цел(sec/(3600));
    минут = Цел((sec-часов*3600 )/60);
    сек = sec-часов*3600-минут*60;
    рез = Строка(Формат(часов,"Ч(0)2"))+":"+Строка(Формат(минут,"Ч(0)2"))+":"+Строка(Формат(сек,"Ч(0)2"));
    
    Возврат рез;
    
КонецФункции
10 SleepyHead
 
гуру
18.01.19
12:43
У тебя есть дата и количество секунд, которые надо к ней прибавить.

Посчитай, сколько у тебя полных дней: подели количество секунд на 86 400 и возьми целую часть.

Теперь прибавь к исходной дате это количество дней, в 1с77 это простая операция: мДата + N

Потом прибавь остаток секунд. Это уже посложнее, но я все-таки крупный стратег, а не мелкий тактик, дальше сам.
11 uno-group
 
18.01.19
12:43
Дата1+ Цел(Добавитьсекунд/86400);
Получишь новую дату, а дальше работаешь с остатком.
Если сумма секунд старого документа + остаток от добавить секунд от  больше 86400 то добавляешь ее день.
12 uno-group
 
18.01.19
12:44
а от часов отнимаешь 24
13 SleepyHead
 
гуру
18.01.19
12:45
(11) я первый написал! ))
14 Василий Алибабаевич
 
18.01.19
12:46
(0) "28, 30, 31"
В смысле - "невисокостный год", "високостный год" и "хренпойминаскольковисокостный"?
15 Масянька
 
18.01.19
12:48
16 uno-group
 
18.01.19
12:50
(13) главное ему же это 99% что нафик не нужно. Неправильная постановка задачи и перевод ее в алгоритм.
17 SleepyHead
 
гуру
18.01.19
12:57
(16) Но чисто математически задача интересная. А так согласен, человек мается ерундой.
18 vova1122
 
18.01.19
13:11
(0) Озвучь задачу. Может это вообще не то.
У меня была задача похожая. На входе я имел дату документа в UNIX-системе (число секунд которые прошли от 01.01.1970 года по Гринвичу). Из этой даты нужно было установить дату и время документа в 1С7. Если у вас задача похожая, могу поделиться кодом.
19 Orfin
 
18.01.19
13:30
Спасибо всем! Вроде работает

Функция ПеревестиИзСекундВДату(Знач sec)

    Дней = sec / 86400;
    рез = Дата(1,1,1) + Дней;
    
    Возврат рез;    
    
КонецФункции // ПеревестиИзСекундВВремя

Дальше буду писать в целом к дате время прибавить секунды. Пока что у меня функции по отдельности для дат и секунд.

(18)  Задача такая, что Есть данные прихода, ухода сотрудников в виде 25.09.18 типа дата, и отдельно время 16:51:47 тип строка.
Нужно считать сколько работал человек и сравнивать с графиком работы, и производить всяческие операции, прибавить к ДатаВремя секунды, отнять, разница, и т.д
20 vova1122
 
18.01.19
13:44
(19) если переводишь дату в секунды не забывай перевести и время в секунды и сложить их. (для Дата1 и для Дата2). Тогда просто будет посчитать время сколько сотрудник стоял у станка.
И когда к дате добавляешь число то отбрасывай дробную часть от Дней.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.