¿Por qué el 31 de diciembre de 2010 devuelve 1 semana de año?

Por ejemplo:

Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );  

Imprime 1

Mismo sucede con la Joda de tiempo.

🙂

  • Tal vez porque ES en la primera semana del año 2011…?
  • es_MX, México, y me gustaría esperar algo diferente a 1.
  • He extemded mi respuesta para explicar por qué los 31. Dec pertenece a la 1. Semana de Año en los estados unidos. – Pero yo no sé cómo es para México
  • Pregunta Similar: java obtener de la semana de año determinado en una fecha
InformationsquelleAutor OscarRyz | 2011-01-05

6 Kommentare

  1. 53

    La definición de la Semana del Año es Locale dependiente.

    Cómo se define en NOSOTROS es discused en los otros puestos. Por ejemplo, en Alemania (DIN 1355-1 /ISO 8601): la primera Semana del Año es la primera semana con 4 o más días en el nuevo año.

    *el primer día de la semana es el lunes y el último día de la semana es el domingo

    Y Java Calendar presta atención a la configuración regional. Por ejemplo:

    public static void main(String[] args) throws ParseException {
    
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date lastDec2010 = sdf.parse("31/12/2010");
    
        Calendar calUs = Calendar.getInstance(Locale.US);       
        calUs.setTime(lastDec2010);
    
        Calendar calDe = Calendar.getInstance(Locale.GERMAN);       
        calDe.setTime(lastDec2010);
    
        System.out.println( "us: " + calUs.get( Calendar.WEEK_OF_YEAR ) ); 
        System.out.println( "de: " + calDe.get( Calendar.WEEK_OF_YEAR ) );
    }

    imprime:

    us: 1
    de: 52

    AÑADIDO
    Para NOSOTROS (y puedo pensar que es el mismo para México) el 1. Semana del Año es la semana donde el 1. De enero pertenece. — Así que si 1. Enero es un sábado, el viernes anterior (31. Dism) pertenece a la misma semana, y en este caso este día pertenece a la 1. Semana de Año 2011.

  2. 9

    Valores calculados para la WEEK_OF_YEAR
    de campo en el rango de 1 a 53. Semana 1 para un
    año es el primer periodo de siete días,
    a partir getFirstDayOfWeek() que
    contiene al menos
    getMinimalDaysInFirstWeek() días a partir de
    de ese año. Es por lo tanto depende de la
    los valores de getMinimalDaysInFirstWeek(),
    getFirstDayOfWeek(), y el día de
    la semana del 1 de enero. Semanas entre
    semana 1 de un año y la semana 1 de la
    año siguiente se numeran
    en forma secuencial, de 2 a 52 o 53 (como
    es necesario).

    Para determinar si esa semana es la última semana de 2010 o el primero de 2011 Java utiliza getMinimalDaysInFirstWeek javadoc. Si el método devuelve 7, a continuación, la primera semana en la que todos los días de la semana son del mismo año es la semana uno, si devuelve 1, a continuación, la primera semana con cualquiera de los días del próximo año es la primera semana del próximo año.

    En este caso el primero de enero de 2011 es sábado por lo que se considera la primera semana de 2011 como el tiempo que quisiera a la semana con un día para ser considerada ya la primera semana del próximo año, si no, a continuación, hacer:

    Calendar c = Calendar.getInstance();
    c.setMinimalDaysInFirstWeek(7);//anything more than 1 will work in this year
    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    c.setTime( sdf.parse("31/12/2010"));
    System.out.println( c.get( Calendar.WEEK_OF_YEAR ) ); 

    devuelve:

    52
  3. 3

    Si mal no recuerdo, La primera semana con una fecha de 1 de enero es la semana 1.

    Es por eso que la semana 1 se devuelve para 12/31/2010.

    Intente por 12/31/2011 y obtendrá 52.

    Edición: Semana de la configuración regional específica, a veces se define como el domingo – sábado, en ocasiones, se define como el lunes – domingo

    • Lo mas probable es que mirándolo desde un Año Fiscal, la perspectiva de que es un lunes – domingo perspectiva.
    • Debo añadir que la «primer día de la semana» es específica de la configuración regional. Muchos países distintos de los estados unidos definen el lunes como el primer día de la semana.
    • No sólo el inicio de la semana depende de la configuración regional, pero también de cómo determinar la primera semana de un año.
  4. 3

    tl;dr

    java.time.LocalDate.parse( 
        "31/12/2010" , 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  
    )      
    .get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )

    52

    O, añadir una biblioteca y, a continuación,…

    org.threeten.extra.YearWeek.from(     //Convert from a `LocalDate` object to a `YearWeek` object representing the entire week of that date’s week-based year.
        java.time.LocalDate.parse( "31/12/2010" , DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  
    ).getWeek()                           //Extract an integer number of that week of week-based-year, either 1-52 or 1-53 depending on the year.

    52

    java.tiempo

    Como otros señalaron, la definición de una semana varía por Locale en el antiguo java.util.Calendar clase.

    Que la problemática de la clase, y su pareja java.util.Date, han sido suplantados por la java.tiempo marco de trabajo basado en Java 8 y versiones posteriores.

    La IsoFields clase define una semana usando el ISO 8601 estándar: Semana siempre comienza un lunes y la semana # 1 contiene el primer jueves del año calendario.

    Obtener en el momento actual.

    ZoneId zoneId = ZoneId.of ( "America/Montreal" );
    ZonedDateTime now = ZonedDateTime.now ( zoneId );

    Preguntar sobre el estándar basado en la semana de año.

    int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
    int weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );

    Semana estándar de definición de

    Hay muchas maneras de definir «una semana» y «la primera semana del año».

    Sin embargo, hay uno de los principales de definición estándar: el Estándar ISO 8601. El estándar define las semanas del año, incluyendo la primera semana del año.

    la semana con el año del primer jueves

    Un estándar semanas comienza el lunes y termina con el domingo.

    Semana # 1 de un año basado en la semana que tiene el primer jueves del año calendario.

    La java.tiempo clases de apoyo de la ISO 8601 semana a través de la IsoFields clase, la realización de tres constantes que implementar TemporalField:

    Llamada LocalDate::get para acceder a la TemporalField.

    LocalDate ld = LocalDate.parse( "2010-12-31" ) ;
    int weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
    int yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;

    ld.toString(): 2010-12-31

    weekOfWeekBasedYear: 52

    yearOfWeekBasedYear: 2010

    ISO 8601 formato de cadena

    El estándar ISO 8601 define un formato de texto, así como el significado de la semana basada en los valores de año: yyyy-Www. Para una fecha específica, agregue día de la semana se numeran del 1 al 7 de lunes-domingo: yyyy-Www-d.

    Construir una cadena.

    String outputWeek = String.format( "%04d" , yearOfWeekBasedYear ) + "-W" + String.format( "%02d" , weekOfWeekBasedYear ) ;
    String outputDate = outputWeek + "-" + ld.getDayOfWeek().getValue() ;

    2010-W52-5

    YearWeek

    Este trabajo es mucho más fácil si usted agregue el ThreeTen-Extra de la biblioteca para su proyecto. A continuación, utilice el YearWeek clase.

    YearWeek yw = YearWeek.from( ld ) ;  //Determine ISO 8601 week of a `LocalDate`. 

    Generar el estándar de la cadena.

    String output = yw.toString() ;

    2010-W52

    Y analizar.

    YearWeek yearWeek = YearWeek.parse( "2010-W52" ) ;  

    yearWeek.toString(): 2010-W52

    Determinar una fecha. Pasar un java.time.DayOfWeek enumeración de objetos para el día de la semana, de lunes a domingo.

    LocalDate localDate = yw.atDay( DayOfWeek.MONDAY ) ;

    localDate.toString(): 2010-12-27

    I fuertemente recomendar la adición de esta biblioteca para su proyecto. A continuación, puede pasar alrededor de los objetos inteligentes en lugar de tonto enteros. Si lo hace el código más auto-documentación, proporciona tipo de seguridad, y se asegura de valores válidos.


    Sobre 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-Time 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.

    El uso de un Controlador JDBC compatible con JDBC 4.2 o más tarde, usted puede intercambiar java.tiempo objetos directamente con la base de datos. Sin necesidad de cuerdas ni de java.sql.* clases.

    Dónde obtener el java.clases de tiempo?

    • Java SE 8, Java SE 9, y más tarde
      • Incorporado.
      • Parte de la norma API de Java con un paquete de implementación.
      • Java 9 añade algunas características menores y correcciones.
    • Java SE 6 y Java SE 7
      • Mucho de java.el tiempo es la funcionalidad de back-portado a Java 6 & 7 en ThreeTen-Backport.
    • Android
      • Versiones posteriores de Android paquete de implementaciones de java.clases de tiempo.
      • Para versiones anteriores de Android, la ThreeTenABP proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo utilizar ThreeTenABP….

    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.


    Para más detalle, ver mi Respuesta en la Pregunta similar:

    …y ver mi Respuesta en la Pregunta similar:

  5. 2

    Esto es debido a que el comienzo de la semana es dependiente local.

    En los estados unidos el 1 de la Semana comienza el domingo antes del 1 de enero. En 2010, esto es desde el 26 de diciembre. Es por eso que el 31 de diciembre, es todavía la semana 1.

    En Europa el 1 de la semana comienza el lunes antes del 1 de enero. En 2010 este es Dec 27. Es por eso que también en Europa el 31 de diciembre, es todavía la semana 1.

    • No, es depende de la configuración regional.
    • Sí. No obstante, si la semana empieza en lunes, el mismo principio se aplica.
  6. 0

    Siento que este es un mejor enfoque.

    Calendar c = Calendar.getInstance();
    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    c.setTime( sdf.parse("31/12/2010"));
    
    int thisWeek = c.get(Calendar.WEEK_OF_YEAR);
    if (c.get(Calendar.MONTH) == Calendar.DECEMBER && thisWeek == 1)
        thisWeek = 53;
    
    System.out.println(thisWeek);

    La principal suposición aquí es, para el mes de diciembre, la semana no puede ser 1, por lo tanto, acaba de regresar 53.

    Por favor, sugiero, si me equivoco en algún lugar, y por qué esto no está implementado en el Calendario de Java.

    • Todo lo que estamos haciendo es cambiar la fecha a partir de la 2010-12-31 to 2011-12-30.
    • Otras respuestas ya han explicado por qué 1 es la respuesta correcta en algunos lugares. Entonces, ¿qué vas a hacer es cambiar una respuesta correcta en una equivocado.
    • Debido a que la fecha dada es la 1ª semana de 2011, y decidió que no, que es en realidad la 53ª semana de 2011.
    • Oh no no… sería 53ª semana de 2010.. Calendario.AÑO deberá devolver 2010… En el caso anterior era regresar 1ª semana de 2010, acabo de cambiar a 53, diciembre no puede estar en la 1ª semana…
    • getWeekYear() de 2011. De nuevo: Sólo porque no creo que un día de diciembre se puede caer en la semana 1 no cambia la manera en que el calendario de obras.
    • bueno, aquí está mi punto. La fecha he probado es «Vie Dic 31 00:00:00 IST 2010». Ahora si yo escojo el año a partir de aquí es de 2010, pero la yearweek devuelve 1ª semana de 2011. Creo que es engañoso y erróneo. Cualquiera sea la forma en que el Calendario se implementa, ya sea que está hecho para apoyar a algún caso en particular que no me doy cuenta de. En cualquier caso, me han cambiado la aplicación en mi proyecto. Para mí quiero la semana 53 de 2010.

Kommentieren Sie den Artikel

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

Pruebas en línea