¿Cómo configurar el formato de 24 horas para la fecha en Java?

6 minutos de lectura

avatar de usuario de user1134602
usuario1134602

He estado desarrollando una aplicación de Android donde uso este código:

Date d=new Date(new Date().getTime()+28800000);
String s=new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(d);

Necesito obtener la fecha después de 8 horas desde el momento actual, y quiero que esta fecha tenga formato de 24 horas, pero no sé cómo puedo hacerlo con SimpleDateFormat. tambien necesito esa fecha tiene DD/MM/YYYY HH:MM:SS formato.

  • ¿Cuál es su salida esperada con el ejemplo?

    – jmj

    18 de enero de 2012 a las 9:03

  • FYI, las viejas y problemáticas clases de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormat son ahora legadosuplantado por el java.tiempo Clases integradas en Java 8 y versiones posteriores. Ver Tutorial por Oracle.

    – Basil Bourque

    20 mayo 2018 a las 19:33

para formato de 12 horas:

SimpleDateFormat simpleDateFormatArrivals = new SimpleDateFormat("hh:mm", Locale.UK);

para formato de 24 horas:

SimpleDateFormat simpleDateFormatArrivals = new SimpleDateFormat("HH:mm", Locale.UK);

  • ¿Por qué esto no está marcado como la respuesta correcta ..? ¿Por qué agregar cosas manualmente y luego probarlo?

    – Shoaeb

    29 de diciembre de 2018 a las 3:03

  • Este es el mejor enfoque porque la medianoche se informa correctamente como 00:00 y no como 24:00.

    – Hashim Aktar

    9 de noviembre de 2019 a las 0:58

Esto le dará la fecha en formato de 24 horas.

    Date date = new Date();
    date.setHours(date.getHours() + 8);
    System.out.println(date);
    SimpleDateFormat simpDate;
    simpDate = new SimpleDateFormat("kk:mm:ss");
    System.out.println(simpDate.format(date));

  • No tengo suficiente tiempo para probarlo, pero alguien dijo: “Si usa kk obtendrá resultados como 24:30 pero si usa HH puede obtenerlo como 00:30” [Source: stackoverflow.com/a/7078488/421467]. ¿Es eso cierto?

    – Dr. jacky

    18 de septiembre de 2016 a las 6:56

  • setHours está en desuso.

    – Nouman Ch.

    27 de febrero de 2019 a las 7:09

  • El problema con este enfoque es que Java informa la medianoche como las 24:00 en lugar de las 00:00 estándar.

    – Hashim Aktar

    9 de noviembre de 2019 a las 0:57

avatar de usuario de jeet
jet

Date d=new Date(new Date().getTime()+28800000);
String s=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(d);

HH devolverá 0-23 por horas.

kk devolverá 1-24 por horas.

Ver más aquí: Personalización de formatos

método de uso setIs24HourView(Booleano es24HourView) para configurar el selector de hora para configurar la vista de 24 horas.

  • Esta sigue siendo la respuesta más correcta. Editaré para que quede más claro, ya que no estaba seguro exactamente de lo que estabas diciendo. Además, el enlace en la respuesta anterior también lo explica.

    – adprocas

    13 de noviembre de 2017 a las 13:51

  • @jeet ¿qué es más común, 0-23 o 1-24?

    – ingeniero

    2 de julio de 2019 a las 2:56

  • @simgineer He visto 0-23 en todos los casos que recuerdo (nunca recuerdo haber visto algo como 24:30).

    – Lucas Vascorotto

    27/04/2021 a las 15:00

Use HH en lugar de hh en la cadena del formateador

Avatar de usuario de Basil Bourque
albahaca bourque

tl; dr

El enfoque moderno utiliza java.tiempo clases

Instant.now()                                        // Capture current moment in UTC.
       .truncatedTo( ChronoUnit.SECONDS )            // Lop off any fractional second.
       .plus( 8 , ChronoUnit.HOURS )                 // Add eight hours.
       .atZone( ZoneId.of( "America/Montreal" ) )    // Adjust from UTC to the wall-clock time used by the people of a certain region (a time zone). Returns a `ZonedDateTime` object.
       .format(                                      // Generate a `String` object representing textually the value of the `ZonedDateTime` object.
           DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
                            .withLocale( Locale.US ) // Specify a `Locale` to determine the human language and cultural norms used in localizing the text being generated. 
       )                                             // Returns a `String` object.

23/01/2017 15:34:56

java.tiempo

FYI, el viejo Calendar y Date las clases son ahora legado. Suplantado por el java.tiempo clases Gran parte de java.time está retrotraído a Java 6, Java 7 y Android (ver más abajo).

Instant

Capture el momento actual en UTC con el Instant clase.

Instant instantNow = Instant.now();

instantáneo.toString(): 2017-01-23T12:34:56.789Z

Si solo desea segundos completos, sin ninguna fracción de segundo, trunque.

Instant instant = instantNow.truncatedTo( ChronoUnit.SECONDS );

instantáneo.toString(): 2017-01-23T12:34:56Z

Matemáticas

El Instant la clase puede hacer matemáticas, agregando una cantidad de tiempo. Especifique la cantidad de tiempo para agregar por el ChronoUnit enum, una implementación de TemporalUnit.

instant = instant.plus( 8 , ChronoUnit.HOURS );

instantáneo.toString(): 2017-01-23T20:34:56Z

ZonedDateTime

