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:
Forse dovresti chiedere questo nel forum di discussione del tuo articolo poiché questo non è un componente predefinito ma uno sviluppo di terze parti. – equisde
Sto provando ma è un vecchio articolo. Da quello che ho capito, quello che non va è il "formato della data".Forse non è un 8601 – user2839159
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