PDA

View Full Version : C# confronto datetime


karmo
10-11-2011, 09:06
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?

gugoXX
10-11-2011, 09:18
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?

karmo
10-11-2011, 09:25
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

karmo
10-11-2011, 09:31
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;
}
}
}

gugoXX
10-11-2011, 09:32
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?

gugoXX
10-11-2011, 14:10
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.