Функция, которая создает метку времени в C # - PullRequest
100 голосов
/ 21 мая 2009

Мне было интересно, есть ли способ создать метку времени в c # из datetime? Мне нужно значение с точностью до миллисекунды, которое также работает в Compact Framework (говоря, что поскольку DateTime.ToBinary () не существует в CF).

Моя проблема в том, что я хочу сохранить это значение независимо от базы данных, чтобы потом можно было сортировать его и выяснить, какое значение больше другого и т. Д.

Ответы [ 6 ]

202 голосов
/ 21 мая 2009

Я всегда использую что-то вроде следующего:

public static String GetTimestamp(this DateTime value)
{
    return value.ToString("yyyyMMddHHmmssfff");
}

Это даст вам строку, подобную 200905211035131468, поскольку строка переходит от битов старшего разряда временной метки к простой сортировке строк низшего порядка в ваших запросах SQL, которые можно использовать для упорядочения по дате, если вы храните значения в базе данных

41 голосов
/ 18 июня 2010

Я полагаю, что вы можете создать дату в стиле Unix с точностью до секунды, используя следующее

//Find unix timestamp (seconds since 01/01/1970)
long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
ticks /= 10000000; //Convert windows ticks to seconds
timestamp = ticks.ToString();

Настройка знаменателя позволяет вам выбрать уровень точности

19 голосов
/ 21 мая 2009

Вы можете использовать свойство DateTime.Ticks, которое является длинным и универсальным хранимым, всегда расширяемым и пригодным для использования также в компактной среде. Просто убедитесь, что ваш код не используется после 31 декабря 9999 года;)

7 голосов
/ 30 июня 2013

Вы также можете использовать

Stopwatch.GetTimestamp () ToString ();. * +1003 *

3 голосов
/ 02 марта 2017

когда вам нужно в секундах:

var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;
3 голосов
/ 17 января 2013

Если вы хотите, чтобы временные метки соответствовали фактическому реальному времени, НО также хотели, чтобы они были уникальными (для данного экземпляра приложения), вы можете использовать следующий код:

public class HiResDateTime
{
   private static long lastTimeStamp = DateTime.UtcNow.Ticks;
   public static long UtcNowTicks
   {
       get
       {
           long orig, newval;
           do
           {
               orig = lastTimeStamp;
               long now = DateTime.UtcNow.Ticks;
               newval = Math.Max(now, orig + 1);
           } while (Interlocked.CompareExchange
                        (ref lastTimeStamp, newval, orig) != orig);

           return newval;
       }
   }
}
...