using System; using System.Text; namespace rockfishCore.Util { public static class DateUtil { public const string DATE_TIME_FORMAT = "MMMM dd, yyyy h:mm tt"; public const string DATE_ONLY_FORMAT = "D"; //Unix epoch converters public static string EpochToString(long? uepoch, string formatString = null) { if (uepoch == null) return string.Empty; if (formatString == null) formatString = DATE_ONLY_FORMAT; return DateTimeOffset.FromUnixTimeSeconds(uepoch.Value).DateTime.ToString(formatString); } public static DateTime EpochToDate(long? uepoch) { DateTime dt = DateTime.Now; if (uepoch == null) return DateTime.MinValue; return DateTimeOffset.FromUnixTimeSeconds(uepoch.Value).DateTime; } public static long DateToEpoch(DateTime dt) { DateTimeOffset dto = new DateTimeOffset(dt); return dto.ToUnixTimeSeconds(); } public static long? DateTimeOffSetNullableToEpoch(DateTimeOffset? dt) { if (dt == null) { return null; } DateTimeOffset dto = dt.Value; return dto.ToUnixTimeSeconds(); } public static string ISO8601StringToLocalDateTime(string s) { if (!string.IsNullOrWhiteSpace(s)) { return DateTimeOffset.Parse(s).DateTime.ToLocalTime().ToString(DATE_TIME_FORMAT); } return string.Empty; } public static long? ISO8601StringToEpoch(string s) { DateTimeOffset? dto = ISO8601StringToDateTimeOffset(s); if (dto == null) return null; return ((DateTimeOffset)dto).ToUnixTimeSeconds(); } /////////////////////// //This method correctly interprets iso8601 strings to a datetimeoffset public static DateTimeOffset? ISO8601StringToDateTimeOffset(string s) { if (!string.IsNullOrWhiteSpace(s)) { DateTimeOffset dto = DateTimeOffset.ParseExact(s, new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" }, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None); return dto; } return null; } public static long NowAsEpoch() { DateTimeOffset dto = new DateTimeOffset(DateTime.Now); return dto.ToUnixTimeSeconds(); } /// /// An internally consistent empty or not relevant date marker: /// January 1st 5555 /// Used for RAVEN key generation /// /// public static DateTime EmptyDateValue { get { return new DateTime(5555, 1, 1); //Was going to use MaxValue but apparently that varies depending on culture // and Postgres has issues with year 1 as it interprets as year 2001 // so to be on safe side just defining one for all usage } } //eoc } //eons }