Рефакторинг подпрограмму, которая делит диапазон на четвертинки.


Подпрограмма ниже, GetDetailsQuarterly, принимает две даты. Затем он выписывает каждого квартала, который попадает в диапазон дат. Это также дает первый и последний день квартала. Мне очень не нравится, как даты начала и окончания каждого квартала жестко. Я не верю, что это решение приходится на високосный год, а также. Может кто-нибудь мне точку в правильном направлении, чтобы рефакторинг это? Спасибо заранее.

GetDetailQuarterly:

    Public Sub GetDetailsQuarterly(ByVal beginDate As Date, ByVal endDate As Date)

Console.WriteLine("{0}>>> date range is {1} - {2} {3}", Environment.NewLine, beginDate, endDate, Environment.NewLine)

Dim incrementingStartDate As Date = beginDate
Dim fy As New FiscalYear()

While incrementingStartDate <= endDate

    fy.qOneBegin = "1/1/" & incrementingStartDate.Year
    fy.qOneEnd = "3/31/" & incrementingStartDate.Year
    fy.qTwoBegin = "4/1/" & incrementingStartDate.Year
    fy.qTwoEnd = "6/30/" & incrementingStartDate.Year
    fy.qThreeBegin = "7/1/" & incrementingStartDate.Year
    fy.qThreeEnd = "9/30/" & incrementingStartDate.Year
    fy.qFourBegin = "10/1/" & incrementingStartDate.Year
    fy.qFourEnd = "12/31/" & incrementingStartDate.Year

    Select Case incrementingStartDate
        Case fy.qOneBegin To fy.qOneEnd
            fy.CurrentQuarter = 1
        Case fy.qTwoBegin To fy.qTwoEnd
            fy.CurrentQuarter = 2
        Case fy.qThreeBegin To fy.qThreeEnd
            fy.CurrentQuarter = 3
        Case fy.qFourBegin To fy.qFourEnd
            fy.CurrentQuarter = 4
        Case Else
            Console.WriteLine("out of range")
    End Select

    Console.WriteLine("your q{0}", fy.CurrentQuarter)
    fy.getCurrentQuarterRange()

    incrementingStartDate = incrementingStartDate.AddMonths(3)

End While
  End Sub

Класс FiscalYear:

    Public Class FiscalYear

Public Property qOneBegin() As Date

Public Property qOneEnd() As Date

Public Property qTwoBegin() As Date

Public Property qTwoEnd() As Date

Public Property qThreeBegin() As Date

Public Property qThreeEnd() As Date

Public Property qFourBegin() As Date

Public Property qFourEnd() As Date

Public Property CurrentQuarter As Integer

Public Sub getCurrentQuarterRange()
    Select Case CurrentQuarter
        Case 1
            Console.WriteLine("s: {0}, e: {1}", qOneBegin, qOneEnd)
        Case 2
            Console.WriteLine("s: {0}, e: {1}", qTwoBegin, qTwoEnd)
        Case 3
            Console.WriteLine("s: {0}, e: {1}", qThreeBegin, qThreeEnd)
        Case 4
            Console.WriteLine("s: {0}, e: {1}", qFourBegin, qFourEnd)
        Case Else
            Console.WriteLine("out of range")
    End Select
End Sub
 End Class


Комментарии
1 ответ

Я немного потерял в плане того, что вы на самом деле пытаетесь достичь, но я могу дать несколько советов.

Во-первых, високосный год не особо четверти влияет, если у вас действительно есть некоторые уникальные правила. Под нормальным поведением, 29 февраля будет в том же квартале, как и 28 февраля, и будет прочно попадают внутрь квартала 1 в вашем конкретном случае.

Во-вторых, быстрый способ выяснить четверти на заданную дату (если четверть система начинается с 1 января) по следующей формуле

Dim currentQuarter as Integer = currentDateTime.Month \ 3 + 1

Аналогичным образом, вы можете выполнять операции, чтобы прибыть в квартал, даты начала и окончания.

Dim quarterStart = new DateTime(currentDateTime.Year, 3 * (currentQuarter - 1) + 1, 1)
Dim quarterEnd = quarterStart.AddMonths(3).AddSeconds(-1)

Например, сегодня в качестве базового, можно проверить код

Dim currentDateTime = DateTime.Now

Dim currentQuarter = currentDateTime.Month \ 3 + 1
Dim quarterStart = new DateTime(currentDateTime.Year, 3 * (currentQuarter - 1) + 1, 1)
Dim quarterEnd = quarterStart.AddMonths(3).AddSeconds(-1)

Console.WriteLine(currentQuarter)
Console.WriteLine(quarterStart)
Console.WriteLine(quarterEnd)

И увидеть эти результаты

2
4/1/2011 12:00:00 AM
6/30/2011 11:59:59 PM

4
ответ дан 4 мая 2011 в 09:05 Источник Поделиться