Tengo una marca de tiempo del servidor SQL que necesito convertir en una representación del tiempo en milisegundos desde 1970. ¿Puedo hacer esto con SQL simple? Si no, lo extraje en una DateTimevariable en C #. ¿Es posible obtener una representación en milisegundos de esto?
Gracias,
Teja.
c#
sql-server
datetime
Tejaswi Yerukalapudi
fuente
fuente

(now - Epoch).TotalMillisecondsdóndenowyEpochson los objetos DateTime.Respuestas:
Probablemente esté intentando convertir a una marca de tiempo similar a UNIX, que está en UTC:
yourDateTime.ToUniversalTime().Subtract( new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc) ).TotalMillisecondsEsto también evita problemas de verano, ya que UTC no los tiene.
fuente
DateTimeyTimeSpanalmacena sus valores con mayor precisión que milisegundos completos. 0,79 ms = 7900 tics. Si necesita un número entero, puede usarlong ms = myTimeSpan.TotalTicks / 10000;.DateTime.UnixEpochlugar de declarar la fecha.DateTime(mira la nota en el contrato deToUniversalTime) está en la hora local, lo que podría no serlo. Por ejemplo, es común muestrear el tiempo conDateTime.UtcNowo podría ser en otra zona horaria.En C #, puedes escribir
(long)(date - new DateTime(1970, 1, 1)).TotalMillisecondsfuente
longlugar deint:)new DateTime(1970, 1, 1).AddMilliseconds(myDateAsALong);Si quieres ir al otro lado.AddMilliseconds()espera un parámetro de tipodouble. Una conversión implícita se encarga de eso, pero vale la pena señalarlo.int.MaxValueen milisegundos es aproximadamente 25 días. Es poco probable que sea útil.A partir de .NET 4.6, puede usar un
DateTimeOffsetobjeto para obtener los milisegundos de Unix. Tiene un constructor que toma unDateTimeobjeto, por lo que puede pasar su objeto como se muestra a continuación.DateTime yourDateTime; long yourDateTimeMilliseconds = new DateTimeOffset(yourDateTime).ToUnixTimeMilliseconds();Como se indica en otras respuestas, asegúrese de
yourDateTimetener laKindespecificación correcta o utilice.ToUniversalTime()para convertirla a la hora UTC primero.Aquí puede obtener más información sobre
DateTimeOffset.fuente
ToUnixTimeMilliseconds()está disponible desde .NET 4.6.Nowno se aplica directamente a esta pregunta.SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000Esto no le da una precisión total, pero
DATEDIFF(MS...provoca un desbordamiento. Si los segundos son lo suficientemente buenos, esto debería ser suficiente.fuente
Esta otra solución para la fecha y hora encubierta para unixtimestampmillis C #.
private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long GetCurrentUnixTimestampMillis() { DateTime localDateTime, univDateTime; localDateTime = DateTime.Now; univDateTime = localDateTime.ToUniversalTime(); return (long)(univDateTime - UnixEpoch).TotalMilliseconds; }fuente
Usando la respuesta de Andoma, esto es lo que estoy haciendo
Puedes crear una estructura o una clase como esta
struct Date { public static double GetTime(DateTime dateTime) { return dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; } public static DateTime DateTimeParse(double milliseconds) { return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(milliseconds).ToLocalTime(); } }Y puede usar esto en su código de la siguiente manera
DateTime dateTime = DateTime.Now; double total = Date.GetTime(dateTime); dateTime = Date.DateTimeParse(total);Espero que esto te ayude
fuente
Hay
ToUnixTime()yToUnixTimeMs()métodos en la clase DateTimeExtensionsDateTime.UtcNow.ToUnixTimeMs()fuente