Autore Topic: Calcolare l'ora legale orientale (EDT)  (Letto 414 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Calcolare l'ora legale orientale (EDT)
« il: 19 Dicembre 2014, 18:45:04 »
Vi riporto questa comunicazione di Minisini:


Hi,

Here is a little X-Mas gift, a function to compute Eastern Day:

Codice: gambas [Seleziona]
Public Sub Eastern(Year As Integer) As Date

   Dim A, B, C, D, E, F, G As Integer

   A = Year Mod 19 + 1
   B = Year Div 100 + 1
   C = (3 * B) Div 4 - 12
   D = (8 * B + 5) Div 25 - 5
   E = (Year * 5) Div 4 - 10 - C
   F = ((11 * A + 20 + D - C) Mod 30 + 30) Mod 30
   If F = 24 Or (F = 25 And A > 11) Then Inc F
   G = 44 - F
   If G < 21 Then G = G + 30
   Return DateAdd(Date(Year, 3, 1), gb.Day, G + 7 - (E + G) Mod 7 - 1)

End

I will put it in the 'gb.util' component.

Regards,

--
Benoît Minisini
« 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
Re: Calcolare l'ora legale orientale (EDT)
« Risposta #1 il: 19 Dicembre 2014, 20:29:04 »
Benoit Minisini si conferma un burlone altro che caratteraccio!
Per natale ci offre l'algoritmo pasquale sotto mentite spoglie e con qualche refuso:

Codice: gambas [Seleziona]
Public Sub Form_Open()

  Dim i As Date
  Dim s As String
  
  i = Easter(2015)
  s = Format$(i, "dd mmmm")
  Print s
End

Public Sub Easter(iYear As Integer) As Date

   Dim A, B, C, D, E, F, G As Integer

   A = iYear Mod 19 + 1
   B = iYear Div 100 + 1
   C = (3 * B) Div 4 - 12
   D = (8 * B + 5) Div 25 - 5
   E = (iYear * 5) Div 4 - 10 - C
   F = ((11 * A + 20 + D - C) Mod 30 + 30) Mod 30
   If F = 24 Or (F = 25 And A > 11) Then Inc F
   G = 44 - F
   If G < 21 Then G = G + 30
   Return DateAdd(Date(iYear, 3, 1), gb.Day, G + 7 - (E + G) Mod 7 - 1)

End


Stavo giusto studiandomi questo codice VB per portarlo in Gambas:

Pasqua:
Codice: vb.net [Seleziona]
Sub Command1_Click()
Dim strAnno As String
Dim Pasqua As Date
'Richiede l'anno di cui si vuole conoscere la data di Pasqua.
strAnno = InputBox$("Anno di cui si vuole conoscere la data di Pasqua:",,Trim(Str(Year(Now))))
'Determina il giorno di Pasqua.
If strAnno <> "" Then
Pasqua = PasquaGregoriana(Val(strAnno))
MsgBox "Giorno di Pasqua dell'anno " & strAnno & ": " & Pasqua & ".", vbInformation
End If
End Sub


Function PasquaGregoriana(Anno As Integer) As Date
Dim Mese As Integer, Giorno As Integer
Dim A, B, C, D, E, F, G, H, I, K, L, M, N As Integer
If Anno < 1900 Then
MsgBox "Impossibile determinare il corretto giorno di Pasqua per anni precedenti al 1900.", vbExclamation
Exit Function
End If
A = Anno Mod 19
B = Anno \ 100
C = Anno Mod 100
D = B \ 4
E = B Mod 4
F = (B + 8) \ 25
G = (B - F + 1) \ 3
H = (19 * A + B - D - G + 15) Mod 30
I = C \ 4
K = C Mod 4
L = (32 + E + E + I + I - H - K) Mod 7
M = (A + 11 * H + 22 * L) \ 451
N = (H + L - 7 * M + 114)
Mese = N \ 31
Giorno = (N Mod 31) + 1
PasquaGregoriana = DateSerial(Anno, Mese, Giorno)
End Function


Una fatica in meno

 :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
Re: Calcolare l'ora legale orientale (EDT)
« Risposta #2 il: 20 Dicembre 2014, 14:52:15 »
Solo per chiarire che l'algoritmo (in VB) su cui stavo lavorando è decisamente meno valido di quello di Benoit Minisini infatti quest'ultimo sembrerebbe funzionare per tutte le date senza limiti.

 :ciao:

Ps avevo scritto logaritmo invece di algoritmo scusate il refuso dovuto al fatto che son fuso.
« Ultima modifica: 20 Dicembre 2014, 22:34:34 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro