using System; namespace DTS.Common.Utilities { /// /// Public utilty class for manipulating Unix timestamps /// Primarily exposed for the SDK /// public class PTP1588Timestamps { private const int MIN_VALID_TIMESTAMP_YEAR = 1990; /// /// tests time in seconds since 1,1,1970 to (unix time) to see whether the time should be valid or not /// this is used by TestMetaDataList to control whether to show unix time or not for a dataset in a viewer /// now it's also used by the CSV export to eliminate timestamps that occur before 1990 /// this was done because of a dataset in http://manuscript.dts.local/f/cases/33199/ /// which contained an invalid timestamp /// /// time in seconds since 1970-1-1 /// true if the value is valid or not public static bool IsValidTimeStamp(double unixTimeStampSeconds) { return UnixTimeStampToDateTimeLocal(unixTimeStampSeconds).Year > MIN_VALID_TIMESTAMP_YEAR; } /// /// Returns DateTime object from Unix timestamp in seconds /// /// /// public static DateTime UnixTimeStampToDateTimeLocal(double unixTimeStampSec) { return UnixTimeStampToDateTimeLocal((decimal)unixTimeStampSec); } public static DateTime UnixTimeStampToDateTimeLocal(decimal unixTimeStampSec) { return UnitTimeStampToDateTimeLocal(unixTimeStampSec, (decimal)0); } public static DateTime UnitTimeStampToDateTimeLocal(double unixTimeStampSec, double ns) { var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds(unixTimeStampSec).AddTicks(Convert.ToInt64(ns / 100)); return dtDateTime.ToLocalTime(); } public static DateTime UnitTimeStampToDateTimeLocal(decimal unixTimeStampSec, decimal ns) { var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds(Convert.ToDouble(unixTimeStampSec)).AddTicks(Convert.ToInt64(ns / 100)); return dtDateTime.ToLocalTime(); } /// /// String representation in Unix timestamp is seconds past epoch /// public static string ToDateTimeString(double unixTimeStampSec, double ns) => ToDateTimeString((decimal)unixTimeStampSec, (decimal)ns); public static string ToDateTimeString(decimal unixTimeStampSec, decimal ns) => $"{UnixTimeStampToDateTimeLocal(unixTimeStampSec).ToUniversalTime():yyyy/MM/dd HH:mm:ss}:{ns,9:000000000}"; } }