using System.Globalization;
namespace Data_Coupler.Services;
///
/// Servizio utility per la gestione di date, orari e formattazione
/// Utilizza il formato 24h per coerenza con il sistema
///
public static class DateTimeHelper
{
///
/// Formato orario 24h standard utilizzato in tutto il sistema
///
public const string TimeFormat24H = "HH:mm";
///
/// Formato data/ora 24h completo utilizzato per il logging e la visualizzazione
///
public const string DateTimeFormat24H = "dd/MM/yyyy HH:mm:ss";
///
/// Formato data/ora 24h per i log dettagliati
///
public const string DetailedDateTimeFormat24H = "dd/MM/yyyy HH:mm:ss.fff";
///
/// Cultura italiana per la formattazione (formato 24h di default)
///
public static readonly CultureInfo ItalianCulture = new("it-IT");
///
/// Converte un TimeSpan in stringa formato 24h (HH:mm)
///
public static string FormatTime24H(TimeSpan time)
{
return time.ToString(TimeFormat24H);
}
///
/// Converte un DateTime in stringa formato 24h (dd/MM/yyyy HH:mm:ss)
///
public static string FormatDateTime24H(DateTime dateTime)
{
return dateTime.ToString(DateTimeFormat24H, ItalianCulture);
}
///
/// Converte un DateTime in stringa formato 24h dettagliato con millisecondi
///
public static string FormatDateTimeDetailed24H(DateTime dateTime)
{
return dateTime.ToString(DetailedDateTimeFormat24H, ItalianCulture);
}
///
/// Prova a parsare una stringa orario in formato 24h
///
public static bool TryParseTime24H(string? timeString, out TimeSpan time)
{
time = default;
if (string.IsNullOrWhiteSpace(timeString))
{
return false;
}
return TimeSpan.TryParseExact(timeString.Trim(), TimeFormat24H, ItalianCulture, out time);
}
///
/// Prova a parsare una stringa data/ora in formato 24h
///
public static bool TryParseDateTime24H(string? dateTimeString, out DateTime dateTime)
{
dateTime = default;
if (string.IsNullOrWhiteSpace(dateTimeString))
{
return false;
}
return DateTime.TryParseExact(dateTimeString.Trim(), DateTimeFormat24H, ItalianCulture, DateTimeStyles.None, out dateTime);
}
///
/// Ottiene l'ora corrente locale formattata in 24h
///
public static string GetCurrentTime24H()
{
return FormatTime24H(DateTime.Now.TimeOfDay);
}
///
/// Ottiene la data/ora corrente locale formattata in 24h
///
public static string GetCurrentDateTime24H()
{
return FormatDateTime24H(DateTime.Now);
}
///
/// Valida se una stringa rappresenta un orario valido nel formato 24h
///
public static bool IsValidTime24H(string? timeString)
{
return TryParseTime24H(timeString, out _);
}
///
/// Valida se una stringa rappresenta una data/ora valida nel formato 24h
///
public static bool IsValidDateTime24H(string? dateTimeString)
{
return TryParseDateTime24H(dateTimeString, out _);
}
///
/// Converte un orario dal formato 12h al formato 24h se necessario
///
public static string? ConvertTo24H(string? timeString)
{
if (string.IsNullOrWhiteSpace(timeString))
{
return timeString;
}
// Se è già in formato 24h, restituisci così com'è
if (TryParseTime24H(timeString, out var time24))
{
return FormatTime24H(time24);
}
// Prova a parsare dal formato 12h
if (DateTime.TryParse(timeString.Trim(), ItalianCulture, DateTimeStyles.None, out var parsed))
{
return FormatTime24H(parsed.TimeOfDay);
}
return null; // Formato non riconosciuto
}
///
/// Calcola il tempo rimanente fino al prossimo orario schedulato
///
public static TimeSpan TimeUntilNextSchedule(TimeSpan scheduledTime, DateTime? referenceTime = null)
{
var now = referenceTime ?? DateTime.Now;
var currentTime = now.TimeOfDay;
// Se l'orario programmato è già passato oggi, programma per domani
if (currentTime > scheduledTime)
{
var tomorrow = now.Date.AddDays(1);
var nextExecution = tomorrow.Add(scheduledTime);
return nextExecution - now;
}
else
{
var today = now.Date;
var nextExecution = today.Add(scheduledTime);
return nextExecution - now;
}
}
///
/// Ottiene il nome del giorno della settimana in italiano
///
public static string GetDayOfWeekName(DayOfWeek dayOfWeek)
{
return dayOfWeek switch
{
DayOfWeek.Sunday => "Domenica",
DayOfWeek.Monday => "Lunedì",
DayOfWeek.Tuesday => "Martedì",
DayOfWeek.Wednesday => "Mercoledì",
DayOfWeek.Thursday => "Giovedì",
DayOfWeek.Friday => "Venerdì",
DayOfWeek.Saturday => "Sabato",
_ => dayOfWeek.ToString()
};
}
///
/// Ottiene il nome del giorno della settimana in italiano tramite indice (0=Domenica)
///
public static string GetDayOfWeekName(int dayOfWeekIndex)
{
if (dayOfWeekIndex < 0 || dayOfWeekIndex > 6)
{
return "Non valido";
}
return GetDayOfWeekName((DayOfWeek)dayOfWeekIndex);
}
}