viaja vació simbolo recorre qué nanosegundo milisegundo luz kilosegundos distancia cuanto c# .net datetime clr timestamp

c# - simbolo - qué distancia recorre la luz en un nanosegundo en el vació



¿Hay un objeto DateTime de alta resolución(microsegundo, nanosegundo) disponible para el CLR? (6)

Tengo un instrumento que almacena marcas de tiempo en el nivel de microsegundos, y necesito almacenar esas marcas de tiempo como parte de la recopilación de información del instrumento. Tenga en cuenta que no necesito generar marcas de tiempo ; estas marcas de tiempo son generadas previamente por el propio instrumento utilizando un sistema operativo de alta resolución en tiempo real. Analizar estos valores no es un problema, se almacenan utilizando un formato estándar en tiempo UTC. Originalmente quería usar la estructura C # DateTime, solo puedo almacenar sellos de tiempo con una resolución de milisegundos.

¿Hay algún otro objeto suministrado con .NET o una biblioteca común de C # que admita marcas de tiempo de resolución de micro y (idealmente) nanosegundos, o voy a tener que rodar la mía?


Al observar las respuestas y la propiedad DateTime.Ticks, es posible calcular microsegundos y nanosegundos a partir de los valores dados. Como resultado, armé esta clase de método de extensión para hacerlo. (Lamentablemente, no creo que pueda usarlo debido a otros requisitos, pero a otras personas les puede resultar útil).

/// <summary> /// Extension methods for accessing Microseconds and Nanoseconds of a /// DateTime object. /// </summary> public static class DateTimeExtensionMethods { /// <summary> /// The number of ticks per microsecond. /// </summary> public const int TicksPerMicrosecond = 10; /// <summary> /// The number of ticks per Nanosecond. /// </summary> public const int NanosecondsPerTick = 100; /// <summary> /// Gets the microsecond fraction of a DateTime. /// </summary> /// <param name="self"></param> /// <returns></returns> public static int Microseconds(this DateTime self) { return (int)Math.Floor( (self.Ticks % TimeSpan.TicksPerMillisecond ) / (double)TicksPerMicrosecond); } /// <summary> /// Gets the Nanosecond fraction of a DateTime. Note that the DateTime /// object can only store nanoseconds at resolution of 100 nanoseconds. /// </summary> /// <param name="self">The DateTime object.</param> /// <returns>the number of Nanoseconds.</returns> public static int Nanoseconds(this DateTime self) { return (int)(self.Ticks % TimeSpan.TicksPerMillisecond % TicksPerMicrosecond) * NanosecondsPerTick; } /// <summary> /// Adds a number of microseconds to this DateTime object. /// </summary> /// <param name="self">The DateTime object.</param> /// <param name="microseconds">The number of milliseconds to add.</param> public static DateTime AddMicroseconds(this DateTime self, int microseconds) { return self.AddTicks(microseconds * TicksPerMicrosecond); } /// <summary> /// Adds a number of nanoseconds to this DateTime object. Note: this /// object only stores nanoseconds of resolutions of 100 seconds. /// Any nanoseconds passed in lower than that will be rounded using /// the default rounding algorithm in Math.Round(). /// </summary> /// <param name="self">The DateTime object.</param> /// <param name="nanoseconds">The number of nanoseconds to add.</param> public static DateTime AddNanoseconds(this DateTime self, int nanoseconds) { return self.AddTicks((int)Math.Round(nanoseconds / (double)NanosecondsPerTick)); } }

Esto aún no le permitirá configurar los microsegundos o los nanosegundos en la creación, pero se pueden agregar poco después. Tampoco da una resolución mejor que lo que puede hacer un DateTime (por ejemplo, 1/10 de un microsegundo, también conocido como resolución de 100 nanosegundos).

DateTime time = new DateTime(year, month, day, hour, min, sec, msec); time = time.AddMicroseconds(microseconds); time = time.AddNanoseconds(nanoseconds); # note: rounds if not enough added

¡Espero que esto funcione para alguien más!


Estoy luchando con este mismo problema, ya que tengo un proyecto donde tengo marcas de tiempo de resolución de picosegundos. Mis datos de origen están en formato "time_t", es decir, segundo desde epoch + picoseconds + UTC Offset.

La mejor solución que he encontrado es trabajar con "segundos decimales desde la época en UTC" como mi formato de hora internamente, y solo usar DateTime como un objeto de impresión bonito, para extraer la configuración regional / formato hasta 1 s de resolución, y luego manipular manualmente cadena para incluir segundos fraccionarios.


Probablemente puedas rodar el tuyo de varias maneras.

1.) Cree una estructura usando el campo System.Decimal como el "almacén de respaldo".

2.) Cree una estructura usando System.Numerics.BigInteger como respaldo.

Ajustar los métodos para usar System.DateTime para las "Partes" convenientes (año, mes, día, ...) Incluya sus propios nanonsegundos , picosegundos , femtosegundos , etc., propiedades y métodos.

Para tu información:

DateTime.MaxValue.Ticks: 3,155,378,975,999,999,999

Valor decimal.Max: 79,228,162,514,264,337,593,543,950,335

BigInteger: ¡Arbitrariamente grande!


Si desea algo que funcione en fracciones significativas de un microsegundo, entonces No. Lo que está pidiendo no existe como parte de las bibliotecas estándar, pero para lo que está preguntando, ¿por qué necesita esto? Parece que realmente necesita dos componentes, una cadena (longitud variable, casi cualquier valor concebible) y un DateTime para la fecha / hora con formato estándar UTC que obtiene de forma nativa.

El segundo cronometraje de micro / nano escala no está en el rango "normal" de cómputos, por lo que no se proporciona en las bibliotecas .NET "normales".

¿Qué vas a hacer con estas marcas de tiempo? ¿Los compararás? ¿Sumarlos / restarlos? Yo sugeriría ejecutar el reflector para el objeto DateTime básico (en realidad creo que también lo voy a hacer muy rápido)

Para su beneficio, aquí está la versión simple del desensamblaje del Reflector .NET del objeto DateTime estándar (y como la otra respuesta en el momento de esta edición sugiere el elemento TimeSpan, eso también)

