Java Calendario.set(Calendar.DAY_OF_WEEK, Calendario.El DOMINGO), va a rodar hacia atrás, hacia delante o desconocido?

Supongamos el siguiente código es ejecutado el 22 de agosto de 2009 (sábado)

   Calendar c = Calendar.getInstance();
   c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

c.get(Calendar.DAY_OF_MONTH) volverá 23. Estoy interesado en las condiciones que se volvería 14 (el pasado domingo, en lugar de que el próximo domingo).

Hay reglas asociadas con la dirección del Calendario del rollo de la DAY_OF_MONTH/YEAR cuando DAY_OF_WEEK se establece? Si es así, cuáles son?

InformationsquelleAutor Will | 2009-08-23

8 Kommentare

  1. 12

    Debe mantener siempre el mismo WEEK_OF_MONTH (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#WEEK_OF_MONTH). A partir de la documentación:

    Al establecer u obtener el
    WEEK_OF_MONTH o WEEK_OF_YEAR campos,
    Calendario debe determinar la primera semana
    del mes o año de referencia
    punto. La primera semana de un mes o
    año se define como los primeros siete
    día del período que comienza en la
    getFirstDayOfWeek() y que contiene al
    menos getMinimalDaysInFirstWeek() días
    de que mes o año. Semanas numeradas
    …, -1, 0 preceden a la primera semana;
    semanas numeradas 2, 3,… siga.
    Tenga en cuenta que la numeración normalizada
    devuelve get() puede ser diferente.
    Por ejemplo, un Calendario específico
    subclase puede designar a la semana antes de
    semana 1 de un año como la semana n de la
    año anterior.

  2. 8

    la siguiente fórmula devuelve «actual» día de una semana en un rango de [0;6]

    (d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek

    o añadir 1 si desea intervalo [1;7]

    (d + numberOfDaysInAWeek - firstDayOfWeek) % numberOfDaysInAWeek + 1

    d es lo que Calendar.get(Calendar.DAY_OF_WEEK) devuelve

    para obtener el primer día de la semana, restar fórmula del resultado partir de la fecha actual. El siguiente código es:

    final int currentDayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 7 - cal.getFirstDayOfWeek()) % 7;
    cal.add(Calendar.DAY_OF_YEAR, -currentDayOfWeek);
  3. 4

    Depende, en realidad. Considere el siguiente código Java. En realidad, es muy simple y espero que para imprimir el lunes anterior a la 2011-09-18, que es 2011-09-12:

    Calendar calendar = Calendar.getInstance(Locale.GERMANY);
    System.out.printf("First day of week: %d%n%n", calendar.getFirstDayOfWeek());
    
    calendar.set(2011, Calendar.SEPTEMBER, 18);
    System.out.printf("Starting day: %tF%n", calendar);
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    System.out.printf("Last monday: %tF%n%n", calendar);
    
    calendar.set(2011, Calendar.SEPTEMBER, 18);
    System.out.printf("Starting day: %tF (week %d)%n",
            calendar, calendar.get(Calendar.WEEK_OF_YEAR));
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    System.out.printf("Last monday: %tF (week %d)%n", calendar,
            calendar.get(Calendar.WEEK_OF_YEAR));

    Pero en realidad, el resultado es un poco diferente:

    First day of week: 2
    
    Starting day: 2011-09-18
    Last monday: 2011-09-19
    
    Starting day: 2011-09-18 (week 37)
    Last monday: 2011-09-12 (week 37)

    En otras palabras, el resultado depende de si mi calendario sabe que yo podría estar interesado en la semana. El resultado cambia realmente si me consulta WEEK_OF_YEAR!

  4. 2

    Usando java.tiempo

    El enfoque moderno es con el java.clases de tiempo que suplantar la problemática antiguo legado de la fecha y la hora de clases.

    El java.el tiempo de clases es mucho más fácil trabajar con. En particular, se elimina la ambigüedad planteada en la Pregunta. Usted puede pedir explícitamente, ya sea para la anterior domingo o para el más tarde domingo.

    La LocalDate clase representa una fecha valor solo sin la hora del día y sin zona horaria.

    La Month enum proporciona una docena de pre-definida de objetos, uno para cada mes del año. Estos enumeración de los objetos son más seguros de usar, pero usted puede en lugar de utilizar un simple número para el mes. A diferencia de la herencia de clases, estos meses han sane la numeración del 1 al 12 de enero-diciembre.

    LocalDate localDate = LocalDate.of( 2009 , Month.AUGUST, 22 );

    La TemporalAdjuster interfaz proporciona para la manipulación de fecha y hora valores. El TemporalAdjusters clase (nótese el plural s) proporciona varios práctico de las implementaciones.

    La previous & next ajustadores de excluir de la misma fecha del examen. El previousOrSame & nextOrSame métodos de retorno de la fecha en cuestión, si es de hecho el deseado día de la semana.

    La DayOfWeek enum proporciona siete pre-definida de objetos, uno para cada día de la semana.

    LocalDate previousSunday = localDate.with( TemporalAdjusters.previous ( DayOfWeek.SUNDAY ));
    LocalDate previousOrSameSunday = localDate.with( TemporalAdjusters.previousOrSame ( DayOfWeek.SUNDAY ));
    
    LocalDate nextSunday = localDate.with( TemporalAdjusters.next ( DayOfWeek.SUNDAY ));
    LocalDate nextOrSameSunday = localDate.with( TemporalAdjusters.nextOrSame ( DayOfWeek.SUNDAY ));

    Volcado a la consola.

    System.out.println ("localDate: " + localDate + " ( " + localDate.getDayOfWeek ().getDisplayName ( TextStyle.FULL, Locale.US )  + " )");
    System.out.println ("previousSunday: " + previousSunday );
    System.out.println ("nextSunday: " + nextSunday );

    localDate: 2009-08-22 ( sábado )

    previousSunday: 2009-08-16

    próximo domingo: 2009-08-23


    Acerca de java.tiempo

    La java.tiempo marco está construido en Java 8 y versiones posteriores. Estas clases suplantar la problemática de edad legado fecha y hora de las clases, tales como java.util.Fecha, Calendario, & SimpleDateFormat.

    La Joda-El Tiempo proyecto, ahora en el modo de mantenimiento, asesora de la migración a la java.tiempo clases.

    Para obtener más información, consulte la Oracle Tutorial. Y la búsqueda de Desbordamiento de Pila, hay muchos ejemplos y explicaciones. La especificación es JSR 310.

    Dónde obtener el java.clases de tiempo?

    La ThreeTen-Extra proyecto se extiende java.tiempo con clases adicionales. Este proyecto es un terreno de prueba para posibles futuras incorporaciones a java.tiempo. Usted puede encontrar algunos de clases útiles aquí como Intervalo, YearWeek, YearQuarter, y más.

    • Gran detalle, exactamente lo que necesitaba. Gracias!
  5. 1

    De la Javadoc:

    Si hay algún conflicto en el calendario de los valores de campo, el Calendario le da prioridades a los campos de calendario de que se han establecido más recientemente. Las siguientes son las combinaciones por omisión de los campos de calendario. El más reciente combinación, según lo determinado por el más reciente conjunto único campo, va a ser utilizado.

    Para los campos de fecha:

     YEAR + MONTH + DAY_OF_MONTH
     YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
     YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
     YEAR + DAY_OF_YEAR
     YEAR + DAY_OF_WEEK + WEEK_OF_YEAR

    Puedo interpretar esto significa que, dado que va a ajustar el día de la semana, que va a terminar siendo combinado con la semana de mes o de la semana del año con el fin de producir la fecha y hora.

  6. 0

    Usted debe también comprobar lo que es el primer día de una semana.
    También he pensado siempre es domingo, pero esto depende de la configuración local, y en mi caso
    El lunes es el primer día de la semana. Ajuste el domingo como primer día de la semana solucionado mi problema.

  7. 0

    Depende del primer día de la semana:

     /**
     * Gets what the first day of the week is; e.g., <code>SUNDAY</code> in the U.S.,
     * <code>MONDAY</code> in France.
     *
     * @return the first day of the week.
     * @see #setFirstDayOfWeek(int)
     * @see #getMinimalDaysInFirstWeek()
     */
    public int getFirstDayOfWeek()
    {
        return firstDayOfWeek;
    }
  8. -1

    Puede utilizar como este método.

    public Integer whichDayOfWeek(Calendar calendar) {
                if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
                    return 1;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
                    return 2;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) {
                    return 3;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
                    return 4;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                    return 5;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                    return 6;
                } else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
                    return 7;
                } else {
                    return null;
                }
            }
    • esto no abordar el cartel de la cuestión en todos los

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea