Autore Topic: convertire una data di calendario in un numero progressivo  (Letto 6122 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Sto studiando ad una funzione  che permetta di convertire una data di calendario in un numero progressivo e viceversa. La prima parte l'ho già realizzata, mentre per la seconda ho qualche difficoltà. Allora ho sospeso quel ragionamentop per affrontarne un altro partendo da questo post.

Se una variabile di tipo Data altro non é che un variabile numerica con valore float, eseguendo il print di una data qualsiasi dovrei ottenere già il valore in progressivo numerico, invece ottengo sempre la stampa in formato gg/mm/aaa hh/mm/ss. Allora esiste una sorta di conversione automatica del progressivo numerico in data, come se la variabile contesensse un flag di riconoscimento di numero di tipo float ed una data di calendario, pur essendo essa rappresentata come valore float.

Il mio ragionamento era molto semplice: Se la data di calendario é un numero in formato float, la parte intera indicherà un numero in termini di giorni; allora:
1) prelevo dalla data di calendario  la parte intera, cioé quella corrispondeNte alla data vera e propria, espressa in giorni
2) aggiungo o sottraggo un numero qualsiasi di giorni
3) il risultato doveva, secondo il mio ragionamento, purtroppo, sbagliato, restituirmi immediatamente e molto semplicemente la nuova data.

Ma allora come posso ottenere e quindi capire il valore numerico di una variabile di tipo di data?

 :roll:
 :ciao:  :ciao:
:ciao:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: convertire una data di calendario in un numero progressivo
« Risposta #1 il: 20 Giugno 2009, 12:49:13 »
Non ho capito cosa intendi per numero progressivo..

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: convertire una data di calendario in un numero progressivo
« Risposta #2 il: 20 Giugno 2009, 14:36:34 »
Ho scritto un po' di codice usando le funzionalità degli ambienti Unix. SHELL serve a questo ;-)

Codice: [Seleziona]

' Gambas module file

PUBLIC SUB Main()
 
  DIM sEseguibileDate AS String
  DIM sConverter AS String
  DIM sProgressivoSecondi, sData AS String
 
  'Trovo nel sistema l'eseguibile di date, per evitare possibili alias
  'dell'utente.
 
  SHELL "which date" TO sEseguibileDate
  'Tramite date posso ottenere qualsiasi data in secondi.
  'Tolgo la newline dalla risposta di which e aggiungo
  'l'opzione --date con la data di oggi [b](anno-mese-giorno)[/b] e
  '+%s per avere il progressivo in secondi.
  sEseguibileDate = Trim$(sEseguibileDate) & " --date 2009-06-20 +%s"
 
  SHELL sEseguibileDate TO sProgressivoSecondi
 
  'Ho la data progressiva in secondi (dal 1970)
  PRINT "La data 20-06-2009 in secondi: " & sProgressivoSecondi
 
  'Voglio recuperare la data
  'Uso Trim$ per togliere la newline.
  sConverter = "echo " & Trim$(sProgressivoSecondi) & " | awk '{print strftime(\"%d/%m/%Y\",$1)}'"
   
  SHELL sConverter TO sData
  sData = Trim$(sData)
  PRINT sData
  PRINT "-------------------------------"
  'Rifaccio con una data del passato.
  SHELL "which date" TO sEseguibileDate
  sEseguibileDate = Trim$(sEseguibileDate) & " --date 1902-01-01 +%s"
  SHELL sEseguibileDate TO sProgressivoSecondi
  PRINT "Progressivo data 01-01-1902: " & sProgressivoSecondi
  sConverter = "echo " & Trim$(sProgressivoSecondi) & " | awk '{print strftime(\"%d/%m/%Y\",$1)}'"
  SHELL sConverter TO sData
  sData = Trim$(sData)
  PRINT sData
 
 
 
END



Cosa fa il codice:
1) ti da il progressivo in secondi di una data tra il 1902 e il 2037 (se devi
salvare date pre e post per ora non puoi farlo - forse sulle macchine a 64 bit - è il bug noto)
2) da quel progressivo ti ritrova la data

Ho scritto la cosa senza GUI solo per farti vedere come funziona. Se vuoi
un altro formato al posto di gg/mm/yyyy guarda 'man strftime' e
sostituisci print strftime(\"%d/%m/%Y\" con quello che ti pare . Il codice è commentato. Nella seconda parte (con la data vecchia) le cose sono ripetute,
ma naturalmente basta scrivere le due funzioni (m'abbutava :-) ).Ciao.

EDIT: il sito toglie dei backslash di protezione. Usa il codice dell'allegato!

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: convertire una data di calendario in un numero progressivo
« Risposta #3 il: 20 Giugno 2009, 19:37:49 »
@ Ceskho:
Se parti dall'anno zero, il primo gennaio dell'anno 0 si può numerare col n°1 perché é il primo giorno in assoluto, il secondo giorno sarà identificato dal n°2 e così via. Attraverso tale successione numerica che é una progressione aritmetica di ragione uno, in definitiva, il 15-gen-2009, per es., si può rappresentare col numero 733422, cioé il valore numerico progressivo di tutti i giorni intercorrenti fra il 1°-gen-00 ed il 15-gen-2009. Giulio ha spinto il calcolo ancora oltre arrivando a calcolare il valore progressivo numerico del minuto secondo che produce un valore di estrema precisione riferito all'istante che si vuole fotografare, ma io non ho necessità di spingermi fino a quel livello perché nel mio programma devo solo risalire al 60° giorno precedente la data di sistema, per operarre una pulizia in una tabella di tutte quelle causali descrittive che non si usano appuntop da oltre 60 giorni. E' anche vero che sono stato molto limitativo nell'indicare il mio problema che si riduce a creare una funzione di calcolo che sto provando con un programmino dove ho utilizzato due valuebox, una per inserirvi la data di partenza, da tastiera, l'altra per riportarvi il risultato del calcolo. Mentre dalla data di partenza riesco facilmente ad ottenere il valore numerico progressivo del giorno corrispondente alla data inserita, non sono più in grado di restituire la data dopo avere aggiunto lo spostamento dei giorni di incremento o descrmento.
Però se per arrivare a questo devo utilizzare il metodo del valore progressivo riferito al minuto secondo, preferisco sostituire le Valuebox con atrettante Textbox. Anzi, nell'attesa di un eventuale indicazione da voi, carissimi amici del Forum, ho già apportato la modifica ed ho ottenuto il primo risultato. Devo solo verificare che il programmino funziooni per trasferire poi la funzione nel programma che ho in  svolgimento.

@ Giulio: Mi dispiasce di averti impegnato così tanto;  non era assolutamente nelle mie intenzioni; ti  chiedo perciò scusa per avere formulato male il quesito. Ti ringrazio di cuore per il più che valido aiuto che hai voluto darmi. Ho comunque conservato il tuo post perché contiene codice prezioso che magari potrà servirmi in un altro momento.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: convertire una data di calendario in un numero progressivo
« Risposta #4 il: 20 Giugno 2009, 21:13:24 »
ma perche non ubi le funzione dateadd per il tuo programma?

Codice: [Seleziona]
Result = DateAdd ( Date as Date , Period AS Integer , Count AS Integer ) AS Date

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: convertire una data di calendario in un numero progressivo
« Risposta #5 il: 20 Giugno 2009, 23:43:45 »
Citazione

fsurfing ha scritto:
ma perche non ubi le funzione dateadd per il tuo programma?
Codice: [Seleziona]
Result = DateAdd ( Date as Date , Period AS Integer , Count AS Integer ) AS Date


Però...! Sinceramente no la conoscevo.  :-) Grazie, la proverò e ti farò sapere. :ciao:  :ciao:
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: convertire una data di calendario in un numero progressivo
« Risposta #6 il: 22 Giugno 2009, 17:26:51 »
@ fsurfing:
Ok, ho guardato meglio la documentazione che mi hai suggerito ed ho scoperto le funzioni collegate alla gestione della data. In effetti era quello che cercavo, ma la scarsa dimestichezza a cercare nella documentazione ufficiale non mi ha permesso di pensarci, per cui non sono andato a guardare. Grazie per avermi illuminato. Fra le prove fatte ho anche sommato alla data di partenza uno scarto di giorni in negativo ed ho ottenuto, come volevo, la nuova data, antecedente a quella di partenza. ... Formidabile! :evviva:
Con l'occasione voglio citare il risultato ottenuto col seguente codice:
Citazione
Codice: [Seleziona]

d_Data = Date(i_DtAA, i_DtMM, i_DtGG, 00, 00, 00)
PRINT d_Data
PRINT CFloat(d_Data)

15/01/09
2486951,04166667)
diverso da:
Citazione
Codice: [Seleziona]

d_Data = Date(i_DtAA, i_DtMM, i_DtGG, 00, 00, 01)
PRINT d_Data
PRINT CFloat(d_Data)

15/01/2009 00:00:01
2486951,04167824)

La differenza sta nel campo data che, senza l'indicazione di almeno 1" nel tempo, presenta una data con l'anno limitato agli ultimi due caratteri, come se l'impostazione del tempo a 0h, 0', 0", fosse una condizione di criticità.
Ho formulato la citazione solamente a scopo informativo. Sono arcicontento del risultato ottenuto. Grazie ancora.
 :-D    :ciao:  :ciao:
:ciao:

  • Visitatore
Re: convertire una data di calendario in un numero progressivo
« Risposta #7 il: 22 Giugno 2009, 23:24:07 »
:rotfl:
Io che pensavo dovessi far chissàcosa .....
da come avevi messo iù il primo post sembrava dovessi rielaborare la teoria evolutiva non far la differenza fra due date ...