ASP.net dateADD помощь - PullRequest
       4

ASP.net dateADD помощь

0 голосов
/ 06 октября 2010

Привет всем, у меня есть следующий код, чтобы заполнить выпадающий список для сравнения с 2008-2010 годом компании. Это вывод:

 2008 Period 1: 11/30/2008 - 12/27/2008
 2008 Period 2: 12/28/2008 - 1/24/2009
 2009 Period 3: 1/25/2009 - 2/21/2009
 2009 Period 4: 2/22/2009 - 3/21/2009
 2009 Period 5: 3/22/2009 - 4/18/2009
 2009 Period 6: 4/19/2009 - 5/16/2009
 2009 Period 7: 5/17/2009 - 6/13/2009
 2009 Period 8: 6/14/2009 - 7/11/2009
 2009 Period 9: 7/12/2009 - 8/8/2009
 2009 Period 10: 8/9/2009 - 9/5/2009
 2009 Period 11: 9/6/2009 - 10/3/2009
 2009 Period 12: 10/4/2009 - 10/31/2009
 2009 Period 13: 11/1/2009 - 11/28/2009
 2009 Period 1: 11/29/2009 - 12/26/2009
 2009 Period 2: 12/27/2009 - 1/23/2010
 2010 Period 3: 1/24/2010 - 2/20/2010
 2010 Period 4: 2/21/2010 - 3/20/2010
 2010 Period 5: 3/21/2010 - 4/17/2010
 2010 Period 6: 4/18/2010 - 5/15/2010
 2010 Period 7: 5/16/2010 - 6/12/2010
 2010 Period 8: 6/13/2010 - 7/10/2010
 2010 Period 9: 7/11/2010 - 8/7/2010
 2010 Period 10: 8/8/2010 - 9/4/2010
 2010 Period 11: 9/5/2010 - 10/2/2010

и вот код для этого:

    Dim dt2009Start As DateTime
    Dim dtTempStart, dtTempEnd As DateTime
    Dim dtTempNow As DateTime
    Dim nTemp As Integer
    Dim itemPeriod As ListItem
    Dim timesAround As Integer

    dt2009Start = Convert.ToDateTime("11/30/2008")
    dtTempStart = dt2009Start
    dtTempEnd = dtTempStart.AddDays(27)

    ddlInvoicePeriods.Items.Clear()

    dtTempNow = DateTime.Now()
    nTemp = 1
    timesAround = 0

    While (dtTempNow > dtTempEnd)
        If nTemp = 12 Then
            If timesAround = 0 Then
                'dtTempStart = Convert.ToDateTime("10/25/2009")
                'dtTempEnd = Convert.ToDateTime("11/18/2009")
            End If
        ElseIf nTemp = 14 Then
            If timesAround = 0 Then
                dtTempStart = Convert.ToDateTime("11/29/2009")
                dtTempEnd = Convert.ToDateTime("12/26/2009")
                nTemp = 1
                timesAround += 1
            End If
        End If

        itemPeriod = New ListItem()
        itemPeriod.Text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()
        itemPeriod.Value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString()
        ddlInvoicePeriods.Items.Add(itemPeriod)
        itemPeriod = Nothing

        Debug.Print(dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString())

        dtTempStart = dtTempEnd.AddDays(1)
        dtTempEnd = dtTempStart.AddDays(27)
        nTemp += 1
    End While

    If nTemp = 12 Then
        dtTempStart = Convert.ToDateTime("12/27/2009")
        dtTempEnd = Convert.ToDateTime("11/18/2009")
    ElseIf nTemp = 13 Then
        dtTempStart = Convert.ToDateTime("11/19/2009")
        dtTempEnd = Convert.ToDateTime("12/16/2009")
    End If

    itemPeriod = New ListItem
    itemPeriod.Text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()
    itemPeriod.Value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString()
    ddlInvoicePeriods.Items.Add(itemPeriod)
    itemPeriod = Nothing

Как вы, возможно, заметили, выходные данные идут только к 2010 году (10/2/2010), который должен пройти вплоть до 12/31/2011.

Проблема:

Это должно начаться так:

2008 Period 13: Nov 30 - Dec 27
2009 Period  1: Dec 28 - Jan 24
2009 Period  2: Jan 25 - Feb 21
2009 Period  3: Feb 22 - Mar 21
...
2009 Period 13: Nov 29 - Dec 26
2010 Period  1: Dec 27 - Jan 23
2010 Period  2: Jan 24 - Feb 20
..
2010 Period 13: Nov 28 - Dec 25
2011 Period  1: Dec 26 - Jan 22
2011 Period  2: Jan 23 - Feb 19
...etc

Любая помощь будет потрясающей, поскольку я пытаюсь понять, что я делаю неправильно! : О)

David

Ответы [ 3 ]

2 голосов
/ 06 октября 2010

Я бы многое изменил (включая использование класса Iain для представления периода) и признание того, что nTemp должен начинаться с 13 для этого примера, и список останавливается, потому что циклу было приказано прерваться в DateTime.Now длябез видимой причины, даже если вы сказали, что он должен продолжать работать до конца 2011 года. Но вот как заставить код, который вы опубликовали, работать:

Dim dt2009Start As DateTime
    Dim dtTempStart, dtTempEnd As DateTime
    Dim dtTempNow As DateTime
    Dim nTemp As Integer
    Dim itemPeriod As ListItem
    Dim timesAround As Integer
    Dim dtReallyEnd As DateTime
    Dim year As Integer

    year = 2008
    dt2009Start = Convert.ToDateTime("11/30/2008")
    dtTempStart = dt2009Start
    dtTempEnd = dtTempStart.AddDays(27)
    dtReallyEnd = Convert.ToDateTime("12/31/2011")


    dtTempNow = DateTime.Now()
    nTemp = 13
    timesAround = 0

    While (dtReallyEnd > dtTempEnd)
       If nTemp = 14 Then
           nTemp = 1
            timesAround += 1
            year += 1
        End If


        itemPeriod = New ListItem()
        itemPeriod.text = year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()
        itemPeriod.value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString()
        ddlInvoicePeriods.Items.Add(itemPeriod)
        itemPeriod = Nothing

        Debug.Print(dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString())

        dtTempStart = dtTempEnd.AddDays(1)
        dtTempEnd = dtTempStart.AddDays(27)
        nTemp += 1
    End While

    If nTemp = 14 Then
        nTemp = 1
        timesAround += 1
        year += 1
    End If

    itemPeriod = New ListItem
    itemPeriod.text = dtTempStart.Date.Year.ToString() & " Period " & nTemp.ToString() & ": " & dtTempStart.Date.ToShortDateString() & " - " & dtTempEnd.Date.ToShortDateString()
    itemPeriod.value = dtTempStart.Date.ToShortDateString() & "-" & dtTempEnd.Date.ToShortDateString()
    ddlInvoicePeriods.Items.Add(itemPeriod)
    itemPeriod = Nothing

Я бы, вероятно, сделал дату окончания более динамичной (так что вам не нужно менять код в будущем, когда вы хотите, чтобы отображалось больше периодов), и дата начала также может быть динамичной (чтобы сохранить список на управляемой длине).

1 голос
/ 06 октября 2010

Я бы создал объект для хранения ваших данных, аналогично этому

Public Class Period
    Public Property Period As Integer
    Public Property StartOfPeriod As Date
    Public Property EndOfPeriod As Date
End Class

Затем для каждой итерации цикла While я бы вводил значения как list(of Period), как только ваш код обработал,запрос linq для сортировки данных использует Period и Date, а затем привязывает список к выпадающему.

Надеюсь, это поможет

1 голос
/ 06 октября 2010

Как вы могли заметить, вывод идет только в 2010 (02.10.2010), который должен пройти весь путь до 12/31/2011.

Останавливается, когда dtTempNow > dtTempEnd больше не имеет значение True. Кроме того, вам может быть интересно в String.Format

Это должно начаться так:

2008 Период 13: 30 ноября - 27 декабря

Почему? Вы устанавливаете nTemp на 1 в начале, почему он должен начинаться с 13?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...