2015-11-03 14 views
5

Ho un problema con il mio programma di selezione datetime con estensione vbnet. Quando l'elemento passa al nuovo anno (2016), il numero della settimana visualizzato a sinistra è errato.VB.NET DatetimePicker - Numero della settimana errato

Wrong week number

ho un "datetimepicker", che non è il componente di default, è stato scaricato qui: http://www.codeproject.com/Articles/17063/ExtendedDateTimePicker-control-with-week-numbers

Non capisco il motivo per cui il passaggio del calendario 53-2 e non da 53 a 1.

Forse uno di voi ha lo stesso errore. Grazie per il tuo tempo.

+1

Forse dovresti chiedere questo nel forum di discussione del tuo articolo poiché questo non è un componente predefinito ma uno sviluppo di terze parti. – equisde

+0

Sto provando ma è un vecchio articolo. Da quello che ho capito, quello che non va è il "formato della data".Forse non è un 8601 – user2839159

+1

Il calendario di NET non è ISO8601, ma ci sono alcune opzioni di calendario per ottenere qualcosa di simile (e solo 1-2 linee di codice da convertire o emulare). Il codice non sta calcolando il WOY, basta unisng un PInvoke per ottenere NET per farlo. Se ricordo, la prima settimana dell'anno è quella che contiene un giovedì. Dal 1 °/1/2016 è un giovedì, penso che se ti sposassi al prossimo mese mostrerà Jan 1-2-3 come la prima settimana del 2016. – Plutonix

risposta

3

I don't understand why the calendar pass from 53 to 2 and not 53 to 1

E 'più o meno funziona come previsto. Il modo in cui conta le settimane, quei primi 3 giorni del 2016 contano come la prima settimana del 2016.

Si noti che il controllo non fa nulla calendario o visualizzazione correlati. Si tratta semplicemente di cambiare il display in stile della finestra del calendario fornita da Windows. Il codice visto nella pagina di CP è tutto ciò che c'è e, soprattutto, pone solo uno stile bandiera per dire di Windows per aggiungere i numeri di settimana:

style = style | MCS_WEEKNUMBERS; 

La voce MSDN per esso indica:

Settimana 1 è definita come la prima settimana che contiene almeno quattro giorni.

Dal 1 ° gennaio non è 4 giorni, sembrerebbe che vi sia un errore, un calendario diverso in uso o MSDN non è aggiornato.


Dai commenti:

From what i understood, what's wrong is "date format". Maybe it's not a 8601

No, è più di questo: ISO8601 è un diverso calendarioquale né di Windows né attrezzi NET. Wikipedia note:

La prima settimana di un anno è la settimana che contiene il primo giovedì dell'anno (e, quindi, contiene sempre il 4 gennaio). La numerazione ISO anno della settimana quindi devia leggermente dal gregoriano per alcuni giorni vicino al 1 ° gennaio.

Questo è ciò che vedi nel calendario a tendina.

alternativa

ma la settimana ISO8601 dell'anno è facile da calcolare:

Inizia con il codice per GetISOWeekOfYear() da my answer to a very similar question. È possibile utilizzarlo per visualizzare la settimana ISO8601 dell'anno per la data selezionata in un'etichetta o qualcosa di simile al DTP.

stampare la prima e l'ultimo numero della settimana per il 2011 al 2021:

Dim cal As Calendar = CultureInfo.CurrentCulture.DateTimeFormat.Calendar 
For n As Int32 = 2011 To 2017  '2021 
    dt = New DateTime(n, 12, 21) 
    Console.WriteLine(" ***** {0} *****", n) 
    For j = 0 To 3 
     Dim NetWk = cal.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, firstD) 
     Console.WriteLine("Invariant Date: {0} ISO #:{1:00} NET #:{2:00}", 
          dt.ToString("MM/dd/yyyy"), GetISOWeekOfYear(dt), NetWk) 
     dt = dt.AddDays(7) 
    Next 
Next 

Il risultato 2015/2016 porzione:

***** ***** 2015
Data invariante: 21/12/2015 N. ISO: 52 NR .: 52
Invariant Data: 28/12/2015 ISO #: 53 NR. NET: 53
Data invariante: 01/04/2016 N. ISO: 01 NET # : 02
Invariant Date: 01/11/2016 ISO #: 02 NET #: 03
***** 2016 *****
Invariant Date: 12/21/2016 ISO #: 51 NET #: 52 ​​
Data dell'invarianza: 28/12/2016 ISO #: 52 ​​N. NET: 53
Invariant Date: 01/04/2017 ISO #: 01 NET #: Invariant Date: 01/11/2017 ISO #: 02 NET # : 02

a meno che non si è disposti a scrivere il proprio controllo da zero o una licenza che può essere impostato su un calendario diverso (e ha una definizione per ISO8601), che può essere la migliore che si può fare.

La linea di fondo: Il numero della settimana non è errato. Usa un calendario diverso da quello che ti aspetti/vuoi.


Riferimenti:

+0

Dovresti usare il formato data ISO ('aaaa-MM-gg') su SO per evitare confusione regionale. – Enigmativity

1

Il controllo funziona bene.

Quando l'anno cambia negli ultimi giorni dell'anno sono nella settimana 53 - ma non è una settimana intera. Allo stesso modo i primi giorni dell'anno sono nella settimana 1, ma il controllo prende l'impostazione del "primo giorno della settimana" del sistema per determinare quando inizia la settimana 2 - quindi è possibile che la prima settimana dell'anno abbia una qualsiasi dove da 1 a 7 giorni in esso.

Ciò significa che l'immagine che hai mostrato sta mostrando la settimana 53 perché sei a dicembre e la settimana 2 perché la seconda settimana di gennaio inizia il 4 °.

Se si passa a gennaio è visualizzerebbe settimana 1 per la riga a partire dal 28 dicembre

La linea di fondo è che la prima settimana di gennaio ha solo 3 giorni in esso.

Questo è solo il comportamento normale e corretto di questo controllo.

Problemi correlati