Newsgroup: it.comp.lang.visual-basic
Titolo: ricavare i 4 byte dell'ora da una variabile date

ciao a tutti.
volevo fare la seguente cosa:
1 var date è di 8 byte; a me servirebbe otterere solo i secondi 4 byte,
quelli dell'ora senza utilizzare il giochetto di considerare la data
come un numero e scartare la parte intera. infatti sarei obbligato ad
utilizzare funzioni come cdbl o cdec.
io volevo ottenere la cosa con, ad esempio, copymemory (funzione API).
peccato vb6 non permetta di fare i giochetti del C....  ;-p
grazie
daniele

 io volevo ottenere la cosa con, ad esempio, copymemory (funzione API).
Esatto.
Usa la copyMemory.
Senza provare, se non mi confondo come al solito con i ByVal :)
Dim MyBytes as long
Call CopyMemory(ByVal MyBytes , ByVal MyDate, 4&)
Ciao

 Call CopyMemory(ByVal MyBytes , ByVal MyDate, 4&)
ho provato la tua dopo 30 min di miei Crash... e la tua ha dato...
Crash.........

 peccato vb6 non permetta di fare i giochetti del C....  ;-p
Beh... la parte nella virgola di un double non é detto che sia di 4 byte...
:)
Dipende dall'offset e comunque anche se fossero 4 byte non sarebbero byte
"interi", ma inizierò ad un certo bit e finirebbero ad un'altro...
Insomma... non é così semplice con l'API Copymemory...
                Ciao
                                    Allanon
--
- SPAMKILLER
 L'indirizzo delle risposte é 
itlangv...@michele.sytes.net
 LASCIATE il NOSPAM fa parte dell'indirizzo :-)
  Per superare le impostazioni di protezione antispam scrivete
  nel testo del messaggio la scritta "SPAMKILLER"
Scusate il disturbo, ma non posso più di pubblicità


credo (credo) che ti stai sbagliando...

 wrote in message
news:3EBA71F2...@tiscalinet.it...


> Se però mi dai retta, credimi, ma non ne caverai un ragno dal buco:
infatti... mi sa proprio...
altre idee per ottenere spezzare la variabile Date in parte intera e parte
decimale senza arrotondamenti derivati
da cdbl e cdec?
grazie


Una cosa del genere?
Dim d As Date
Dim h As Date
d = Now
h = d - DateSerial(Year(d), Month(d), Day(d))
End Sub
in h ho la parte decimale in dateserial(...) la parte intera
termoPilucco

 > da cdbl e cdec?
Perché arrotondamenti?
Non dovrebbero essercene...
In effetti ho provato 2 prove e ti allego anche una funzione per estrarre
l'ora da una data (anche se non é il massimo:
Private Sub Form_Load()
  Dim DT As Date
  DT = Now
  MsgBox Format$(DT, "yyyy mm dd hh:nn:ss")
  MsgBox CDbl(DT) = CDate(CDbl(DT))
End Sub
Public Function Ora(DT As Date) As Date
  Ora = TimeSerial(Hour(DT), Minute(DT), Second(DT))
End Function
Se però ti continua a interessare di estrarre la parte decimale da un double
senza rischiare nessun arrotondamento (anche se in teoria sono quasi sicuro
che fare così:
cdate(DT-int(DT))
non comporterebbe nessun arrotondamento posso darti 2 dritte per "spaccare"
un double in bit...
                        Ciao
                                                    Allanon

Scusate, mi sa che ho fatto un po' di casini con la firma e non ho risposto
alla persona giusta...
                        Ciao
                                                Allanon


 h = d - DateSerial(Year(d), Month(d), Day(d))
h = Now - Date
Ciao

h = Now - Date
certo, ma ho scritto Now per pigrizia, in realtą al suo posto si dovrebbe
inserire una data generica.
termoPilucco
Ciao,
Luca.

 oso' proferir siffatte parole:
oppsss... scusate la firma e il nick cambiati... sto scrivendo da un altro PC...
termoPilucco
Ciao,
Luca.

credo (credo) che ti stai sbagliando...
Si', c'e' un po' di confusione sul formato del Double, quindi cambiamo
strada.
Guarda un po' se puo' servirti quest'idea:
Option Explicit
Private Declare Sub GetSystemTime Lib "kernel32" ( _
            ByRef lpSystemTime As SYSTEMTIME)
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
Public Sub Test()
    Dim st As SYSTEMTIME
    Call GetSystemTime(st)
    ' fai quello che ti pare con i campi di st
End Sub
-- 
ciao, hal

 inserire una data generica.
Mi riferivo all'uso di DateSerial() :)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 utilizzare funzioni come cdbl o cdec.
Se hai una var date del tipo:
"gg/mm/yyyy hh:mm:ss"
Per estrarre separatamente la data e l'ora puoi scrivere:
------------------------------------------------------
'Dovrei controllare se lunghezza del left e del right
data=left(dataora,instr(dataora,chr(32))
ora=right(dataora,instr(dataora,chr(32))
------------------------------------------------------
Allo stesso modo per i secondi puoi scrivere:
secondi=right(ora,instrev(ora,":"))
Però mi sembra troppo semplice per essere la soluzione.
Ciao,
        Fabrizio

 infatti sarei obbligato ad utilizzare funzioni come cdbl o cdec.
Perchč?
    Dim data_ora As Date
    Dim data As Date
    Dim ora As Date
    data_ora = #5/8/2003 11:40:50 PM#
    data = Fix(data_ora)
    ora = data_ora - data

     ora = data_ora - data
O, più brevemente:
ora = TimeValue(data_ora)
-- 
Ciao, Mauro CB

 End Sub
anche a me ieri sera è venuta questa idea, grazie per averla implementata, la
terrò da parte :-)
pero, non picchiatemi, mi sa che ho dimenticato una parte importante:
in realta la data mi viene restituita da un database che mi restituisce anche i
millisecondi.
avevo già scritto per questo problema: quando ti fai restituire il valore del
campo date da ado, il
valore ti viene arrotondato al secondo precedente o successivo in base al numero
di millisecondi.
grazie ai  vari consigli ricevuti, ho scritto una funzione che tramite un po' di
calcoli mi permette
di ottenere i valori corretti di ora, minuti, secondi e millisecondi.
giusto ieri mi sono accorto che questa funzione falliva in alcuni casi, dovuti
alla conversione double.
ho sostituito il cdbl con cdec e tutto è tornato a funzionare.
ma ovviamente mi resta il dubbio che possa esistere qualche stupido caso in cui il
risultato fallisca, per questo
ho pensato di riuscire a spezzare quel maledetto campo per ottenere valori
precisi.
io posto la funzione, così se volete gli date un occhio.
(e ve la tenete.. :-))
se, anzi, legge anche il webmaster del sito e vuole pubblicarla... (ora mi son
registrato ma ci vogliono 48 ore..)
**************************************
Function RestituisciHMSI(pdtData As Variant, pstrTipo As Variant) As Integer
'*********************************************************************************
    'Autore
    '   Daniele Sala
    'Descrizione
    '   Restituisci H(ora), M(inuti), S(econdi), m(I)llisecondi.
    '   la funzione serve per ottenere i corretti valori da una variabile
    '   Date restituita da un database
    'Parametri
    '   pdtData
    '       [Variant/IN]
    '       valore Data restituito da una lettura del database
    '   pstrTipo
    '       [String/IN]
    '       tipo di dato da restituire:
    '       - h: ore
    '       - m: minuti
    '       - s: secondi
    '       - i: millisecondi
    'Ritorno
    '   [Integer]
    '   Restituisce il dato richiesto
    'Versioni
    '   05/05/2003 - Dani
    '       Versione iniziale
'*********************************************************************************
    Dim pvValore As Variant
    Dim plngFattoreMoltiplicazione As Long
    Dim pcntFattoreMoltiplicazione As Integer
    Dim pintIndice As Integer
    Dim parrMoltiplicatori(3) As Variant
    parrMoltiplicatori(0) = 1000
    parrMoltiplicatori(1) = 60
    parrMoltiplicatori(2) = 60
    parrMoltiplicatori(3) = 24
    pintIndice = InStr("ISMH", UCase(pstrTipo)) - 1
    plngFattoreMoltiplicazione = 1
    'calcolo il moltiplicatore in base a quello che devo ottenere
    For pcntFattoreMoltiplicazione = (pintIndice) To 3
        plngFattoreMoltiplicazione = _
            plngFattoreMoltiplicazione *
parrMoltiplicatori(pcntFattoreMoltiplicazione)
    Next
    'scarto la parte intera che rappresenta la data e tengo solo i decimali
    'che rappresentano l'ora
    pvValore = CDec(CDec(pdtData) - Int(pdtData))
    'moltiplico per ottenere ore, minuti, secondi o millisecondi a seconda del
    'fattore di moltiplicazione
    pvValore = CDec(pvValore * plngFattoreMoltiplicazione)
    'divido per il numero di valori nell'unità successiva:
    '24 ore al giorno
    '60 minuti all'ora
    '60 secondi al minuto
    '1000 millisecondi al secondo
    'pvValore = pvValore Mod parrMoltiplicatori(pintIndice)
    pvValore = pvValore / parrMoltiplicatori(pintIndice)
    pvValore = pvValore - Int(pvValore)
    'devo arrotondare solamente con i millisecondi; negli altri casi tronco
    If pintIndice = 0 Then
        pvValore = Round(pvValore * parrMoltiplicatori(pintIndice))
    Else
        pvValore = Int(pvValore * parrMoltiplicatori(pintIndice))
    End If
    RestituisciHMSI = pvValore
End Function

oppure, come proposto da un collega, un bello shift di bit (32) in modo da avere
solo quelli della parte devimale... ma come fare?



http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
-- 
ciao, hal

Ormai la sentivo come una sfida contro me stesso quindi ho provato
qualcosa... Beh, se vuoi ti posto anche il codice che ho usato, ma ti
assicuro che:
1) Non c'é nessuna perdita di significatività Facendo il Cdbl() di una data
2) In ogni caso "non ne caverai un ragno dal buco"
                        Ciao
                                                            Allanon
P.S. Se però ci tieni proprio il mio codice é pronto... :)



pazienza. mio papò fa il muratore, il buco lo chiudo :-DD
ciao
Daniele

 wrote in
message news:3EBBA234...@tiscalinet.it...
