Как поддержать использование точности DateTime. Теперь. Галочки в C#

Я знаю это, когда я использую DateTime. Теперь. Галочки в C#, это возвращает длинное значение, но я должен сохранить его в международной переменной и я смущен относительно того, могу ли я поддержать ту точность. С прямо сейчас у меня просто есть бросок

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

Это - ограничение проекта, таким образом, я понимаю, что существуют тонны потерянной точности. Я предполагаю, что просто не мог думать о другом способе сделать вещь метки времени, сохраненную в интервале, который я мог затем сравнить с другими метками времени.

Любые предложения или совет относительно того, как поддержать точность, если это возможно, очень ценились бы.

Общие ответы были иллюстративны. Я на самом деле закончил тем просто, что настроил процесс, включающий счетчики, где, когда объект используется, это - счетчик, установлен на '0', и все другие счетчики увеличены 1. Затем то, независимо от того, что самый высокий счетчик, является следующим объектом, который будет использовать.

7
задан ihtkwot 25 April 2010 в 00:54
поделиться

5 ответов

Вам нужны все старшие биты? (например, в каком году)

Вам нужны все младшие биты? (например, субнаносекундная точность)

Как долго вам нужно измерять интервал?

Если вам нужна только миллисекундная точность, почему бы не потерять младшие значащие биты

int timeStamp = (int)(DateTime.Now.Ticks >> 10) // lose smallest 10 bits

править

OP хочет сохранить время недавно использованных элементов: если это выбор пользователя для одного пользователя, вам, вероятно, не нужно ничего короче секунды! так как количество тактов составляет 10 ^ 7 в секунду, в длинном значении есть log (10 ^ 7) / log (2) = 23 лишних бита!

Так сколько места вам нужно? Что ж, ваши значения должны указывать год, месяц, день, час, минуту и ​​секунду; В году около 32 миллионов секунд = около 24 бит. добавьте 3 бита, если вы хотите сохранить данные за последние 10 лет. Так что легко впишется в int32. Я бы посоветовал

int timeStamp = (int)(DateTime.Now.Ticks >>23) // retain bits 23 to 55
11
ответ дан 6 December 2019 в 06:13
поделиться

Ссылаясь на мой комментарий выше. Что именно является ограничением? Если ограничение заключается в том, что вы не можете хранить данные в 64-битной переменной, то как насчет того, чтобы сделать что-то вроде.

uint tsLow = (uint)DateTime.Now.Ticks;
uint tsHigh = (uint)(DateTime.Now.Ticks >> 32);

Теперь вы можете хранить как tsLow, так и tsHigh во внешних данных. Вы также можете реализовать специальные функции, которые могут вычислять значения, используя два отдельных 32-битных числа, чтобы выполнять свои собственные 64-битные математические вычисления.

Это действительно зависит от ваших реальных ограничений. Их знание поможет предложить лучшие решения.

1
ответ дан 6 December 2019 в 06:13
поделиться

Если разрешение в миллисекунды достаточно хорошее, вы можете сохранить смещения от некоторой базы DataTime в поле int , а затем восстановить полное DateTime , когда Вы нуждаетесь в этом. Миллисекунды, сохраненные в виде 32-битного целого числа, позволят вашему приложению работать в течение 49 дней, прежде чем оно будет упаковано. Вот простой вспомогательный класс, который вы можете использовать:

public class TimeOffsetManager
{
    public TimeOffsetManager()
    {
        InitialDateTime = DateTime.Now;
    }

    public DateTime InitialDateTime { get; private set; }

    public int GetOffset()
    {
        TimeSpan elapsed = DateTime.Now - InitialDateTime;
        return (int)Math.Round(elapsed.TotalMilliseconds);
    }

    public DateTime OffsetToDateTime(int offset)
    {
        return InitialDateTime + TimeSpan.FromMilliseconds(offset);
    }
}

Его можно использовать как:

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

    int offset = offsetManager.GetOffset();

    // ...

    DateTime realTime = offsetManager.OffsetToDateTime(offset);
}
2
ответ дан 6 December 2019 в 06:13
поделиться

DateTime.Now не так уж и точен.

http://blogs.msdn.com/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx

С учетом сказанного, если вы понижаете значение до меньшего размера, по умолчанию вы можете потерять данные в любой ситуации.

Рассмотрим этот вывод:

int.MaxValue:       2147483647
DateTime.Now.Ticks: 634075598514933010

Как преобразовать это в int реалистичным вариантом?

13
ответ дан 6 December 2019 в 06:13
поделиться

Больше для удовольствия, чем для чего-либо ... Если вы твердо настроены использовать int для хранения DateTime и поддержания точности, вы можете определить свой собственный struct, содержащая два int, каждый из которых содержит 4 байта, и DateTime, который разделяет эти байты.

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);
    }
}
2
ответ дан 6 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: