Ora legale

venerdì 14 gennaio 2005 - 17.30

lanfra Profilo | Senior Member

Buona sera e buon week-end, visto che siamo a fine giornata...
cmq stò postando per avere suggerimenti, indicazioni per risorvere un problema conosciuto, il passaggio ora SOLARE-LEGALE.
Sapete indicarmi, segnalarmi o postarmi idee, suggerimenti per gestire in automatico questo evento?! Esempio indicarmi siti, libri, API di Win...
Il problema è nato perchè devo gestire dei dati generati su una macchina che non gestisce l'ora legale (solo quella solare), e mi trovo ad immagazzinare su base Oracle questi valori, che però devo mostrare con ora giustà, ovvero con il trattamento solare-legale.

Spero di essere stato chiaro Lanfra

Brainkiller Profilo | Guru

Mah... non saprei che consigliarti. Non mi è mai capitato anche perchè almeno la gestione dell'ora dovrebbe farla il sisteam operativo :)

Potrei consigliarti di costruire una piccola applicazione che i giorni del cambio di ora, provveda lui ad aggiustare l'ora un'ora avanti oppure indietro.

Ma anche semplicemente si può fare uno script e schedularlo i due giorni dell'anno in cui viene cambiata l'ora.

E' questo che ti serve ?
ciao
davdi

lanfra Profilo | Senior Member

Il fatto è proprio quello, il S.O. non gestisce l'ora legale, siccome il PC in questione è un PC d'impianto con installato applicazioni che non richiedono l'ora legale, anzi non farebbe funzionare il DCS (controllo avanzato), mi trovo a gestire il problema...
Anche a fare lo script (che punti devo toccare?) devo sapere i 2 giorni di cambio ora! Questo passo lo devo fare in AUTOMATICO.

Lanfra

Brainkiller Profilo | Guru

Un'altra soluzione più pulita che mi viene in mente è questa.
Se hai una procedura di importazione di dati in Oracle puoi fare così,
Mettere un IF che controlli, se i dati sono stati creati nel periodo di tempo in cui c'è l'ora legale, prendi l'ora e togli un'ora oppure la lasci così e butti i dati nel DB.

Così eviti lo script e lasci gli orari corretti sulle macchine.

ciao
david

lanfra Profilo | Senior Member

Ciao Briankiller,
mi sono creato con l'aiuto di un'amico una funzioncina che mi dice se la data che gli passo è o meno nell'ora legale:

''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function OraLegale(DataFile As String) As Boolean
'inizio ultima domenica di ottobre- ultima domenica di marzo
Dim tmp As String
Dim dteDate As Date
Dim blnFound As Boolean
Dim iMonthIni, iMonthFin As Integer
Dim iday As Integer
Dim OraLegaleIni As String
Dim OraLegaleFin As String
Dim Appoggio As Variant

'inizio ora legale
iMonthIni = 10
If Month(Date) >= 10 And Month(Date) <= 12 Then
Appoggio = Year(Now)
Else
Appoggio = (CInt(Year(Now)) - 1)
End If
dteDate = "10/24/" & Appoggio
'dteDate = "10/24/2002"

Do Until blnFound
If Weekday(dteDate) = vbSunday Then
iday = Day(dteDate)
blnFound = True
Else
dteDate = DateAdd("d", 1, dteDate)
End If
Loop

If iday = 24 Then iday = iday + 7
tmp = DateSerial(Appoggio, 10, iday)
'tmp = DateSerial(2002, 10, iday)

Select Case dwType
Case vbGeneralDate: tmp = Format$(tmp, "general date")
Case vbLongDate: tmp = Format$(tmp, "long date")
Case vbShortDate: tmp = Format$(tmp, "short date")
End Select

OraLegaleIni = tmp

'fine ora legale
blnFound = False
iMonthFin = 3
If Month(Date) >= 1 And Month(Date) <= 3 Then
Appoggio = Year(Now)
Else
Appoggio = (CInt(Year(Now)) + 1)
End If
dteDate = "3/24/" & Appoggio
'dteDate = "3/24/2003"

Do Until blnFound
If Weekday(dteDate) = vbSunday Then
iday = Day(dteDate)
blnFound = True
Else
dteDate = DateAdd("d", 1, dteDate)
End If
Loop

If iday = 24 Then iday = iday + 7
tmp = DateSerial(Appoggio, 3, iday)
'tmp = DateSerial(2003, 3, iday)

Select Case dwType
Case vbGeneralDate: tmp = Format$(tmp, "general date")
Case vbLongDate: tmp = Format$(tmp, "long date")
Case vbShortDate: tmp = Format$(tmp, "short date")
End Select

OraLegaleFin = tmp

OraLegaleIni = OraLegaleIni & " 02:00"
OraLegaleFin = OraLegaleFin & " 02:00"
If CDate(DataFile) >= CDate(OraLegaleIni) And CDate(DataFile) <= CDate(OraLegaleFin) Then OraLegale = True
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''

Se ci pensi bene, basta vedere in che giorno siamo del mese di ottobre e marzo, considerare la domenica, fare il calcolo 31-7 per vedere i possibili giorni della settimana dove cade l'ultimo del mese... il gioco è fatto!

Ti dò la funzione per renderla OpenSource ed migliorarla se si può, per non fare impazzire altra gente che come me deve superare l'ostacolo ora Legale!

Lanfra

Brainkiller Profilo | Guru

