Gambas-it

Gambas dal mondo esterno => Spagna => Topic aperto da: vuott - 04 Aprile 2018, 03:08:18

Titolo: Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 04 Aprile 2018, 03:08:18
https://foro.gambas-es.org/viewtopic.php?f=1&t=6895
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 09:52:22
Scusa l'ignoranza sui millisecondi, ma così non va bene?
Codice: [Seleziona]
Public Sub Main()
  '' occorre attivare gb.util
  Print Date.ToUnixTime(Now) ' secondi
  Print Date.ToUnixTime(Now) * 1000 ' millisecondi

End

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 04 Aprile 2018, 10:45:32
Interessante, ma non restituisce i millisecondi.   :-\
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 11:22:18
Interessante, ma non restituisce i millisecondi.   :-\

 ???
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 13:41:43
Da Wikipedia:
Citazione
Tempo (Unix)
Nei sistemi operativi Unix e Unix-like il tempo viene rappresentato come offset in secondi rispetto alla mezzanotte (UTC) del 1º gennaio 1970 (detta epoca).

Quindi stiamo parlando di secondi e non di millisecondi

È un discorso già affrontato, in Gambas la parte più piccola in cui si può misurare il tempo è il secondo, pertanto per avere i millisecondi l'unica è moltiplicare per mille i secondi, ottenendo naturalmente un arrotondamento al secondo inferiore, vale a dire che fin che non scatta il nuovo secondo è valido il precedente e questo verrà ritornato dalla funzione.

