using Core.Annotations; namespace Core.Utils; [Injectable(InjectionType.Singleton)] public class TimeUtil { public const int OneHourAsSeconds = 3600; /// /// Formats the time part of a date as a UTC string. /// /// The date to format in UTC. /// The formatted time as 'HH-MM-SS'. public string FormatTime(DateTime dateTime) { var hour = Pad(dateTime.ToUniversalTime().Hour); var minute = Pad(dateTime.ToUniversalTime().Minute); var second = Pad(dateTime.ToUniversalTime().Second); return $"{hour}-{minute}-{second}"; } /// /// Formats the date part of a date as a UTC string. /// /// The date to format in UTC. /// The formatted date as 'YYYY-MM-DD'. public string FormatDate(DateTime dateTime) { var day = Pad(dateTime.ToUniversalTime().Day); var month = Pad(dateTime.ToUniversalTime().Month); var year = Pad(dateTime.ToUniversalTime().Year); return $"{year}-{month}-{day}"; } /// /// Gets the current date as a formatted UTC string. /// /// The current date as 'YYYY-MM-DD'. public string GetDate() { return FormatDate(DateTime.Now); } /// /// Gets the current time as a formatted UTC string. /// /// The current time as 'HH-MM-SS'. public string GetTime() { return FormatTime(DateTime.Now); } /// /// Gets the current timestamp in seconds in UTC. /// /// The current timestamp in seconds since the Unix epoch in UTC. public long GetTimeStamp() { return DateTimeOffset.Now.ToUnixTimeSeconds(); } /// /// Gets the start of day timestamp for the given date /// /// datetime to get the time stamp for, if null it uses current date. /// Unix epoch for the start of day of the calculated date public long GetStartOfDayTimeStamp(DateTime? dateTime) { var now = dateTime ?? DateTime.Now; return new DateTimeOffset(new DateTime(now.Year, now.Month, now.Day, 0, 0, 0)) .ToUnixTimeSeconds(); } /// /// Get timestamp of today + passed in day count /// /// Days from now /// public long GetTimeStampFromNowDays(int daysFromNow) { return DateTimeOffset.Now.AddDays(daysFromNow).ToUnixTimeSeconds(); } /// /// Get timestamp of today + passed in hour count /// /// /// public long GetTimeStampFromNowHours(int hoursFromNow) { return DateTimeOffset.Now.AddHours(hoursFromNow).ToUnixTimeSeconds(); } /// /// Gets the current time in UTC in a format suitable for mail in EFT. /// /// The current time as 'HH:MM' in UTC. public string GetTimeMailFormat() { return DateTime.UtcNow.ToString("HH:mm"); } /// /// Gets the current date in UTC in a format suitable for emails in EFT. /// /// The current date as 'DD.MM.YYYY' in UTC. public string GetDateMailFormat() { return DateTime.UtcNow.ToString("dd.MM.yyyy"); } /// /// Converts a number of hours into seconds. /// /// The number of hours to convert. /// The equivalent number of seconds. public int GetHoursAsSeconds(int hours) { return OneHourAsSeconds * hours; } /// /// Gets the time stamp of the start of the next hour in UTC /// /// Time stamp of the next hour in unix time seconds public long GetTimeStampOfNextHour() { var now = DateTime.UtcNow; var nextHour = new DateTime( now.Year, now.Month, now.Day, now.Hour, 0, 0, DateTimeKind.Utc ).AddHours(1); return new DateTimeOffset(nextHour).ToUnixTimeSeconds(); } /// /// Returns the current days timestamp at 00:00 /// e.g. current time: 13th March 14:22 will return 13th March 00:00 /// /// Timestamp public long GetTodayMidNightTimeStamp() { var now = DateTime.UtcNow; var midNight = new DateTime( now.Year, now.Month, now.Day, 0, 0, 0, DateTimeKind.Utc ); return new DateTimeOffset(midNight).ToUnixTimeSeconds(); } /// /// Pads a number with a leading zero if it is less than 10. /// /// The number to pad. /// The padded number as a string. private static string Pad(int number) { return number.ToString().PadLeft(2, '0'); } }