Autore Topic: Il numero di una settimana nell'anno e i giorni che appartengono a una settimana  (Letto 778 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.719
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 02 Ottobre 2020, 00:05:11 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Leggendo questo post mi era venuto in mente questo semplice codice ma stranamente a me funziona solo fino al 12 di ogni mese, e oltre no  :rolleyes:
Codice: [Seleziona]
Public Sub DateChooser1_Change()

  Dim d As Date, s As Integer, valore As String
 
  d = Date(DateChooser1.Value)
  valore = CString(d)
  s = Week(d)
  TextBox1.Text = s & " - " & CString(Val(valore))

End
:mad:  :mad:  :mad:

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Bisogna proprio che non legga più lo spagnolo.
Io non ho mai usato il DateChooser ma incuriosito dalla domanda che mi pareva banale ho provato a scriverne il risultato così:
Print DateChooser1.Value ottenendo 11/12/2015 00:00:00 come risultato.
Ho dato per scontato che bisognasse ottenere la sola data e da li il codice postato e il qui pro quo che ha coinvolto anche la ML e lo stesso Benoit Minisini & Co.
Mi sarebbe bastato provare il codice in una TextBox e avrei visto che il DateChooser restituiva la sola data già localizzata.
Pertanto se vogliamo visualizzare in una textbox il numero della settimana e la data localizzata basta fare:

Codice: [Seleziona]
TextBox1.Text = Week(DateChooser1.Value) & " - " & DateChooser1.Value
Lo so se mi dicono furbo mi stanno prendendo in giro...
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.719
  • Ne mors quidem nos iunget
    • Mostra profilo
Conoscere il numero di una settimana (ossia se è la 1a oppure la 2a, etc) nell'arco dell'anno prescelto, è semplice; più complesso è individuare i giorni che appartengono ad una settimana individuata con il suo numero... per esempio quali giorni appartengono alla 20a settimana del 2015 ?
« Ultima modifica: 14 Dicembre 2015, 11:09:51 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Conoscere il numero di una settimana (ossia se è la 1a oppure la 2a, etc) nell'arco dell'anno prescelto, è semplice; più complesso è individuare i gorni che appartengono ad una settimana individuata con il suo numero... per esempio quali giorni appartengono alla 20a settimana del 2015 ?

Intendi qualcosa del genere?
Codice: [Seleziona]
Public Sub Form_Open()

  SpinBox2.Value = Year(Now)

End

Public Sub Button1_Click()
 
  Dim i, iSettimana, primo, ultimo, anno As Integer
  Dim primoGiornoAnno, sd1, sd2 As String
  Dim d, d1, d2 As Date
 
  iSettimana = SpinBox1.Value
  anno = SpinBox2.Value
  primoGiornoAnno = "1/1/" & anno 
  d = CDate(primoGiornoAnno)
  i = WeekDay(d)   
  If i >= 0 And i <= 4 Then
    ultimo = (iSettimana * 7) - i + 1
  Else If i = 5
    ultimo = (iSettimana * 7) + 3
  Else If i = 6
    ultimo = (iSettimana * 7) + 2
  Endif 
  primo = ultimo - 6     
  d1 = d + (primo - 1)
  d2 = d + (ultimo - 1)
  sd1 = Format$(d1, "dddd dd/mm/yyyy")
  sd2 = Format$(d2, "dddd dd/mm/yyyy")
  If iSettimana = 53 Then
    If Day(d1) > 28 Then
      Label1.Text = "La settimana n. 53 non esiste da " & sd1 & " a\n" & sd2 & " è la prima dell'anno nuovo"
    Else If Day(d1) > 0 And Day(d1) < 7 Then
      Label1.Text = "La settimana n. 53 non esiste da " & sd1 & " a\n" & sd2 & " è la prima dell'anno nuovo"
    Else
      Label1.Text = "La settimana n. " & iSettimana & " va da " & sd1 & " a " & sd2
    Endif
  Else
    Label1.Text = "La settimana n. " & iSettimana & " va da " & sd1 & " a " & sd2
  Endif
 
End
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.719
  • Ne mors quidem nos iunget
    • Mostra profilo
La sostanza è quella.
« Ultima modifica: 14 Dicembre 2015, 12:05:50 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
La sostanza è quella, però il tuo codice riporta i 7 giorni della prima settimana dell'anno corrente (2015) quelli che cominciano con il 1° gennaio. Invece nel 2015 la prima settimana, dovendosi calcolare ad iniziare con il 1° lunedì dell'anno, ha inizio il 5 gennaio.
Devi calibrare questa circostanza.

Non capisco io mi sono attenuto alla regola: La prima settimana dell'anno si calcola fino a 4 (Giovedì) poi si salta a quella dopo.  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.719
  • Ne mors quidem nos iunget
    • Mostra profilo
Sì, hai ragione tu.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Ciao Gianluigi,
ho utilizzato il codice che hai postato in questa discussione per un mio progetto, funziona tutto regolarmente.
Quello che ti chiedo e se puoi spiegarmi questa parte di codice per capire la logica che hai utilizzato.
Ti ringrazio anticipatamente.

Codice: [Seleziona]
  If i >= 0 And i <= 4 Then
    ultimo = (iSettimana * 7) - i + 1
  Else If i = 5
    ultimo = (iSettimana * 7) + 3
  Else If i = 6
    ultimo = (iSettimana * 7) + 2
  Endif 
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Ciao Gianluigi,
ho utilizzato il codice che hai postato in questa discussione per un mio progetto, funziona tutto regolarmente.
Quello che ti chiedo e se puoi spiegarmi questa parte di codice per capire la logica che hai utilizzato.
Ti ringrazio anticipatamente.

Codice: [Seleziona]
  If i >= 0 And i <= 4 Then
    ultimo = (iSettimana * 7) - i + 1
  Else If i = 5
    ultimo = (iSettimana * 7) + 3
  Else If i = 6
    ultimo = (iSettimana * 7) + 2
  Endif 

Ciao Tornu,
per prima cosa ti devo sgridare, ti sembra questa l'ora di porre una domanda a un vecchietto che deve andare a riposare?  >:(

Poi ti dico; alla buon'ora avevo introdotto uno scherzo (aggiunto prima e tolto dopo) per Vuott ma non solo, per cazzeggiare un po ma anche per vedere se in realtà le persone guardano al codice che uno scrive ed eventualmente lo correggono.
Complimenti vedo che sei il primo ad accorgersene.  :D  :ok:
Meno male che mi sono ricordato, ti allego il progetto originale di allora, sperando che sia quello giusto e che funzioni.
Temo di aver introdotto cose simili in altri codici postati, ma solo per un breve periodo e comunque cose innocue tipo questa  ;D  :P  :-[
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
.....
Meno male che mi sono ricordato, ti allego il progetto originale di allora, sperando che sia quello giusto e che funzioni.
.....
Grazie, funziona perfettamente  :ok:
Quello che ti avevo chiesto era se potevi spiegami questo passaggio in particolare
Codice: [Seleziona]
  If i >= 0 And i <= 4 Then
    ultimo = (iSettimana * 7) - i
  Else If i = 5
    ultimo = (iSettimana * 7) + 2
  Else If i = 6
    ultimo = (iSettimana * 7) + 1
  Endif 
« Ultima modifica: 13 Gennaio 2017, 20:47:08 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Quindi neanche tu avevi scoperto lo scherzetto  :'(

Tieni presente l'articolo di Wikipedia indicato a Vuott qualche post sopra nella parte in cui si parla delle settimane di 7 giorni e anni di 52 o 53 settimane.

Ecco il codice commentato:
Codice: [Seleziona]
' Nota: Devi tenere a mente che la settimana è di sette giorni ma '
  ' parte da 0 e arriva a 6 e ho ottenuto con weekday il numero del '
  ' primo giorno dell''anno, secondo questa numerazione domenica 0 lunedì 1 ecc. '
  If i >= 0 And i <= 4 Then
    ' Se il primo di gennaio appartiene all''anno nuovo '
    ' (vale a dire se è fra domenica e giovedì) a ultimo '
    ' assegno il numero dei giorni a partire dal primo gennaio. '
    ultimo = (iSettimana * 7) - i
  Else If i = 5
    ' Altrimenti se il primo gennaio è nell''ultima settimana '
    ' dell''anno prima, ottengo i giorni aggiungendo 2 o 1 '
    ' secondo che sia venerdì o sabato, domenica niente '
    ' perchè occorre come detto valutare che si inizia da 0. '
    ultimo = (iSettimana * 7) + 2
  Else If i = 6
    ultimo = (iSettimana * 7) + 1
  Endif

Ti è sufficiente?  :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Ciao Tornu,
mentre davo un'occhiata al programma mi sono accorto di un bug che credo sia di Gambas (Trunk) anzi se non hai la trunk potresti fare una prova col codice postato più avanti e riferirmi.
Ne approfitto anche per meglio chiarire il codice che avevo scritto.

Prendiamo in considerazione l'immagine allegata che rappresenta due settimane contenenti l’inizio dell’anno, una (l’arancione) che ha il primo gennaio che cade di mercoledì, l’altra col primo di venerdì.
La settimana arancione è la prima settimana dell’anno e pertanto conterrà 3 giorni che appartengono all’anno precedente. Se io la devo conteggiare per calcolare il numero dei giorni fino ad una data settimana dell’anno, dovrò sottrarre 3.

Di contro se il primo dell’anno cade di venerdì come nel caso della settimana bianca allora sarà l’ultima settimana dell’anno precedente a contenere 2 giorni che appartengono all’anno nuovo e che andranno sommati nel calcolo dei giorni.

Così come avevo concepito il progetto; quando indico il numero delle settimane, per esempio la ventesima, per ottenere l’ultimo giorno della settimana indicata non basta moltiplicare 20 settimane per 7 giorni occorre anche aggiungere o sottrarre come spiegato prima.

Malgrado le tante informazioni ottenute sulle date continuo a non capirci molto, ma credo proprio che questo sia un bug (l’ho segnalato):

Codice: [Seleziona]
Public Sub Main()

  Print CDate("1/1/2017"); Date(2017, 1, 1) ' > 31/12/2016 23:00:0001/01/2017 00:00:00
 

End

Quindi per non sapere ne leggere ne scrivere ti consiglio di usare questo progetto allegato che usa Date al posto di CDate.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
.....
Poi ti dico; alla buon'ora avevo introdotto uno scherzo (aggiunto prima e tolto dopo) per Vuott ma non solo, per cazzeggiare un po ma anche per vedere se in realtà le persone guardano al codice che uno scrive ed eventualmente lo correggono.
.....
Quindi neanche tu avevi scoperto lo scherzetto  :'(

Prima lo metti poi lo togli, e mi chiedi se ho scoperto lo scherzetto... ???
A parte gli scherzetti intanto ti ringrazio per avermi commentato il codice.
Non ho capito a quale bug ti riferisci, sia la versione con CDate che quella con Date a me funzionano
correttamente. La versione che uso è la 3.9.2 Stable da repository.
Non capisco le tue perplessità (ho io non ti ho capito), ma dalle varie prove che ho fatto con date di fine e inizio di vari
anni, con 52 o 53 settimane, i giorni della settimana e il numero della settimana che risultano per me sono corretti visto
che gli ho confrontati con calendari vari, sia cartacei per quelli antecedenti al 2017 che con quello del mio pc per quelli
successivi.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo

Non capisco le tue perplessità...

Leggi un po qua.
Ti conviene usare Date se vuoi che funzioni anche in futuro, perché CDate è stato cambiato.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro