Criação de carimbo de data / hora C # UNIX

Durante anos, criei carimbos de data / hora em C # usando o Ticks, que usa números tão grandes que é absolutamente impossível lembrar. Um tique tem 100 nanossegundos e o grande número é usado para converter o valor mínimo de DateTime para o início do Unix Timestamp .

(EV_Epoch.Ticks - 621355968000000000) / 10000000

Então descobri uma coisa maravilhosa, DateTime.Subtract , que tornou a criação de timestamps muito mais fácil. É simples lembrar que o início do timestamp Unix era 01/01/1970 e recuperar o deslocamento TotalSeconds entre os DateTimes.

EV_Epoch.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds

Eu queria ter certeza de que não estava adicionando tensão supérflua ao sistema instanciando uma estrutura extra de DateTime porque estava com preguiça de descobrir os valores de ticks que não conseguia lembrar.
Acontece que o impacto é mínimo. Sim, leva 2,5x mais tempo para usar o novo método DateTime, mas está no nível de nanossegundos. Para desenvolvimento e mesmo produção onde não é executado continuamente, a mudança para ticks não é totalmente necessária.

Resultados:

Number of seconds since the start of the EV Epoch, Ticks method: 1308823200
Number of seconds since the start of the EV Epoch, new DateTime method: 1308823200


Results for 1000000000 trials

Method Total Time [ms] Avg Time [ms]
Ticks 16219 1.6219E-05
DateTime 42282 4.2282E-05

Método de teste:

public static void timestampSpeeds()
{
//determine the best way to create a unix timestamp

//set the number of trials to run
int trials = 1000000000;
DateTime EV_Epoch = new DateTime(2011, 6, 23, 10, 0, 0, DateTimeKind.Utc);

//start the stopwatch and begin making timestamps
double sec;
Stopwatch sw_ticks = Stopwatch.StartNew();
for (int i = 0; i < trials; i++)
sec
= (EV_Epoch.Ticks - 621355968000000000) / 10000000;
sw_ticks
.Stop();


Stopwatch sw_datetime = Stopwatch.StartNew();
for (int i = 0; i < trials; i++)
sec
= EV_Epoch.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
sw_datetime
.Stop();


//do some diagnostics stuff
using (StreamWriter writer = new StreamWriter(string.Format("Ticks_vs_New_DateTime_{0}.txt", trials)))
{
writer
.WriteLine(string.Format("Number of seconds since the start of the EV Epoch, Ticks method: {0}", (EV_Epoch.Ticks - 621355968000000000) / 10000000));
writer
.WriteLine(string.Format("Number of seconds since the start of the EV Epoch, new DateTime method: {0}", (int)EV_Epoch.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds));
writer
.WriteLine(string.Format("rnrnResults for {0} trials", trials));
writer
.WriteLine("rnMethodttTotal Time [ms]ttAvg Time [ms]");
writer
.WriteLine(string.Format("Tickstt{0}ttt{1}", sw_ticks.ElapsedMilliseconds, (sw_ticks.ElapsedMilliseconds / (double)trials)));
writer
.WriteLine(string.Format("DateTimet{0}ttt{1}", sw_datetime.ElapsedMilliseconds, (sw_datetime.ElapsedMilliseconds / (double)trials)));
}
}