|
Получить номера месяцев между датами | ☑ | ||
---|---|---|---|---|
0
1ctube
07.06.21
✎
09:15
|
Доброго времени суток. Нужно получить номера месяцев между двумя датами. В коде. Например: 25.02.2021 - 03.05.2021 то на выходе: 2,3,4,5.
Есть ли готовая системная функция для получения инфы в таком виде ? Попробовал так: Месяц(ДатаОкончания)-Месяц(ДатаНачала)+1+12*(Год(ДатаОкончания)-Год(ДатаНачала)); Но так возвращается только количество месяцев между датами |
|||
1
acanta
07.06.21
✎
09:18
|
Это да... Проблема(
|
|||
2
Ненавижу 1С
гуру
07.06.21
✎
09:20
|
(0) зачем? будем искать причину
|
|||
3
ДенисЧ
07.06.21
✎
09:20
|
Цикл написать - лениво?
|
|||
4
Ненавижу 1С
гуру
07.06.21
✎
09:21
|
+(2) к тому, что сделать можно, но стоит ли?
|
|||
5
Масянька
07.06.21
✎
09:21
|
(0) Готовой системной нет.
|
|||
6
1ctube
07.06.21
✎
09:24
|
(1) Это да(
|
|||
7
1ctube
07.06.21
✎
09:24
|
(3) Нет, цикл то написать всегда можно, просто хотел в одну короткую строчку
|
|||
8
1ctube
07.06.21
✎
09:24
|
(5) Жаль(((
|
|||
9
1ctube
07.06.21
✎
09:25
|
(4) Да, стоит
|
|||
10
Обработка
07.06.21
✎
09:26
|
(0) Как можно додуматься до того чтоб допустить вопрос у себя в голове нет ли системной функции такой?
Тогда уж. Нет ли системной функции который возвращает все числа которые стоят между двумя? например 3 и 8 Ответ 4,5,6,7 |
|||
11
Масянька
07.06.21
✎
09:26
|
(7) Хотеть и мочь - две большие разницы. Особенно, в случае с продуктами 1С.
|
|||
12
ДенисЧ
07.06.21
✎
09:26
|
(7) Обычно хотят, чтобы подлинее было... ))))
|
|||
13
Обработка
07.06.21
✎
09:29
|
(0) Что должен вернуть функция? Строку = "2,3,4,5"? Числа в списке = 2,3,4,5 ..
Или как? |
|||
14
SleepyHead
гуру
07.06.21
✎
09:29
|
(12) С этим вам не на форум 1с надо )
|
|||
15
ДенисЧ
07.06.21
✎
09:38
|
(14) Я про оплату по количеству строк. А вы о чём?
|
|||
16
Масянька
07.06.21
✎
09:38
|
(12) Говорят, что главное не размер, а умение.
🤔 |
|||
17
Мультук
гуру
07.06.21
✎
09:38
|
(0) Готовой системной функции нет.
Но ты ее напиши сам, а затем не забудь поделиться с сообществом в данной теме. |
|||
18
Масянька
07.06.21
✎
09:39
|
(15) О! И я про тоже.
|
|||
19
1ctube
07.06.21
✎
09:42
|
(12) Если слишком длинно то не удобно и приходиться укоротить)
|
|||
20
SleepyHead
гуру
07.06.21
✎
09:52
|
(15) Ну в (12) было про длину что-то.
|
|||
21
Aleksey
07.06.21
✎
10:00
|
А если несколько лет то как?
|
|||
22
ДенисЧ
07.06.21
✎
10:03
|
(20) Длина файла с кодом... А вам, батенька, нужно к специалистам ))
|
|||
23
1Сергей
07.06.21
✎
10:12
|
ВНИМАНИЕ! Не используйте код ниже! Это опасно для жизни. Написано ради хохмы
Для Идн = (Год(ДатаНачала)*12 + Месяц(ДатаНачала)-1) По (Год(ДатаОкончания)*12 + Месяц(ДатаОкончания)-1) Цикл НомерМесяца = Идн%12 + 1; |
|||
24
Масянька
07.06.21
✎
10:13
|
(22) Длинный файл с кодом - неудобно.
Это вам, батенька, надо к специалистам. 🤦🏻♀️ |
|||
25
fisher
07.06.21
✎
10:31
|
Не проверял
|
|||
26
Serg_1960
07.06.21
✎
10:34
|
[Как страшно жить] А если начало периода - в предыдущем году, а окончание периода - в текущем? Как автор считать месяца с одинаковыми номерами будет? Непонятно, однако.
|
|||
27
fisher
07.06.21
✎
10:34
|
А, ччерт. Перемудрил. Если несколько лет, то неправильно может работать.
|
|||
28
1Сергей
07.06.21
✎
10:36
|
(25) с 12.2020 по 01.2021 от туда ещё два года накинет
|
|||
29
1Сергей
07.06.21
✎
10:38
|
(26) /vangamode on
он колонки в таблицу выводит /vangamode off |
|||
30
fisher
07.06.21
✎
10:40
|
(28) Не, в этом случае ок будет. Не ок будет, если 07.2020 - 02.2023
|
|||
31
1Сергей
07.06.21
✎
10:40
|
(30)
Для НомерМесяца = Макс(МесяцНачала, МесяцОкончания) По 12 Цикл // с 1 по 12 МассивМесяцев.Добавить(НомерМесяца); КонецЦикла; Для НомерМесяца = 1 По Мин(МесяцНачала, МесяцОкончания) Цикл // с 1 по 12 МассивМесяцев.Добавить(НомерМесяца); КонецЦикла; |
|||
32
fisher
07.06.21
✎
10:44
|
(31) Ну и? Первый цикл будет с 12 по 12, второй с 1 по 1.
|
|||
33
1Сергей
07.06.21
✎
10:44
|
(31) сторно
|
|||
34
1Сергей
07.06.21
✎
10:45
|
(32) прастити, фигню сморозил
|
|||
35
Ненавижу 1С
гуру
07.06.21
✎
10:55
|
class Program
{ public static IEnumerable<int> MonthNumbers(DateTime d1, DateTime d2) { return Enumerable.Range(d1.Year * 12 + d1.Month, (d2.Year - d1.Year) * 12 + (d2.Month - d1.Month) + 1).Select(n => n % 12 == 0 ? 12 : n % 12); } static void Main(string[] args) { DateTime d1 = new DateTime(2021, 02, 05); DateTime d2 = new DateTime(2021, 05, 03); foreach(var c in MonthNumbers(d1,d2)) { Console.WriteLine(c); } Console.ReadKey(); } } |
|||
36
ДенисЧ
07.06.21
✎
10:56
|
(35) Что это, Бэрримор?
|
|||
37
1Сергей
07.06.21
✎
10:57
|
(35) Проверял?
|
|||
38
Ненавижу 1С
гуру
07.06.21
✎
10:59
|
(37) да
|
|||
39
1Сергей
07.06.21
✎
11:00
|
Лаааадна
|
|||
40
fisher
07.06.21
✎
11:06
|
(35) Избыточно. С ростом диапазона будет больше размер списка, в то время как легко без этого обойтись.
|
|||
41
fisher
07.06.21
✎
11:08
|
Я понял задачу так, что дубли не нужны. Хотя задача похоже или некорректно сформулирована или не имеет отношения к реальной практике.
|
|||
42
wertyu
07.06.21
✎
11:09
|
ДатаОкончания = НачалоМесяца(ДатаОкончанияПериода);
ДатаЦикла = НачалоМесяца(ДатаНачалаПериода); МассивМесяцев = Новый Массив; Пока ДатаЦикла <= ДатаОкончания Цикл МассивМесяцев.Добавить(Месяц(ДатаЦикла)); ДатаЦикла = ДобавитьМесяц(ДатаЦикла, 1); КонецЦикла; |
|||
43
1ctube
07.06.21
✎
11:10
|
(17) "Но ты ее напиши сам, а затем не забудь поделиться с сообществом в данной теме."
Вот что получилось в итоге: КоличествоМесяцев = Месяц(ДатаОкончания)-Месяц(ДатаНачала)+1+12*(Год(ДатаОкончания)-Год(ДатаНачала)); Пока НЕ КоличествоМесяцев = 0 Цикл НомерМесяца = Месяц(ДобавитьМесяц(ДатаНачала,КоличествоМесяцев-1)); КоличествоМесяцев = КоличествоМесяцев -1; КонецЦикла; А дальше номермесяца можно пихать в тз и т.д. |
|||
44
Ненавижу 1С
гуру
07.06.21
✎
11:10
|
(40) ленивые вычисления же
|
|||
45
1ctube
07.06.21
✎
11:11
|
(41) Нужен просто список номером месяца между заданными интервалами в таком в виде:
2 3 4 5 |
|||
46
wertyu
07.06.21
✎
11:12
|
(45) период всегда меньше года?
|
|||
47
1ctube
07.06.21
✎
11:13
|
(42) Тоже хороший вариант!
|
|||
48
1ctube
07.06.21
✎
11:13
|
(46) Да
|
|||
49
Serg_1960
07.06.21
✎
11:14
|
Так, как скучно просто так номера считать, то я имена месяцев считал :) ИменаМесяцев.Количество() - количество сами подсчитаете :))
НачалоПериода = Дата("20190516"); КонецПериода = Дата ("20210921"); НачПериод = НачалоМесяца(НачалоПериода); КонПериод = КонецМесяца(КонецПериода); ИменаМесяцев = Новый Массив; ТекДата = НачПериод; Пока Истина Цикл Если ТекДата >= НачПериод И ТекДата <= КонПериод Тогда ИменаМесяцев.Добавить(Формат(ТекДата,"ДФ=MMMM")); ТекДата = ДобавитьМесяц(ТекДата,1); Иначе Прервать; КонецЕсли; КонецЦикла; |
|||
50
fisher
07.06.21
✎
11:17
|
(44) И чем это лечит? Тут вроде нет "лишних" вычислений которые смогут быть отброшены.
|
|||
51
Ненавижу 1С
гуру
07.06.21
✎
11:19
|
(50) причем тут лечит и вычисления? главное оно не хранится в памяти целиком при вычислении, если ты специально не заставишь его это сделать
|
|||
52
fisher
07.06.21
✎
11:24
|
(51) А, ты про память! А я еще и про молотилку, если дубли не нужны.
|
|||
53
Ненавижу 1С
гуру
07.06.21
✎
11:25
|
(52) так никто не говорил, что дубли не нужны, хотя может я пропустил
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |