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 DateTime
variable en C #. ¿Es posible obtener una representación en milisegundos de esto?
Gracias,
Teja.
c#
sql-server
datetime
Tejaswi Yerukalapudi
fuente
fuente
(now - Epoch).TotalMilliseconds
dóndenow
yEpoch
son 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) ).TotalMilliseconds
Esto también evita problemas de verano, ya que UTC no los tiene.
fuente
DateTime
yTimeSpan
almacena 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.UnixEpoch
lugar 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.UtcNow
o podría ser en otra zona horaria.En C #, puedes escribir
(long)(date - new DateTime(1970, 1, 1)).TotalMilliseconds
fuente
long
lugar 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.MaxValue
en milisegundos es aproximadamente 25 días. Es poco probable que sea útil.A partir de .NET 4.6, puede usar un
DateTimeOffset
objeto para obtener los milisegundos de Unix. Tiene un constructor que toma unDateTime
objeto, 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
yourDateTime
tener laKind
especificació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.Now
no se aplica directamente a esta pregunta.SELECT CAST(DATEDIFF(S, '1970-01-01', SYSDATETIME()) AS BIGINT) * 1000
Esto 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