10
votes

Comment maintenir la précision en utilisant DateTime.now.ticks in c #

Je sais que lorsque j'utilise datetime.now.Ticks en C #, il renvoie une valeur longue, mais je dois la stocker dans une variable int et je suis confus que je peux ou non maintenir cette précision. À l'heure actuelle, j'ai juste une fonte

int timeStampValue = (int)DateTime.Now.Ticks;


5 commentaires

Pourquoi est-il nécessaire d'être stocké dans un int?


C'est une contrainte de projet, c'était la seule méthode que je pouvais penser et je n'ai pas eu à faire des trucs d'horodatage dans le passé.


Êtes-vous pas autorisé à utiliser une longue durée, ou simplement pour stocker des données externes? Par exemple, si vous pouvez utiliser une longue pour obtenir les données, puis stocker deux INTS?


non autorisé à utiliser un long du tout, je ne peux utiliser qu'un int


Dire que vous ne pouvez pas utiliser des INTS du tout ne donne pas vraiment les contraintes. Est-ce dû à un système intégré? Votre utilisation est longue au moment où vous appelez '(int) datetime.now.ticks;' Regardez ma solution ci-dessous. Vous pouvez utiliser deux UINT pour représenter l'ensemble de la valeur longue de l'horodatage et créer vos propres méthodes pour tout calcul que vous devrez peut-être faire. Cela vous permettra d'avoir une résolution complète en utilisant uniquement des INT.


5 Réponses :



2
votes

Si une résolution d'un milliseconde est suffisante, vous pouvez stocker des compensations à partir d'une base Datatime code> dans votre champ int code>, puis reconstruire une complète DateTime code> quand vous en avez besoin. Les millisecondes stockées dans un entier 32 bits permettraient à votre application de courir pendant 49 jours avant son enveloppe. Voici une classe d'assistance simple que vous pouvez utiliser:

public static void Method()
{
    var offsetManager = new TimeOffsetManager();

    int offset = offsetManager.GetOffset();

    // ...

    DateTime realTime = offsetManager.OffsetToDateTime(offset);
}


0 commentaires

14
votes

Avez-vous besoin de tous les bits les plus significatifs? (E.G. En quelle année)

Avez-vous besoin de tous les bits les moins importants? (par exemple, précision de sous-nanoseconde) p>

combien de temps un intervalle avez-vous besoin de mesurer? p>

Si vous avez besoin de précision de milliseconde, pourquoi ne pas perdre les bits les moins importants p>

int timeStamp = (int)(DateTime.Now.Ticks >>23) // retain bits 23 to 55


1 commentaires

Je dois être capable de suivre les articles les moins récemment utilisés dans un tableau.



1
votes

En référence à mon commentaire ci-dessus. Quelle est la contrainte exactement? Si la contrainte est que vous ne pouvez pas stocker les données dans une variable 64 bits, alors que diriez-vous de faire quelque chose dans le sens de. XXX

Vous pouvez maintenant stocker à la fois les données Tslow et Tshigh sur vos données externes. Vous pouvez également mettre en œuvre des fonctions spéciales susceptibles de calculer des valeurs à l'aide des deux numéros de 32 bits distincts pour faire votre propre calcul de 64 bits.

Cela dépend vraiment de vos contraintes réelles. Savoir ceux qui contribueront à suggérer de meilleures solutions.


0 commentaires

2
votes

plus pour des coups de pied que tout ... Si vous êtes décédé sur l'utilisation d'INTS pour stocker votre DateTetime et maintenir la précision, vous pouvez définir votre propre struct contenant deux INTS, chacun contenant 4 octets et une date d'heure qui partage ceux qui partagent octets.

public class Program
{
    public static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        var myDate = new Int32BackedDate(now.Ticks);

        Console.WriteLine(now);
        Console.WriteLine(myDate.Date);
    }
}

[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct Int32BackedDate
{
    [FieldOffset(4)]
    private readonly int _high;

    [FieldOffset(0)]
    private readonly int _low;

    [FieldOffset(0)]
    private readonly DateTime _date;

    public DateTime Date { get { return _date; } }

    public Int32BackedDate(long ticks)
    {
        _date = default(DateTime);
        byte[] bytes = BitConverter.GetBytes(ticks);
        _low = BitConverter.ToInt32(bytes, 0);
        _high = BitConverter.ToInt32(bytes, 4);
    }
}


0 commentaires