java - una - promedio de ventas por trimestre
¿Cómo descubro el trimestre de una fecha determinada? (13)
Buenas soluciones aquí, pero recuerde que los trimestres pueden estar sujetos a cambios dependiendo de la compañía / industria también. A veces un trimestre puede ser un 3 meses diferentes.
Probablemente desee extender o encapsular la clase de calendario para personalizarla a sus tareas en lugar de escribir alguna función de utilidad que la convierta. Su aplicación probablemente sea lo suficientemente compleja en esa área que encontrará otros usos para su nueva clase de calendario. Prometo que se alegrará de haberla extendido o encapsulado, aunque parezca tonto ahora.
Dado un objeto java.util.Date, ¿cómo hago para encontrar en qué cuarto se encuentra?
Asumiendo Q1 = Ene Feb Mar, Q2 = Abr, May, Jun, etc.
Como los trimestres son un concepto localizado (occidental), especifique una configuración regional en lugar de usar la configuración predeterminada de la plataforma:
Calendar cal = Calendar.getInstance(Locale.US);
/* Consider whether you need to set the calendar''s timezone. */
cal.setTime(date);
int month = cal.get(Calendar.MONTH); /* 0 through 11 */
int quarter = (month / 3) + 1;
Esto evitará obtener el decimotercer mes (calendario.UNDECIMBER) en calendarios no occidentales, y cualquier desviación causada por sus meses más cortos.
JFreeChart tiene una clase Quarter. Si tienes curiosidad, echa un vistazo al javadoc . La fuente también está disponible en SourceForge si desea verificar la implementación.
Tendrá que escribir su propio código porque el término "Trimestre" es diferente para cada empresa. ¿No puedes hacer algo como esto?
Calendar c = /* get from somewhere */
int month = c.get(Calendar.MONTH);
return (month >= Calendar.JANUARY && month <= Calendar.MARCH) ? "Q1" :
(month >= Calendar.APRIL && month <= Calendar.JUNE) ? "Q2" :
(month >= Calendar.JULY && month <= Calendar.SEPTEMBER) ? "Q3" :
"Q4";
Si usted tiene
private static final int[] quarters = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
Entonces el quarter
actual es
private static final int thisQuarter = quarters[thisMonth];
Donde este thisMonth
es
private static final int thisMonth = cal.get(Calendar.MONTH);
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
Para mí, utilicé este método para la representación de cadenas:
int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
Al usar el tiempo Joda, use la función Math.ceil ():
double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
con java8 puedes usar el formateador:
import java.time.format.DateTimeFormatter
import java.time.LocalDate
println("withQuarter: " + LocalDate.of("2016".toInt,"07".toInt,1).format(DateTimeFormatter.ofPattern("yyyyQMM")))
con trimestre: 2016 3 07
La respuesta de abdmob es correcta: el uso de java.time es el camino más inteligente.
ThreeTen-Extra
Además, el proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time.
Sus clases útiles incluyen:
Trimestre actual
Para obtener el trimestre actual, especifique un huso horario. Determinar un trimestre significa determinar una fecha. Y determinar una fecha significa especificar una zona horaria. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Especifique utilizando un nombre de zona horaria adecuado en forma de continent/region
. Nunca use las abreviaturas de 3-4 letras como EST
o IST
.
ZoneId z = ZoneId.of( "America/Montreal" );
YearQuarter yq = YearQuarter.now( z );
Dado un java.util.Date
Si se le da un java.util.Date
primero conviértalo a un tipo java.time. La clase Instant
representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos .
Instant instant = myUtilDate.toInstant();
Asigna un huso horario para obtener un ZoneDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Genera un YearQuarter
partir de ese ZonedDateTime
.
YearQuarter yq = YearQuarter.from( zdt );
Use a lo largo de su código
Debería pasar ejemplos de YearQuarter
lugar de meros números o cadenas. El uso de objetos proporciona seguridad de tipo, garantiza valores válidos y hace que su código sea más autodocumentado.
Asegúrese de que thisMonth
sea al menos un float o un double, no un int:
String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";
Saludos, MS