2012-01-19 18 views
7

Deseo poder redondear cualquier Instantáneo al Período más cercano al agrupación de datos de soporte.Cómo redondeo un DateTime al Período más cercano

es decir, alguien podría querer grupo por 2 períodos de una semana, por lo que da un instantánea, quiero ser capaz de elaborar el instante más cercano (antes o después) en el período límite donde "ahora" se considera que es el final del período actual. Si hoy es martes, entonces considere que este 2 período de semana finaliza esta semana. Dada cualquier fecha (de ahora en adelante) me gustaría me gusta calcular el "Período de 2 semanas" que encaja.

// pseudo code 

Period sevenDays = Days.SEVEN; 

Instant nearestWeek = sevenDays.roundToNearest(new DateTime()); 

Period twelveHours = Hours.hours(12); 

Instant nearestHalfDay = twelveHours.roundToNearest(new DateTime()); 

Espero que tenga sentido, cualquier ayuda o consejos muy apreciados.

Respuesta

8

Ok, esta es una solución que hice yo mismo, pero realmente creo que esta funcionalidad debería estar integrada en Joda Time.

public static DateTime dateTimeFloor(DateTime dt, Period p) { 
    if (p.getYears() != 0) { 
     return dt.yearOfEra().roundFloorCopy().minusYears(dt.getYearOfEra() % p.getYears()); 
    } else if (p.getMonths() != 0) { 
     return dt.monthOfYear().roundFloorCopy().minusMonths((dt.getMonthOfYear() - 1) % p.getMonths()); 
    } else if (p.getWeeks() != 0) { 
     return dt.weekOfWeekyear().roundFloorCopy().minusWeeks((dt.getWeekOfWeekyear() - 1) % p.getWeeks()); 
    } else if (p.getDays() != 0) { 
     return dt.dayOfMonth().roundFloorCopy().minusDays((dt.getDayOfMonth() - 1) % p.getDays()); 
    } else if (p.getHours() != 0) { 
     return dt.hourOfDay().roundFloorCopy().minusHours(dt.getHourOfDay() % p.getHours()); 
    } else if (p.getMinutes() != 0) { 
     return dt.minuteOfHour().roundFloorCopy().minusMinutes(dt.getMinuteOfHour() % p.getMinutes()); 
    } else if (p.getSeconds() != 0) { 
     return dt.secondOfMinute().roundFloorCopy().minusSeconds(dt.getSecondOfMinute() % p.getSeconds()); 
    } 
    return dt.millisOfSecond().roundCeilingCopy().minusMillis(dt.getMillisOfSecond() % p.getMillis()); 
} 
+0

Agradable, pero esto solo funciona siempre que se use exactamente un campo del período. Por ejemplo, un período de 1m30s se redondeará al minuto más cercano. – Henning

Cuestiones relacionadas