Функция, которая создает временную метку в С#
Мне было интересно, есть ли способ создать timestamp в С# из datetime?
Мне нужно значение миллисекундной точности, которое также работает в Compact Framework (говоря, что поскольку DateTime.ToBinary() не существует в CF).
Моя проблема в том, что я хочу сохранить это значение в агностическом режиме базы данных, поэтому я могу отсортировать его позже и узнать, какое значение больше для другого и т.д.
Ответы
Ответ 1
Я всегда использую что-то вроде следующего:
public static String GetTimestamp(this DateTime value)
{
return value.ToString("yyyyMMddHHmmssfff");
}
Это даст вам строку, такую как 200905211035131468, поскольку строка идет от битов наивысшего порядка метки времени до простой сортировки строк по строкам в ваших SQL-запросах, которые могут использоваться для упорядочения по дате, если вы придерживаетесь значений в базе данных
Ответ 2
Я считаю, что вы можете создать временную метку стиля 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();
Настройка знаменателя позволяет вам выбрать уровень точности
Ответ 3
Вы можете использовать свойство DateTime.Ticks, которое является долговечным и универсальным, всегда увеличивающимся и используемым на компактной основе. Просто убедитесь, что ваш код не используется после 31 декабря 9999;)
Ответ 4
Вы также можете использовать
Stopwatch.GetTimestamp() ToString();.
Ответ 5
Если вы хотите, чтобы временные метки соответствовали фактическим реальным временам, но также хотите, чтобы они были уникальными (для данного экземпляра приложения), вы можете использовать следующий код:
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;
}
}
}
Ответ 6
когда вам нужно в секундах:
var timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1)).TotalSeconds;