Italian Giorni dell'anno senza feste

Nikeddy

Active Member
Licensed User
Longtime User
Salve a tutti,

ho realizzato una piccola app, per i miei giorni lavorativi, e vorrei sapere se esiste una funzione per calcolare i giorni utili del mese, che poi utilizzo per dividere quanto guadagno per i giorni utili, cosi da avere quanto guadagno mediamente al giorno.

i giorni che mi interessano sono dal lunedi al sabato, escluso tutti i giorni rossi sul calendario, ed essendo di Roma anche il 29 giugno..

esiste una funzione che li calcola in automatico?

cosi io se guadagno 1000 euro / (giugno 25 giorni) = 40 euro giorno.

grazie!!!
 

LucaMs

Expert
Licensed User
Longtime User
Probabilmente trovi qualcosa sul web, compreso forse un sito che fornisca un servizio con questi dati.

La cosa più complicata è la Pasqua, visto che non cade sempre nello stesso giorno; trovare le domeniche è relativamente facile.

Per me, comunque, il calcolo è facilissimo: guadagno mensile = 0 / 30 = 0.
 

Star-Dust

Expert
Licensed User
Longtime User
Io ho un app più semplice 0€/365giorni= 0€
 

LucaMs

Expert
Licensed User
Longtime User
Credo che manchi il segno di divisione ("/")
Confermo.

Infatti il codice della funzione Pasqua, ad esempio, incollato così com'era dava solo errori (in Excel), mentre così funziona:
B4X:
Public Function Pasqua(ByVal Anno As Integer) As Date
    'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
    'ossia dal 1583 in poi
    
    Dim A%, B%, C%, P%, Q%, R%
    
    A = Anno% Mod 19: B = Anno% / 100: C = Anno% Mod 100
    P = (19 * A + B - (B / 4) - ((B - ((B + 8) / 25) + 1) / 3) + 15) Mod 30
    Q = (32 + 2 * ((B Mod 4) + (C / 4)) - P - (C Mod 4)) Mod 7
    R = (P + Q - 7 * ((A + 11 * P + 22 * Q) / 451) + 114)
    Pasqua = DateSerial(Anno%, R / 32, (R Mod 31) + 1)
    
End Function
 

LucaMs

Expert
Licensed User
Longtime User
Uhm... devo trovare il bug, perché la conversione VBA -> B4A sembra riuscita ma il risultato è imperfetto:
B4X:
Public Sub Pasqua(Anno As Int) As String
    'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
    'ossia dal 1583 in poi
    Dim DataPasqua As String
    Dim A, B, C, P, Q, R As Int

    A = Anno Mod 19
    B = Anno / 100
    C = Anno Mod 100
    P = (19 * A + B - (B / 4) - ((B - ((B + 8) / 25) + 1) / 3) + 15) Mod 30
    Q = (32 + 2 * ((B Mod 4) + (C / 4)) - P - (C Mod 4)) Mod 7
    R = (P + Q - 7 * ((A + 11 * P + 22 * Q) / 451) + 114)
    DataPasqua = DateTime.Date(DateUtils.SetDate(Anno, R / 32, (R Mod 31) + 1))
    Return DataPasqua
End Sub

Per il 2018 restituisce il 30 aprile, mentre è stata il 1°
 

LucaMs

Expert
Licensed User
Longtime User
Quindi, grazie a @udg, la funzione per la Pasqua è ok (usa DateUtils):
B4X:
Public Sub CalcolaPasqua(Anno As Int) As String
    Dim DataPasqua As String

    Dim a, b, c, d, e, m, n As Double
    Dim giorno As Double
    Dim mese As Double

    If (Anno <= 2099) Then
        m = 24
        n = 5
    Else If (Anno <= 2199) Then
        m = 24
        n = 6
    Else If (Anno <= 2299) Then
        m = 25
        n = 0
    Else If (Anno <= 2399) Then
        m = 26
        n = 1
    Else If (Anno <= 2499) Then
        m = 25
        n = 1
    End If

    a = Anno Mod 19
    b = Anno Mod 4
    c = Anno Mod 7
    d = ((19 * a) + m) Mod 30
    e = ((2 * b) + (4 * c) + (6 * d) + n) Mod 7

    If ((d + e) < 10) Then
        giorno = d + e + 22
        mese = 3
    Else
        giorno = d + e - 9
        mese = 4
    End If

    If (giorno = 26 And mese = 4) Then
        giorno = 19
        mese = 4
    End If

    If (giorno = 25 And mese = 4 And d = 28 And e = 6 And a > 10) Then
        giorno = 18
        mese = 4
    End If

    DataPasqua = DateTime.Date(DateUtils.SetDate(Anno, mese, giorno))
    Return DataPasqua

End Sub
 

udg

Expert
Licensed User
Longtime User
Ora che puoi calcolare con precisione Pasqua dell'anno prossimo, prenoti per tutti un agriturismo, un posticino carino per "Pasquetta"?
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…