Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,159
1

Посчитать количество месяцев между двумя датами

27.04.2015, 12:24. Просмотров 3961. Ответов 8
Метки нет (Все метки)

Добрый день!

Нужно посчитать количество полных месяцев между двумя датами. Пишу:

C#
1
2
3
4
            DateTime dt1 = new DateTime(2014, 1, 1);
            DateTime dt2 = new DateTime(2014, 12, 31);
            int months = (dt2.Month + dt2.Year * 12) - (dt1.Month + dt1.Year * 12);
            MessageBox.Show(months.ToString());
Выводит 11 месяцев. Хотя по коду начали с 1 января, а закончили - 31 декабря. Где ошибка в коде, как правильно подсчитать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2015, 12:24
Ответы с готовыми решениями:

Найти количество месяцев между датами
1) Ввести две даты и определить количество месяцев между ними { struct vremya { DateTime...

Вычислить количество месяцев и дней между датами
В общем-то не охота писать такой код самому. Как уже имеющими средствами (тем же DateTime)...

Как определить количество дней между двумя датами, исключая выходные
Люди, подскажите как можно определить количество дней между двумя датами, исключая выходные? я...

Вычислить разницу между двумя датами
Здравтсвуйте. Подскажите, как можно вычислить разницу между двумя датами в днях, а затем прописать...

8
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.04.2015, 12:41 2
Suppir, а что имеется ввиду под месяцем? с 31 января по 1 февраля сколько месяцев? А с 1 января по 28 февраля?
0
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,159
27.04.2015, 12:44  [ТС] 3
Цитата Сообщение от Psilon Посмотреть сообщение
с 31 января по 1 февраля сколько месяцев? А с 1 января по 28 февраля?
В указанных случаев 0 месяцев.


---
Мне нужно для расчета зарплаты за период. Если человек месяц отработал, то добавляем 1 месяц. Сначала использовал функцию:
C#
1
nMonth = dt2.Subtract(dt1).Days / (365.25 / 12);
Но в таком случае при расчете за год показывает не 12 месяцев, а чуть 11,95.
0
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.04.2015, 12:55 4
ну и? А если по 30 декабря отработал. Или по 20? Сколько это месяцев и почему?
0
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,159
27.04.2015, 12:56  [ТС] 5
Если отработал с 1 января до 30 декабря (а в декабре 31 день), тогда считаем 11 полных месяцев.
0
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.04.2015, 14:17 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C#
1
 var nMonth = (int) (dt2.Subtract(dt1).TotalDays/(365.25/12)) + (dt2.AddDays(1).Month == dt2.Month ? 0 : 1);
1
25 / 25 / 10
Регистрация: 08.08.2011
Сообщений: 1,159
27.04.2015, 15:11  [ТС] 7
Спасибо, попробую!
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 1
12.11.2015, 10:18 8
Мой вариант подсчета количества месяцев между 2-мя датами (Javascript):
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
   var dateDiff = {
      /**
       * Разница между датами в месяцах
       * @param {Date} date1
       * @param {Date} date2
       * @returns {{months: number, daysCount: number}}
       */
      inMonths: function(date1, date2) {
         var begin = date1;
         var end = date2;
         // Сравниваем даты, расставим их так, чтобы начало было меньше либо равно концу
         if (date1.getTime() > date2.getTime()) {
            begin = date2;
            end = date1;
         }
         // Вычисляем суммарную разницу между датами по разницам в годах*12 и месяцах
         var months = (end.getFullYear() - begin.getFullYear()) * 12 + end.getMonth() - begin.getMonth();
         // Учитываем влияние разницы в днях на количество месяцев + остаток в днях в переменной daysCount
         var daysCount = 0;
         if (end.getDate() < begin.getDate()) {
            months -= 1;  // производим заем месяца из имеющихся
            // В зависимости от месяца в "меньшей" дате, вычисляем остаток в днях
            daysCount = dateDiff.daysInMonth(end.getFullYear(), begin.getMonth()) - begin.getDate() + end.getDate();
         }
         else {
            // при положительной или нулевой разнице дней
            daysCount = end.getDate() - begin.getDate();  // банальная разность
         }
         return {
            months: months,
            daysCount: daysCount
         };
      },
      /**
       * Количество дней в месяце указанного года
       * @param month - целевой месяц
       * @param year - целевой год
       * @returns {Number}
       */
      daysInMonth: function daysInMonth(month, year) {
         return new Date(year, month, 0).getDate();
      }
   };
 
   console.log(dateDiff.inMonths(new Date(2015, 0, 1), new Date(2015, 0, 1))); // 0
   console.log(dateDiff.inMonths(new Date(2015, 0, 1), new Date(2015, 0, 31))); // 0
   console.log(dateDiff.inMonths(new Date(2015, 0, 1), new Date(2015, 1, 1))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 1), new Date(2015, 2, 1))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 28), new Date(2015, 2, 31))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 28), new Date(2015, 2, 30))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 28), new Date(2015, 2, 29))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 27), new Date(2015, 2, 28))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 0, 1), new Date(2015, 1, 28))); // 1
   console.log(dateDiff.inMonths(new Date(2015, 1, 27), new Date(2013, 2, 28))); // 22
0
Master of Orion
Эксперт .NET
6078 / 4934 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.11.2015, 10:44 9
mfvanek, нулябрь?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2015, 10:44

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

Вычислить разницу в днях между двумя датами
using System; class Rerr { static void Main() { const ulong DayInYear = 365;...

Получить разницу между двумя датами в днях
Доброго времени суток! Пытаюсь решить задачу, есть выбранная дата,мне нужно вычесть,что бы...

Получить разницу между двумя датами в минутах
Добрый всем день! Возникла проблемка: забираю с базы данных значение даты и времени (01.09.2014...

Вычисление дня недели и количества дней между двумя датами
Ребят,мне нужно написать программу &quot;Вычисление дня недели и количества дней между двумя датам&quot; я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.