#c# #c#-4.0
#c# #c #-4.0
Вопрос:
Я создал класс под названием Kvartal (что переводится как Квартал) для использования в моей программе:
public sealed class Kwartal {
private DateTime _poczatekKwartalu;
private DateTime _koniecKwartalu;
private int _numerKwartalu;
private int _rok;
public Kwartal(int numer, DateTime dataod, DateTime datado) {
_numerKwartalu = numer;
_koniecKwartalu = datado;
_poczatekKwartalu = dataod;
_rok = dataod.Year;
}
public Kwartal() { }
public int Numer {
get { return _numerKwartalu; }
set { _numerKwartalu = value; }
}
public DateTime DataPoczatkowa {
get { return _poczatekKwartalu; }
set { _poczatekKwartalu = value; }
}
public DateTime DataKoncowa {
get { return _koniecKwartalu; }
set { _koniecKwartalu = value; }
}
public int Rok {
get { return _rok; }
set { _rok = value; }
}
}
По сути, это определение для Quarter. Обычно я определяю это так:
Kwartal kwartal1 = new Kwartal(1, new DateTime(year, 1, 1), new DateTime(year, 3, 31));
Kwartal kwartal2 = new Kwartal(2, new DateTime(year, 4, 1), new DateTime(year, 6, 30));
Теперь мне было интересно, как я могу выполнить математику для них. Например, у меня есть Quarter1 в 2011 году, а затем у меня есть Quarter3 в 2012 году. Я хотел бы узнать, сколько кварталов находится между Quarter1 и
Квартал 3.
Нравится kwartal2 - kwartal1 = 5
Комментарии:
1. Один совет для будущих вопросов, пожалуйста, переведите свой код на английский, чтобы нам не пришлось гадать, что это такое.
Ответ №1:
Нигде вы не определяете количество кварталов в году — без того, чтобы для Kwartal
объекта было установлено какое-либо свойство / константа, как вы можете узнать, каким должно быть базовое значение для вашей операции вычитания?
Как только вы установите это базовое значение, операция будет достаточно простой, вы можете создать абсолютное количество кварталов, например
k.QuarterCount = (k1.year * kwartal.base) k1.quarter
тогда у вас есть целое число для вычитания из другого года.
Комментарии:
1. Это всегда 4 квартала в год. Если это 4-й квартал — 1-й квартал, то между ними 3 квартала. Также Kvartal.Numer содержит значение того, какая это четверть — 1, 2, 3 или 4.
2. да, я понимаю, что в году бывает четыре квартала, в этом смысл называть это кварталом … но где вы это закодировали?
3. ну, у меня нигде не установлено 4.
4. Проверьте мои ответы, пожалуйста. Кажется, это делает это просто отлично, но, возможно, я слишком усложняю это?
Ответ №2:
Исходя из вашего ответа, это то, что я бы сделал:
public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
var quartersPerYear = 4;
var yearDifference = kwartal2.Rok - kwartal1.Rok;
var differenceQuarters = (yearDifference * quartersPerYear) (kwartal2.Numer - kwartal1.Numer);
return differenceQuarters;
}
Я думаю, это дало бы вам следующие ответы:
(Год1, Квартал1) — (Год2, Квартал2) = Разница
(2012, 2) — (2011, 1) = (2011 — 2012)*4 (1 — 2) = -4 (-1) = -5 => (2011, 1) осталось 5 кварталов до (2012, 2)
(2014, 1) — (2018,3) = (2018 — 2014)*4 (3 — 1) = 16 2 = 18 => (2018,3) прошло 18 месяцев после (2014,1)
Ответ №3:
Вы можете использовать класс DateDiff библиотеки периодов времени для .NET, соблюдая культуру календаря:
// ----------------------------------------------------------------------
public void DateDiffSample()
{
DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
Console.WriteLine( "Date1: {0}", date1 );
// > Date1: 08.11.2009 07:13:59
DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
Console.WriteLine( "Date2: {0}", date2 );
// > Date2: 20.03.2011 19:55:28
DateDiff dateDiff = new DateDiff( date1, date2 );
Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
// > DateDiff.Quarters: 5
} // DateDiffSample
Ответ №4:
Во-первых, вы должны определить, каким должен быть результат вычисления. Создайте матрицу / таблицу с некоторыми данными и множеством крайних случаев и вычислите вручную, каким должен быть результат.
Затем вы могли бы разработать алгоритм, который будет использоваться для его вычисления. И в основном реализовать этот алгоритм. И протестируйте на своих данных, которые вы создали.
О, и тогда вы начинаете думать о часовых поясах, переходе на летнее время и т.д. И вам следует прочитать эту запись в блоге Джона Скита.
Комментарии:
1. Часовые пояса и переход на летнее время — не моя забота. Это только одна страна, и это не должно влиять на кварталы, которые кажутся статичными.
2. Я просто использовал ваш вопрос для ссылки на блог Джона Скитса (всегда полезно для быстрой репутации ;-)). Но вы правы, игнорируйте мой пост, пока не захотите разницу в кварталах между двумя датами.
Ответ №5:
Я не уверен, что это то, чего вы хотите достичь
DateTime quarter1 = new DateTime(2010, 3, 31); //end date of Q1 as you capture DataKoncowa
DateTime quarter2 = new DateTime(2011, 3, 31);//end date of Q2 as you capture DataKoncowa
TimeSpan ts = quarter2 - quarter1; //kwartal2.DataKoncowa - kwartal1.DataKoncowa
int actualQuarters = ts.Days / (30 *3); //assuming quarter is 90 days
Это возвращает 4 .. что-то вроде того, что вы ожидаете
Ответ №6:
Если перевести год / кварталы в десятичное число и немного посчитать, то можно вычислить разницу.
class DateTimeQuarter
{
public DateTimeQuarter(DateTime date)
{
Date = date;
Quarter = date.Month / 4 1;
}
public static int operator -(DateTimeQuarter lhs, DateTimeQuarter rhs)
{
double value = Convert.ToDouble(
(rhs.Date.Year - lhs.Date.Year)) (rhs.Quarter / 10.0) - (rhs.Quarter / 10.0);
int result =
(Convert.ToInt32(value) * 4) Convert.ToInt32(value - Math.Floor(value));
return resu<
}
public DateTime Date { get; set; }
public int Quarter { get; set; }
}
static void Main(string[] args)
{
DateTimeQuarter q1 = new DateTimeQuarter(new DateTime(2006, 04, 20));
DateTimeQuarter q2 = new DateTimeQuarter(new DateTime(2007, 12, 25));
int quarters = q1 - q2;
}
Ответ №7:
Вот как я закончил это делать. Кажется, работает нормально. Если у вас есть способ получше, дайте мне знать 🙂
public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
int quartersPerYear = 4;
int differenceQuarters;
int yearDifference = kwartal2.Rok - kwartal1.Rok;
if (yearDifference == 0) {
differenceQuarters = kwartal2.Numer - kwartal1.Numer;
return differenceQuarters;
} else if (yearDifference > 0) {
differenceQuarters = (yearDifference * quartersPerYear) (kwartal2.Numer - kwartal1.Numer);
return differenceQuarters;
} else if (yearDifference < 0) {
return -1;
}
return -1;
}
Комментарии:
1. Почему вы возвращаете значение -1? Отрицательная разница все равно остается разницей.
2. Я бы отбросил это как бесполезное, если -1 и не обрабатывал дальше, но ваше решение, похоже, в целом лучше.
3. Один совет на будущее — реализовать то, что, по словам функции, она делает. Возврат -1 не реализует разницу, вот почему я отреагировал на это. Если бы это была функция сравнения, имело бы смысл возвращать 1, 0 и -1, но вам нужна разница, а разница может быть отрицательной.