Bravo, il tuo lavoro sarà d'aiuto si spera anche per qualcun'altro.

ciao
david

fedeballan Profilo | Newbie

Ho riscritto la precedente routine per Vb6 in modo più flessibile
'-[vb6]--------------------
Public Function getOraSolareInizio(theDateReference As Date) As Date
Dim annoRef As Integer
Dim found As Boolean
Dim iDay As Integer
Dim inizio As Date
Dim auxDate As Date

annoRef = Year(theDateReference)
auxDate = "10/24/" & annoRef '$NOTE: parto dal 24 ottobre

Do Until found
If WeekDay(auxDate) = vbSunday Then
iDay = Day(auxDate)
found = True
Else
auxDate = DateAdd("d", 1, auxDate)
End If
Loop

If iDay = 24 Then
iDay = iDay + 7
End If
getOraSolareInizio = DateSerial(annoRef, 10, iDay) + TimeSerial(3, 0, 0) '$NOTE: comunque c'è indeterminazione fra le ore 2.00 e le 3.00: dipende da quando si è passati li in funzione di Now: in questo caso torno sempre false fra le 2 e le 3
End Function
'---------------------
Public Function getOraLegaleInizio(theDateReference As Date) As Date
Dim annoRef As Integer
Dim found As Boolean
Dim iDay As Integer
Dim inizio As Date
Dim auxDate As Date

annoRef = Year(theDateReference)
auxDate = "3/24/" & annoRef '$NOTE: parto dal 24 ottobre

Do Until found
If WeekDay(auxDate) = vbSunday Then
iDay = Day(auxDate)
found = True
Else
auxDate = DateAdd("d", 1, auxDate)
End If
Loop

If iDay = 24 Then
iDay = iDay + 7
End If
getOraLegaleInizio = DateSerial(annoRef, 3, iDay) + TimeSerial(3, 0, 0)

End Function
'---------------------
Public Function isOraLegale(theDateReference As Date) As Boolean
Dim legaleStart As Date
Dim legaleStop As Date

legaleStart = getOraLegaleInizio(theDateReference)
legaleStop = getOraSolareInizio(theDateReference)

If legaleStart <= theDateReference And theDateReference < legaleStop Then
isOraLegale = True
End If

End Function
--[versione visual.Basic.Net]------------------------------------------------------------------------------------------------

Friend Shared Function getOraSolareInizio(ByVal theDateReference As Date) As Date
Dim annoRef As Integer
Dim found As Boolean
Dim iDay As Integer

annoRef = theDateReference.Year
Dim auxDate As Date = DateTime.ParseExact("24/10/" & annoRef, "dd/MM/yyyy", New System.Globalization.CultureInfo("it-IT", True)) '$NOTE: parto dal 24 ottobre

Do Until found
If auxDate.DayOfWeek = DayOfWeek.Sunday Then
iDay = auxDate.Day
found = True
Else
auxDate = auxDate.AddDays(1)
End If
Loop

If iDay = 24 Then
iDay = iDay + 7
End If

Dim dd As Date = New Date(annoRef, 10, iDay, 3, 0, 0) '$NOTE: comunque c'è indeterminazione fra le ore 2.00 e le 3.00: dipende da quando si è passati li in funzione di Now: in questo caso torno sempre false fra le 2 e le 3
getOraSolareInizio = dd
End Function
Friend Shared Function getOraLegaleInizio(ByVal theDateReference As Date) As Date
Dim annoRef As Integer
Dim found As Boolean
Dim iDay As Integer

annoRef = theDateReference.Year
Dim auxDate As Date = DateTime.ParseExact("24/03/" & annoRef, "dd/MM/yyyy", New System.Globalization.CultureInfo("it-IT", True)) '$NOTE: parto dal 24 ottobre

Do Until found
If auxDate.DayOfWeek = DayOfWeek.Sunday Then
iDay = auxDate.Day
found = True
Else
auxDate = auxDate.AddDays(1)
End If
Loop

If iDay = 24 Then
iDay = iDay + 7
End If
Dim dd As Date = New Date(annoRef, 3, iDay, 3, 0, 0)
getOraLegaleInizio = dd

End Function
Friend Shared Function isOraLegale(ByVal theDateReference As Date) As Boolean
Dim legaleStart As Date
Dim legaleStop As Date

legaleStart = getOraLegaleInizio(theDateReference)
legaleStop = getOraSolareInizio(theDateReference)

If legaleStart <= theDateReference And theDateReference < legaleStop Then
isOraLegale = True
End If

End Function

stramaxxa Profilo | Newbie

Ciao a tutti ... arrivo solo ora in questo thread, ma voglio dare il mio contributo.
I miei siti e il mio db sono su server americani.... e mamma mia il mal di testa con le date.....

Ho creato un semplice (ma a mio avviso utilissima funzione) per calcolare l'ora attuale in Italia.
Come da direttiva europea che dice:

Articolo 2
A decorrere dall'anno 2002 in ciascuno Stato membro il periodo dell'ora legale ha inizio alle ore 1.00 del mattino, ora universale, dell'ultima domenica di marzo.

Articolo 3
A decorrere dall'anno 2002 in ciascuno Stato membro il periodo dell'ora legale termina alle ore 1.00 del mattino, ora universale, dell'ultima domenica di ottobre.

http://preview.tinyurl.com/yur3e6

In vb.net!!

Ecco qua:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Spero sia utile a tutti voi!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5