2016-05-08 7 views
-1

Ich habe eine einfache Klasse erstellt, die den Unix-Timestamp bekommt. Beim ersten Aufruf gibt es den Zeitstempel zurück, aber danach gibt es immer den gleichen Wert zurück, den es beim ersten Mal zurückgegeben hat, so wie es zwischengespeichert wurde.Timestamp.UTCNow ist nicht auf dem neuesten Stand

Was geht hier vor?

using System; 
using System.Collections; 

public class Timestamp {  
    public static float now { 
     get { 
      return (float)(DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds; 
     } 
    }  
} 

Timestamp.now liefert immer den gleichen Wert

Edit:

using UnityEngine; 
using System; 
using System.Collections; 


    public static float now { 
     get { 
      Debug.Log(DateTime.UtcNow); // 1 
      Debug.Log(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))); // 2 
      float ts = (float)(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))).TotalSeconds; 
      Debug.Log(ts.ToString("F")); // 3 
      return ts; 
     } 
    } 

} 

1) 5/8/2016 11:44:57 Uhr im ersten Aufruf gedruckt und 5/8/2016 11:45:05 PM beim zweiten Anruf, so ist es auf dem neuesten Stand

2) gedruckt 16929.23: 44: 57.2918073 beim ersten Anruf und 16929.23: 45: 05.9735794 beim zweiten Anruf, so ist es auf dem neuesten Stand

3) immer 1462751000,00 gedruckt

+0

Die Methode 'Subtract' von' DateTime.UtcNow' gibt eine 'TimeSpan' zurück, die Sie in einen 'float' umgewandelt haben, der nicht korrekt ist. – t0mm13b

+0

Warum konvertieren Sie das Ergebnis in einen "float"? –

+0

@ t0mm13b Der Wert der Eigenschaft 'TotalSeconds' wird umgewandelt, der Typ 'double' hat und in 'float' konvertiert werden kann. – hvd

Antwort

0

Das Problem (wie in den Kommentaren von @PetSerAl darauf hingewiesen) ist, dass float zu begrenzten Genauigkeit hat.

beachten:

var nowAsDouble = (DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds; 
var nowAsFloat = (float)nowAsDouble; 

Console.WriteLine("double: " + nowAsDouble.ToString("0.0")); 
Console.WriteLine("float: " + nowAsFloat.ToString("0.0")); 

Ausgang:

double: 1462751469.2 
float: 1462751000.0 

Wenn Sie dies mehrmals ausführen, werden Sie die doppelte Version sehen jedes Mal zu ändern, wobei der Wert Schwimmer ist immer gekürzt.

Sie müssen double Werte anstelle von float verwenden.

+0

Ok jetzt verstehe ich! Es war besser, das Doppel zu nehmen und schließlich konvertieren zu int (ich mache das jetzt tatsächlich) als in einen Gleitkommawert zu konvertieren, weil er die Gleitkommaauflösung verliert. – Pixel

0

Versuchen Sie, dieses

public static int now { 
     get { 
      return (int)(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))).TotalSeconds; 
     } 
    } 
+0

er casted TotalSeconds und es ist ein doppelt, so kann es gegossen werden, um float – Gusman

+0

haben Sie Jungs versucht, bevor Sie wählen, versuchen Sie es aus und überprüfen Sie den Wert bei http://www.onlineconversion.com/unix_time.htm – wael101

+1

Ziemlich traurig, wenn die einzige richtige Antwort wird so downvoted schwer, der Unix-Zeitstempel ist in der Tat * int *. Komm Leute, nicht einfach davon ausgehen, dass der OP weiß, was er tut. Er tut es nicht. –

Verwandte Themen