View Full Version : C# confronto datetime
ciao a tutti
ho un piccolo problema che non saprei come risolvere, devo dare in output il "turno" corrente di lavoro.
Se ad esempio ho 2 turni (1)09:00 - 18:00 e (2)18:00-09:00 e l'ora corrente è 08:30, il sistema mi deve dare in output il 2o turno che è a cavallo tra due giorni.
Come posso fare usando il datetime?
ciao a tutti
ho un piccolo problema che non saprei come risolvere, devo dare in output il "turno" corrente di lavoro.
Se ad esempio ho 2 turni (1)09:00 - 18:00 e (2)18:00-09:00 e l'ora corrente è 08:30, il sistema mi deve dare in output il 2o turno che è a cavallo tra due giorni.
Come posso fare usando il datetime?
mmmh.
DateTime dt=DateTime.Now;
string turno;
if (dt.Hour>=9 && dt.Hour<18)
turno = "turno1";
else
turno = "turno2";
No eh?
Meglio che spieghi un po' di piu'
Kralizek
10-11-2011, 09:20
che struttura usi per il turno di lavoro?
i turni non li so a priori!! altrimenti avrei già risolto la cosa!
se faccio semplicemente
Datetime.Now() >= inizio turno e Datetime.Now() <= fineturno non basta!
perchè il 20 turno non viene gestito!
se adesso sono le 7, 7 non è maggiore di 18.
nel db ho una tabella che indica l'ora e i minuti di inizio e fine di ciascun turno.
esempio
Shift Description FromTime ToTime
DD 09:00-18:00 9.00 17.59
NN 18:00-09:00 18.00 8.59
ok risolto, come non detto! devo splittare il turno e considerare la mezzanotte.
foreach (Shift sh in GlobalVars.ShiftList)
{
string[] spl = sh.FromTime.ToString("00.00", provider).Split('.');
Int32 HourFrom = Int32.Parse(spl[0]);
Int32 MinutesFrom = Int32.Parse(spl[1]);
spl = sh.ToTime.ToString("00.00", provider).Split('.');
Int32 HourTo = Int32.Parse(spl[0]);
Int32 MinutesTo = Int32.Parse(spl[1]);
DateTime timeShiftStart = new DateTime(GetToday().Year, GetToday().Month, GetToday().Day, HourFrom, MinutesFrom, 0);
DateTime timeShiftEnd = new DateTime(GetToday().Year, GetToday().Month, GetToday().Day, HourTo, MinutesTo, 0);
DateTime timeShiftComparison = new DateTime(GetToday().Year, GetToday().Month, GetToday().Day, GetToday().Hour, GetToday().Minute, 0);
if (timeShiftComparison >= timeShiftStart && timeShiftComparison <= timeShiftEnd)
{
return sh.ShiftName;
}
if (timeShiftEnd < timeShiftStart)
{
// shift 18:00 - 09:00
// devo considerare mezzanotte!
DateTime midnight1 = new DateTime(GetToday().Year, GetToday().Month, GetToday().Day, 23, 59, 59);
// mezzanotte del giorno dopo
DateTime midnight2 = new DateTime(GetToday().Year, GetToday().Month, GetToday().Day, 0, 0, 0);
if (((timeShiftComparison.Hour >= timeShiftStart.Hour) && (timeShiftComparison.Minute >= timeShiftStart.Minute))
&&
((timeShiftComparison.Hour <= midnight1.Hour) && (timeShiftComparison.Minute <= midnight1.Minute))
)
{
return sh.ShiftName;
}
else if (((timeShiftComparison.Hour >= midnight2.Hour) && (timeShiftComparison.Minute >= midnight2.Minute))
&&
((timeShiftComparison.Hour <= timeShiftEnd.Hour) && (timeShiftComparison.Minute <= timeShiftEnd.Minute))
)
{
return sh.ShiftName;
}
}
}
i turni non li so a priori!! altrimenti avrei già risolto la cosa!
se faccio semplicemente
Datetime.Now() >= inizio turno e Datetime.Now() <= fineturno non basta!
perchè il 20 turno non viene gestito!
se adesso sono le 7, 7 non è maggiore di 18.
nel db ho una tabella che indica l'ora e i minuti di inizio e fine di ciascun turno.
esempio
Shift Description FromTime ToTime
DD 09:00-18:00 9.00 17.59
NN 18:00-09:00 18.00 8.59
Assunto: Immagino che ci sia un solo turno a cavallo di 2 giorni, e che non ci sia nemmeno un istante scoperto, ovvero i turni coprono tutte le 24h.
Se e' cosi', cerca qual e' l'unico turno a cavallo di 2 giorni.
Escludilo e tieni tutti gli altri.
Li percorri in ciclo cercando di vedere se l'ora corrente appartiene a quel particolare turno.
Se arrivi alla fine e non hai trovato allora si tratta del turno che avevi escluso, quello a cavallo.
Scrivi meta' di quello che hai scritto.
Kralizek
10-11-2011, 09:44
piú che altro...
gugoXX che classe usi per mappare una specifica ora:minuti:secondi di un generico giorno?
DateTime é uno specifico istante nel tempo.
TimeSpan é un generico intervallo di tempo.
Ma sbaglio o nella bcl manca qualcosa orientato alla gestione del tempo?
piú che altro...
gugoXX che classe usi per mappare una specifica ora:minuti:secondi di un generico giorno?
DateTime é uno specifico istante nel tempo.
TimeSpan é un generico intervallo di tempo.
Ma sbaglio o nella bcl manca qualcosa orientato alla gestione del tempo?
Ma, senza complicarsi troppo io userei una stringa HH:MM:SS
sulla quale si possono usare tutti i comparer standard e operatori come > < etc.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.