Para ver ese mismo momento a través de la lente del reloj de pared de una región en particular, aplique un ZoneId conseguir un ZonedDateTime.

Especifique un nombre de la zona horaria adecuada en el formato de continent/regioncomo America/Montreal, Africa/Casablancao Pacific/Auckland. Nunca use la abreviatura de 3-4 letras como EST o IST ya que son no zonas horarias verdaderas, no estandarizadas y ni siquiera únicas (!).

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString(): 2017-01-23T15:34:56-05:00[America/Montreal]

Generar cadena

Puede generar una cadena en el formato que desee especificando un patrón de formato en un DateTimeFormatter objeto.

Tenga en cuenta que el caso importa en las letras de su patrón de formato. El código de la pregunta tenía hh que es para el tiempo de 12 horas mientras que en mayúsculas HH es de 24 horas (0-23) en ambos java.time.DateTimeFormatter así como el legado java.text.SimpleDateFormat.

Los códigos de formato en java.time son similares a los del legado SimpleDateFormat pero no exactamente igual. Estudie cuidadosamente el documento de la clase. Aquí, HH sucede que funciona de manera idéntica.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ).withLocale( Locale.US );
String output = zdt.format( f );

Localización automática

En lugar de codificar un patrón de formato, considere dejar java.tiempo localizar completamente la generación del String texto llamando DateTimeFormatter.ofLocalizedDateTime.

Y, por cierto, tenga en cuenta que la zona horaria y Locale tener nada hacer unos con otros; cuestiones ortogonales. uno es sobre contenido, el significado (el tiempo del reloj de pared). el otro es sobre presentacióndeterminando el lenguaje humano y las normas culturales utilizadas para presentar ese significado al usuario.

Instant instant = Instant.parse( "2017-01-23T12:34:56Z" );
ZoneId z = ZoneId.of( "Pacific/Auckland" );  // Notice that time zone is unrelated to the `Locale` used in localizing.
ZonedDateTime zdt = instant.atZone( z );

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL )
                                       .withLocale( Locale.CANADA_FRENCH );  // The locale determines human language and cultural norms used in generating the text representing this date-time object.
String output = zdt.format( f );

instantáneo.toString(): 2017-01-23T12:34:56Z

zdt.toString(): 2017-01-24T01:34:56+13:00[Pacific/Auckland]

salida: mardi 24 janvier 2017 a las 01:34:56 heure avancée de la Nouvelle-Zélande


Acerca de java.tiempo

El java.tiempo framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas legado clases de fecha y hora como java.util.Date, Calendar& SimpleDateFormat.

El Joda-Tiempo proyecto, ahora en modo de mantenimientoaconseja la migración a la java.tiempo clases

Para obtener más información, consulte la Tutorial de oráculo. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

puedes intercambiar java.tiempo objetos directamente con su base de datos. Usar una controlador JDBC conforme con JDBC 4.2 o después. No hay necesidad de cuerdas, no hay necesidad de java.sql.* clases

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10y después
    • Incorporado.
    • Parte de la API de Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (TresDiezABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

Joda-Tiempo

Actualizar el Joda-Tiempo el proyecto está ahora en modo de mantenimientocon el equipo asesorando la migración a la java.tiempo clases

Joda-Tiempo hace que este tipo de trabajo sea mucho más fácil.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTime later = DateTime.now().plusHours( 8 );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd/MM/yyyy HH:mm:ss" );
String laterAsText = formatter.print( later );

System.out.println( "laterAsText: " + laterAsText );

Cuando se ejecuta…

laterAsText: 19/12/2013 02:50:18

Tenga en cuenta que esta sintaxis utiliza zona horaria predeterminada. Una mejor práctica es usar una instancia de DateTimeZone explícita.

  • Androide: Instant requiere API nivel 26.

    – VonSchnauzer

    20 de mayo de 2018 a las 14:29

  • @VonSchnauzer Para Android antes de 26, vea el ThreeTen-Backport y TresDiezABP proyectos vinculados en mi viñeta con la etiqueta “Android”.

    – Basil Bourque

    20 de mayo de 2018 a las 16:14

Avatar de usuario de Fahim Parkar
Fahim Parkar

Pruebe el siguiente código

    String dateStr = "Jul 27, 2011 8:35:29 PM";
    DateFormat readFormat = new SimpleDateFormat( "MMM dd, yyyy hh:mm:ss aa");
    DateFormat writeFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
    Date date = null;
    try {
       date = readFormat.parse( dateStr );
    } catch ( ParseException e ) {
        e.printStackTrace();
    }

    String formattedDate = "";
    if( date != null ) {
    formattedDate = writeFormat.format( date );
    }

    System.out.println(formattedDate);

¡¡¡Buena suerte!!!

Consulte por varios formatos.

  • Androide: Instant requiere API nivel 26.

    – VonSchnauzer

    20 de mayo de 2018 a las 14:29

  • @VonSchnauzer Para Android antes de 26, vea el ThreeTen-Backport y TresDiezABP proyectos vinculados en mi viñeta con la etiqueta “Android”.

    – Basil Bourque

    20 de mayo de 2018 a las 16:14

Avatar de usuario de Mubarak Tahir
mubarak tahir

Todo lo que necesitas hacer es cambiar la minúscula ‘hh’ en el patrón a una letra mayúscula ‘HH’

para Kotlin:

val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val currentDate = sdf.format(Date())

para java:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss") Date currentDate = sdf.format(new Date())

¿Ha sido útil esta solución?