Se uno ha bisogno di una maggiore precisione deve utilizzare librerie esterne vedi la nostra wiki (http://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Tempo.2C_Date_e_Temporizzazioni) o rivolgersi ad altri linguaggi di programmazione.

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 04 Aprile 2018, 15:39:26
in Gambas la parte più piccola in cui si può misurare il tempo è il secondo
...forse... direi utilizzare .
Infatti l'entità temporale dei millisecondi è attestata comunque dalla costante nativa gb.Millisecond

Inoltre questi due comandi:
Codice: [Seleziona]
Print CFloat(Now)
Codice: [Seleziona]
Print CStr(Now)
restituiscono rappresentazioni inferiori al secondo.    :-\

Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 15:57:34
in Gambas la parte più piccola in cui si può misurare il tempo è il secondo
...forse... direi utilizzare .
Infatti l'entità temporale dei millisecondi è attestata comunque dalla costante nativa gb.Millisecond

Inoltre questi due comandi:
Codice: [Seleziona]
Print CFloat(Now)
Codice: [Seleziona]
Print CStr(Now)
restituiscono rappresentazioni inferiori al secondo.    :-\

Si hai ragione, mi sono espresso male.
Stavo per l'appunto facendo esperimenti sul Frac di CFloat(Now) (che restituisce i microsecondi da mezzanotte) per vedere se avevo torto...  ;D

P.S. Oltretutto pare che non sia come pensavo, vale a dire che i secondi si arrotondano come normale su base 500 ms se sotto o sopra.
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 16:50:19
Basta ci rinuncio, l'unica cosa che sono riuscito ad ottenere è un bel (si fa per dire) mal di testa.
Oltretutto non mi ero neanche accorto che la discussione su forum spagnolo era proseguita e avevi postato la funzione di gb.util con un escamotage che dovrebbe restituire i decimali.  ;D
Ma dato, e non concesso che sia vero, che la funzione si arrotonda su base 500ms all'ora l'escamotage non dovrebbe funzionare senza tenerne conto  :-\
 :ciao: :ciao:

Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: kicco - 04 Aprile 2018, 19:26:22
 :ciao:
Stavo riguardando la questione dei millisecondi...
Time per esempio restituisce anche i millisecondi, anche se succede una cosa strana:
Codice: [Seleziona]
Public Sub Main()
 
  Print "Pippo  " & Time
  Print Time

End
Nel primo Print ottengo anche i millisecondi
Nel secondo Print no!   :-\
Un baco?
Wait è espresso con un  numero decimale in secondi, con risoluzione al millisecondo (0.001), sembrerebbe!
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 04 Aprile 2018, 19:49:52
:ciao:
Stavo riguardando la questione dei millisecondi...
Time ..·
Nel primo Print ottengo anche i millisecondi
Nel secondo Print no!   :-\
Un baco?
Succede anche a me, non saprei se trattasi di baco.
Potrebbe essere che vi siano in ballo dei cambiamenti, ad esempio nella wiki è presente questa funzione (http://gambaswiki.org/wiki/dev/api/name/gb.makedatefromtime?ht=Unix+time) però non credo ci sia un componente a supportarla.  :-\
O al contrario trattasi di cose vecchie... boh!

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 05 Aprile 2018, 17:09:37
Nel primo Print ottengo anche i millisecondi

...sembrerebbe che l'operatore " & " determini quel fenomeno.

Provate anche il semplice esempio:
Codice: [Seleziona]
Public Sub Main()

  Print Null & Time

End
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: kicco - 06 Aprile 2018, 13:09:30
Citazione
...sembrerebbe che l'operatore " & " determini quel fenomeno.
...e indipendentemente dalla sua posizione.
Codice: [Seleziona]
print time & "prova"
porta allo stesso risultato!
 :-\
 :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 06 Aprile 2018, 13:48:48
Torno alla questione della quantità di secondi trascorsi dalla data iniziale UNIX.

Ebbene, a me queste due righe non restituiscono il medesimo risultato:    :hard:
Codice: [Seleziona]
Public Sub Main()

   Print CFloat(DateDiff(CDate("01/01/1970"), Now, gb.Second))

   Print CFloat(Date.ToUnixTime(Now))

End


Affinché i due risultati siano identici, devo aggiungere 4 ore alla data/orario presente nella prima riga, cioè così:    :-\
Codice: [Seleziona]
Public Sub Main()

   Print CFloat(DateDiff(CDate("01/01/1970 04:00:00"), Now, gb.Second))

   Print CFloat(Date.ToUnixTime(Now))

End
Risulta anche a voi ?   ???


Il problema sembra essere la prima riga, giacché utilizzando funzioni esterne standard C, ottengo il risultato identico alla seconda riga:
Codice: [Seleziona]
Library "libc:6"

Public Struct timespec
  tv_sec As Long
  tv_nsec As Long
End Struct

Private Const CLOCK_REALTIME As Integer = 0

' int clock_gettime (clockid_t __clock_id, struct timespec *__tp)
' Get current value of clock CLOCK_ID and store it in TP.
Private Extern clock_gettime(__clock_id As Integer, __tp As Timespec) As Integer


Public Sub Main()
 
  Dim spec As New Timespec
 
  clock_gettime(CLOCK_REALTIME, spec)
 
  Print spec.tv_sec, "(dalla funzione esterna)"
 
  Print CFloat(Date.ToUnixTime(Now)), "(con il Metodo .ToUnixTime() )"

  Print CFloat(DateDiff("01/01/1970 04:00:00", Now, gb.Second)), "(con 4 ore aggiuntive)"

   Print CFloat(DateDiff("01/01/1970", Now, gb.Second)), "(senza ore aggiuntive)"
 
End
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 06 Aprile 2018, 14:00:17
@Kicco

Bisognerebbe capire esattamente quali passaggi addotta Print per trasformare in String ciò che scrive.
Infatti se scriviamo Print CStr(time) otteniamo i millisecondi...

@Vuott

Risulta anche a voi ?   ???

Io ottengo lo stesso risultato:  :-\
Codice: [Seleziona]
Public Sub Main()
 
  Print CFloat(DateDiff(CDate("01/01/1970 04:00:00"), Now, gb.Second))

  Print CFloat(Date.ToUnixTime(Now))

End
In Console:
Codice: [Seleziona]
1523015660
1523015660

 :ciao: :ciao:

P.S. Il tuo SO è localizzato?
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 06 Aprile 2018, 14:45:11
P.S. Il tuo SO è localizzato?

Dove lo vedo ?
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 06 Aprile 2018, 15:00:05
Da nessuna parte, ho sparato una c....a estemporanea, ultimamente mi succede un po troppo spesso, colpa della primavera... sommata alle precedenti  :-[

Circa il problema della differenza in effetti sono 4 ore mentre dovrebbero essere due (in più fra noi e UTC essendo in vigore l'ora legale) per me è un bug che invece di di sommare sottrae o viceversa.
A mio parere occorrerebbe chiedere a Minisini chiarimenti su questo e anche su Print che dovrebbe localizzare...
Comunque con le date e gli orari c'è da perdersi, per me è come algebra  ;D

 :ciao: :ciao:

Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 06 Aprile 2018, 15:28:29
Ho fatto una specie di prova del nove e ora mancano le due ore canoniche  :-\

Codice: [Seleziona]
Public Sub Main()

  Dim i, u, r As Float

  i = 60 * 60 * 24 ' ottengo gli ms di un giorno
  u = CFloat(Date.ToUnixTime(Now)) ' ottengo gli ms da epoca
  r = u / i
  r = Frac(r) ' ottengo la rimanenza odierna
  Print Time(r) ' la tramuto in tempo, e se aggiungessimo 2 ore...

End
... Scusate avevo saltato un passaggio...

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: kicco - 06 Aprile 2018, 15:49:17
Citazione
Affinché i due risultati siano identici, devo aggiungere 4 ore alla data/orario...
Confermo!
 :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 06 Aprile 2018, 16:09:51
Citazione
Affinché i due risultati siano identici, devo aggiungere 4 ore alla data/orario...
Confermo!
 :ciao:

Infatti, se facciamo "la prova del nove" :
Codice: [Seleziona]
Public Sub Main()

  Dim i, u, r As Float

  i = 60 * 60 * 24 ' ottengo gli ms di un giorno
  u = CFloat(DateDiff("01/01/1970", Now, gb.Second)) ' ottengo (dovrei ottenere) gli ms da epoca
  r = u / i
  Print Int(r) ' ottengo i giorni per curiosità :-)
  r = Frac(r) ' ottengo la rimanenza odierna
  Print Time(r) ' la tramuto in tempo, e se sottraggo 4 ore ottengo UTC (- 2 il tempo locale) MISTERO

End

Otteniamo le 4 ore in più sul tempo UTC

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 06 Aprile 2018, 16:23:40
A mio parere occorrerebbe chiedere a Minisini chiarimenti su questo

...forse la risposta al nostro problema è stata già data da S.Agostino, quando sul tempo lui afferma:

" Se nessuno me lo chiede, lo so; se cerco di spiegarlo a chi me lo chiede, non lo so. "     ;D
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: Gianluigi - 09 Aprile 2018, 19:52:18
L'errore sembra risolto con l'ultimo commit (https://gitlab.com/gambas/gambas/commit/de12caa1e784ba956bcf0e15a3b6efdc3cbe0c13) ora le funzioni qui riportate restituiscono il tempo UTC corretto.

 :ciao: :ciao:
Titolo: Re:Tempo Unix e problema dell'anno 2038
Inserito da: vuott - 09 Aprile 2018, 21:45:54
L'errore sembra risolto con l'ultimo commit (https://gitlab.com/gambas/gambas/commit/de12caa1e784ba956bcf0e15a3b6efdc3cbe0c13)

Ah !?

(https://a.spirited.media/wp-content/uploads/sites/2/2015/09/Arbitration-altushost.gif?resize=994,559)