Per esempio:Esiste una semplice funzione per arrotondare un DateTime ai 30 minuti più vicini, in C#?
2011-08-11 16:59 2011-08-11 16:30 diventa
Per esempio:Esiste una semplice funzione per arrotondare un DateTime ai 30 minuti più vicini, in C#?
2011-08-11 16:59 2011-08-11 16:30 diventa
vorrei dire una cosa del genere
var time = DateTime.Now;
var rounded = time.AddMinutes(
time.Minute>30 ? -(time.Minute-30) : -time.Minute)
E si potrebbe anche fare la propria estensione
public static class TimeHelper {
public static DateTime RoundDown (this DateTime time)
{
return time.AddMinutes(
time.Minute>30 ? -(time.Minute-30) : -time.Minute);
}
}
EDIT
Questa funzione taglia anche i secondi/millisecondi se necessario. Grazie per il suggerimento.
public static DateTime RoundDown(this DateTime time)
{
return time.Subtract(
new TimeSpan(0, 0, time.Minute > 30 ? (time.Minute - 30) : time.Minute,
time.Second, time.Millisecond));
}
+1 Una soluzione che non rilascia il valore 'DateTime.Kind' :) –
Come scritto, 'Minuti' non viene compilato - non esiste una proprietà 'Minuti' nel tipo' DateTime'. Passando a "Minuto" viene compilato, ma poiché la proprietà 'Minuto' è un' int' i secondi rimarranno nel risultato arrotondato piuttosto che troncare sull'intero contrassegno del minuto come l'OP desidera. – devgeezer
Thx per il devgeezer di suggerimento. Ho aggiornato la mia risposta. – BitKFu
DateTime newDateTime = new DateTime(oldDateTime.Year, oldDateTime.Month, oldDateTime.Day
,oldDateTime.Hour, (oldDateTime.Minute/30) * 30, 0);
Non esiste una funzione disponibile
È possibile fare riferimento a: How can I round up the time to the nearest X minutes?
, se necessario, è possibile creare uno voi stessi
DateTime RoundUp(DateTime dt, TimeSpan d)
{
return new DateTime(((dt.Ticks - d.Ticks + 1)/d.Ticks) * d.Ticks + d.Ticks);
}
esempio:
var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30));
// dt1 == {11/08/2011 16:30:00}
triste ma il suo più vicino 30 min è '16: 30' – V4Vendetta
@ V4Vendetta il mio male. riparato ora. – Thakur
DateTime RoundDown(DateTime dt, TimeSpan d)
{
return new DateTime((dt.Ticks/d.Ticks) * d.Ticks);
}
Esempio:
var dt1 = RoundDown(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30));
// dt1 == {11/08/2011 16:30:00}
var dt2 = RoundDown(DateTime.Parse("2011-08-11 17:00"), TimeSpan.FromMinutes(30));
// dt2 == {11/08/2011 17:00:00}
var dt3 = RoundDown(DateTime.Parse("2011-08-11 17:01"), TimeSpan.FromMinutes(30));
// dt3 == {11/08/2011 17:00:00}
Grazie! Vedi qualche problema di arrotondamento con questo? Sto provando a RoundDown al minuto più vicino e sto casualmente ottenendo due risposte differenti per lo stesso intervallo. – Legend
Sfruttando po 'di matematica
var input = DateTime.Now; // or however you get DateTime
var rounded = input.AddMinutes(-input.TimeOfDay.TotalMinutes % 30d);
Nota che TimeOfDay
è una sua proprietà TimeSpan
e TotalMinutes
è un double
e che le funzioni operatore modulo su doppie come segue:
47.51% 30d == 17.51
16,2% 30d == 16,2
768,7% 30d == 18,7
Si potrebbe cambiare il 30d per qualsiasi valore come diverso da zero. Cambiando a 15 giri ad intervalli di 15 minuti, ad esempio. Il passaggio da 30d a -30d non ha modificato i risultati dei test eseguiti.
si potrebbe creare un metodo di estensione di arrotondamento (che fornisce questo metodo di arrotondamento per tutti i valori DateTime):
public static class DateTimeExtensions
{
public static DateTime Round(this DateTime self, double minutesInInterval)
{
if (minutesInInterval == 0d) throw new ArgumentOutOfRangeException("minutesInInterval");
return self.AddMinutes(-self.TimeOfDay.TotalMinutes % minutesInInterval);
}
}
Una soluzione più generica arrotondamento per l'arco di tempo più vicino:
public static DateTime RoundUp(this DateTime dt, TimeSpan d)
{
var delta = (d.Ticks - (dt.Ticks % d.Ticks)) % d.Ticks;
return new DateTime(dt.Ticks + delta);
}
public static DateTime RoundDown(this DateTime dt, TimeSpan d)
{
var delta = dt.Ticks % d.Ticks;
return new DateTime(dt.Ticks - delta);
}
public static DateTime RoundToNearest(this DateTime dt, TimeSpan d)
{
var delta = dt.Ticks % d.Ticks;
bool roundUp = delta > d.Ticks/2;
return roundUp ? dt.RoundUp(d) : dt.RoundDown(d);
}
Sarebbe utilizzato in questo modo:
var date = new DateTime(2010, 02, 05, 10, 35, 25, 450); // 2010/02/05 10:35:25
var rounded = date.RoundToNearest(TimeSpan.FromMinutes(30)); // 2010/02/05 10:30:00
Altro in this response.
Ecco come l'ho gestito. Di seguito è riportato il metodo di base e un sovraccarico da arrotondare ai 30 minuti più vicini:
public static DateTime RoundMinutes(this DateTime value)
{
return RoundMinutes(value, 30);
}
public static DateTime RoundMinutes(this DateTime value, int roundMinutes)
{
DateTime result = new DateTime(value.Ticks);
int minutes = value.Minute;
int hour = value.Hour;
int minuteMod = minutes % roundMinutes;
if (minuteMod <= (roundMinutes/2))
{
result = result.AddMinutes(-minuteMod);
}
else
{
result = result.AddMinutes(roundMinutes - minuteMod);
}
return result;
}
Non esiste alcuna funzione di questo tipo nelle librerie della classe base. –
Nessuna funzione disponibile È possibile fare riferimento a: [http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes][1] [1]: http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes – Thakur
http://stackoverflow.com/questions/ 1393696/c-sharp-rounding-datetime-objects – Chris