Autore Topic: Tempo Unix e problema dell'anno 2038  (Letto 924 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 14 Agosto 2020, 17:49:37 da vuott »
« 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.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #1 il: 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:
« Ultima modifica: 04 Aprile 2018, 09:54:25 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #2 il: 04 Aprile 2018, 10:45:32 »
Interessante, ma non restituisce i millisecondi.   :-\
« 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.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #3 il: 04 Aprile 2018, 11:22:18 »
Interessante, ma non restituisce i millisecondi.   :-\

 ???
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #4 il: 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 o rivolgersi ad altri linguaggi di programmazione.

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #5 il: 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.    :-\

« 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.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #6 il: 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.
« Ultima modifica: 04 Aprile 2018, 16:01:54 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #7 il: 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:

nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.702
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #8 il: 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!
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #9 il: 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 però non credo ci sia un componente a supportarla.  :-\
O al contrario trattasi di cose vecchie... boh!

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #10 il: 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
« 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 kicco

  • Senatore Gambero
  • ******
  • Post: 1.702
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #11 il: 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:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #12 il: 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
« Ultima modifica: 06 Aprile 2018, 13:55:45 da vuott »
« 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.157
  • Tonno verde
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #13 il: 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?
« Ultima modifica: 06 Aprile 2018, 14:02:43 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.270
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Tempo Unix e problema dell'anno 2038
« Risposta #14 il: 06 Aprile 2018, 14:45:11 »
P.S. Il tuo SO è localizzato?

Dove lo vedo ?
« 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. »