[Serializable] public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime> { // Fields private ulong dateData; private const string DateDataField = "dateData"; private const int DatePartDay = 3; private const int DatePartDayOfYear = 1; private const int DatePartMonth = 2; private const int DatePartYear = 0; private const int DaysPer100Years = 0x8eac; private const int DaysPer400Years = 0x23ab1; private const int DaysPer4Years = 0x5b5; private const int DaysPerYear = 0x16d; private const int DaysTo10000 = 0x37b9db; private const int DaysTo1601 = 0x8eac4; private const int DaysTo1899 = 0xa9559; private static readonly int[] DaysToMonth365; private static readonly int[] DaysToMonth366; private const long DoubleDateOffset = 0x85103c0cb83c000L; private const long FileTimeOffset = 0x701ce1722770000L; private const ulong FlagsMask = 13835058055282163712L; private const ulong KindLocal = 9223372036854775808L; private const ulong KindLocalAmbiguousDst = 13835058055282163712L; private const int KindShift = 0x3e; private const ulong KindUnspecified = 0L; private const ulong KindUtc = 0x4000000000000000L; private const ulong LocalMask = 9223372036854775808L; private const long MaxMillis = 0x11efae44cb400L; internal const long MaxTicks = 0x2bca2875f4373fffL; public static readonly DateTime MaxValue; private const int MillisPerDay = 0x5265c00; private const int MillisPerHour = 0x36ee80; private const int MillisPerMinute = 0xea60; private const int MillisPerSecond = 0x3e8; internal const long MinTicks = 0L; public static readonly DateTime MinValue; private const double OADateMaxAsDouble = 2958466.0; private const double OADateMinAsDouble = -657435.0; private const long OADateMinAsTicks = 0x6efdddaec64000L; private const long TicksCeiling = 0x4000000000000000L; private const string TicksField = "ticks"; private const ulong TicksMask = 0x3fffffffffffffffL; private const long TicksPerDay = 0xc92a69c000L; private const long TicksPerHour = 0x861c46800L; private const long TicksPerMillisecond = 0x2710L; private const long TicksPerMinute = 0x23c34600L; private const long TicksPerSecond = 0x989680L; // Methods static DateTime(); public DateTime(long ticks); private DateTime(ulong dateData); public DateTime(long ticks, DateTimeKind kind); private DateTime(SerializationInfo info, StreamingContext context); public DateTime(int year, int month, int day); internal DateTime(long ticks, DateTimeKind kind, bool isAmbiguousDst); public DateTime(int year, int month, int day, Calendar calendar); public DateTime(int year, int month, int day, int hour, int minute, int second); public DateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind); public DateTime(int year, int month, int day, int hour, int minute, int second, Calendar calendar); public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond); public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, DateTimeKind kind); public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar); public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar, DateTimeKind kind); public DateTime Add(TimeSpan value); private DateTime Add(double value, int scale); public DateTime AddDays(double value); public DateTime AddHours(double value); public DateTime AddMilliseconds(double value); public DateTime AddMinutes(double value); public DateTime AddMonths(int months); public DateTime AddSeconds(double value); public DateTime AddTicks(long value); public DateTime AddYears(int value); public static int Compare(DateTime t1, DateTime t2); public int CompareTo(DateTime value); public int CompareTo(object value); private static long DateToTicks(int year, int month, int day); public static int DaysInMonth(int year, int month); internal static long DoubleDateToTicks(double value); public bool Equals(DateTime value); public override bool Equals(object value); public static bool Equals(DateTime t1, DateTime t2); public static DateTime FromBinary(long dateData); internal static DateTime FromBinaryRaw(long dateData); public static DateTime FromFileTime(long fileTime); public static DateTime FromFileTimeUtc(long fileTime); public static DateTime FromOADate(double d); private int GetDatePart(int part); public string[] GetDateTimeFormats(); public string[] GetDateTimeFormats(char format); public string[] GetDateTimeFormats(IFormatProvider provider); public string[] GetDateTimeFormats(char format, IFormatProvider provider); public override int GetHashCode(); [MethodImpl(MethodImplOptions.InternalCall)] internal static extern long GetSystemTimeAsFileTime(); public TypeCode GetTypeCode(); internal bool IsAmbiguousDaylightSavingTime(); public bool IsDaylightSavingTime(); public static bool IsLeapYear(int year); public static DateTime operator +(DateTime d, TimeSpan t); public static bool operator ==(DateTime d1, DateTime d2); public static bool operator >(DateTime t1, DateTime t2); public static bool operator >=(DateTime t1, DateTime t2); public static bool operator !=(DateTime d1, DateTime d2); public static bool operator <(DateTime t1, DateTime t2); public static bool operator <=(DateTime t1, DateTime t2); public static TimeSpan operator -(DateTime d1, DateTime d2); public static DateTime operator -(DateTime d, TimeSpan t); public static DateTime Parse(string s); public static DateTime Parse(string s, IFormatProvider provider); public static DateTime Parse(string s, IFormatProvider provider, DateTimeStyles styles); public static DateTime ParseExact(string s, string format, IFormatProvider provider); public static DateTime ParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style); public static DateTime ParseExact(string s, string[] formats, IFormatProvider provider, DateTimeStyles style); public static DateTime SpecifyKind(DateTime value, DateTimeKind kind); public TimeSpan Subtract(DateTime value); public DateTime Subtract(TimeSpan value); bool IConvertible.ToBoolean(IFormatProvider provider); byte IConvertible.ToByte(IFormatProvider provider); char IConvertible.ToChar(IFormatProvider provider); DateTime IConvertible.ToDateTime(IFormatProvider provider); decimal IConvertible.ToDecimal(IFormatProvider provider); double IConvertible.ToDouble(IFormatProvider provider); short IConvertible.ToInt16(IFormatProvider provider); int IConvertible.ToInt32(IFormatProvider provider); long IConvertible.ToInt64(IFormatProvider provider); sbyte IConvertible.ToSByte(IFormatProvider provider); float IConvertible.ToSingle(IFormatProvider provider); object IConvertible.ToType(Type type, IFormatProvider provider); ushort IConvertible.ToUInt16(IFormatProvider provider); uint IConvertible.ToUInt32(IFormatProvider provider); ulong IConvertible.ToUInt64(IFormatProvider provider); [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context); private static double TicksToOADate(long value); private static long TimeToTicks(int hour, int minute, int second); public long ToBinary(); internal long ToBinaryRaw(); public long ToFileTime(); public long ToFileTimeUtc(); public DateTime ToLocalTime(); public string ToLongDateString(); public string ToLongTimeString(); public double ToOADate(); public string ToShortDateString(); public string ToShortTimeString(); public override string ToString(); public string ToString(IFormatProvider provider); public string ToString(string format); public string ToString(string format, IFormatProvider provider); public DateTime ToUniversalTime(); internal static bool TryCreate(int year, int month, int day, int hour, int minute, int second, int millisecond, out DateTime result); public static bool TryParse(string s, out DateTime result); public static bool TryParse(string s, IFormatProvider provider, DateTimeStyles styles, out DateTime result); public static bool TryParseExact(string s, string[] formats, IFormatProvider provider, DateTimeStyles style, out DateTime result); public static bool TryParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style, out DateTime result); // Properties public DateTime Date { get; } public int Day { get; } public DayOfWeek DayOfWeek { get; } public int DayOfYear { get; } public int Hour { get; } private ulong InternalKind { get; } private long InternalTicks { get; } public DateTimeKind Kind { get; } public int Millisecond { get; } public int Minute { get; } public int Month { get; } public static DateTime Now { get; } public int Second { get; } public long Ticks { get; } public TimeSpan TimeOfDay { get; } public static DateTime Today { get; } public static DateTime UtcNow { get; } public int Year { get; } } [Serializable, StructLayout(LayoutKind.Sequential), ComVisible(true)] public struct TimeSpan : IComparable, IComparable<TimeSpan>, IEquatable<TimeSpan> { public const long TicksPerMillisecond = 0x2710L; private const double MillisecondsPerTick = 0.0001; public const long TicksPerSecond = 0x989680L; private const double SecondsPerTick = 1E-07; public const long TicksPerMinute = 0x23c34600L; private const double MinutesPerTick = 1.6666666666666667E-09; public const long TicksPerHour = 0x861c46800L; private const double HoursPerTick = 2.7777777777777777E-11; public const long TicksPerDay = 0xc92a69c000L; private const double DaysPerTick = 1.1574074074074074E-12; private const int MillisPerSecond = 0x3e8; private const int MillisPerMinute = 0xea60; private const int MillisPerHour = 0x36ee80; private const int MillisPerDay = 0x5265c00; private const long MaxSeconds = 0xd6bf94d5e5L; private const long MinSeconds = -922337203685L; private const long MaxMilliSeconds = 0x346dc5d638865L; private const long MinMilliSeconds = -922337203685477L; public static readonly TimeSpan Zero; public static readonly TimeSpan MaxValue; public static readonly TimeSpan MinValue; internal long _ticks; public TimeSpan(long ticks); public TimeSpan(int hours, int minutes, int seconds); public TimeSpan(int days, int hours, int minutes, int seconds); public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds); public long Ticks { get; } public int Days { get; } public int Hours { get; } public int Milliseconds { get; } public int Minutes { get; } public int Seconds { get; } public double TotalDays { get; } public double TotalHours { get; } public double TotalMilliseconds { get; } public double TotalMinutes { get; } public double TotalSeconds { get; } public TimeSpan Add(TimeSpan ts); public static int Compare(TimeSpan t1, TimeSpan t2); public int CompareTo(object value); public int CompareTo(TimeSpan value); public static TimeSpan FromDays(double value); public TimeSpan Duration(); public override bool Equals(object value); public bool Equals(TimeSpan obj); public static bool Equals(TimeSpan t1, TimeSpan t2); public override int GetHashCode(); public static TimeSpan FromHours(double value); private static TimeSpan Interval(double value, int scale); public static TimeSpan FromMilliseconds(double value); public static TimeSpan FromMinutes(double value); public TimeSpan Negate(); public static TimeSpan Parse(string s); public static bool TryParse(string s, out TimeSpan result); public static TimeSpan FromSeconds(double value); public TimeSpan Subtract(TimeSpan ts); public static TimeSpan FromTicks(long value); internal static long TimeToTicks(int hour, int minute, int second); private string IntToString(int n, int digits); public override string ToString(); public static TimeSpan operator -(TimeSpan t); public static TimeSpan operator -(TimeSpan t1, TimeSpan t2); public static TimeSpan operator +(TimeSpan t); public static TimeSpan operator +(TimeSpan t1, TimeSpan t2); public static bool operator ==(TimeSpan t1, TimeSpan t2); public static bool operator !=(TimeSpan t1, TimeSpan t2); public static bool operator <(TimeSpan t1, TimeSpan t2); public static bool operator <=(TimeSpan t1, TimeSpan t2); public static bool operator >(TimeSpan t1, TimeSpan t2); public static bool operator >=(TimeSpan t1, TimeSpan t2); static TimeSpan(); // Nested Types [StructLayout(LayoutKind.Sequential)] private struct StringParser { private string str; private char ch; private int pos; private int len; private ParseError error; internal void NextChar(); internal char NextNonDigit(); internal long Parse(string s); internal bool TryParse(string s, out long value); internal bool ParseInt(int max, out int i); internal bool ParseTime(out long time); internal void SkipBlanks(); // Nested Types private enum ParseError { ArgumentNull = 4, Format = 1, Overflow = 2, OverflowHoursMinutesSeconds = 3 } } }


Si realmente necesitara más precisión que la resolución de 100 ns proporcionada por DateTime , consideraría crear una estructura que contenga un DateTime y un valor entero:

public struct HiResDateTime { public HiResDateTime(DateTime dateTime, int nanoseconds) { if (nanoSeconds < 0 || nanoSeconds > 99) throw new ArgumentOutOfRangeException(...); DateTime = dateTime; Nanoseconds = nanoseconds; } ... possibly other constructors including one that takes a timestamp parameter ... in the format provided by the instruments. public DateTime DateTime { get; private set; } public int Nanoseconds { get; private set; } ... implementation ... }

Luego implementa lo que sea necesario, por ejemplo:

  • Comparación ( DateTime primero, luego Nanoseconds )
  • ToString() por ejemplo, formatee DateTime a 100 ns de precisión y luego agregue nanosegundos.
  • Conversión a / desde DateTime
  • Agregar / restar (podría necesitar un HiResTimeSpan similar) ... etc. ...

Es posible que puedas usar DateTime después de todo. La resolución de DateTime.Ticks es de 100 nanosegundos. Puede establecer los ticks con DateTime.AddTicks .