Mostrar la hora actual en formato de 12 horas con AM / PM

184

Actualmente, la hora se muestra como 13:35 PM. Sin embargo , quiero mostrar como formato de 12 horas con AM / PM, es decir, 1:35 PM en lugar de 13:35 PM

El código actual es el siguiente

private static final int FOR_HOURS = 3600000;
private static final int FOR_MIN = 60000;
public String getTime(final Model model) {
    SimpleDateFormat formatDate = new SimpleDateFormat("HH:mm a");
    formatDate.setTimeZone(userContext.getUser().getTimeZone());
    model.addAttribute("userCurrentTime", formatDate.format(new Date()));
    final String offsetHours = String.format("%+03d:%02d", userContext.getUser().getTimeZone().getRawOffset()
    / FOR_HOURS, Math.abs(userContext.getUser().getTimeZone().getRawOffset() % FOR_HOURS / FOR_MIN));
    model.addAttribute("offsetHours",
                offsetHours + " " + userContext.getUser().getTimeZone().getDisplayName(Locale.ROOT));
    return "systemclock";
}
ronan
fuente
77
PruebaSimpleDateFormat formatDate = new SimpleDateFormat("hh:mm a");
Tarsem Singh
1
La pregunta anterior se hizo en el año 2013 y la que mencionó en 2014, entonces, ¿cómo puede esta pregunta anterior es el duplicado de la pregunta rápida? También se hicieron preguntas a ambas tecnologías diferentes
ronan
44
@ J-Dizzle ¿Cómo puede una pregunta Java ser un duplicado de una pregunta Swift?
Mark Rotteveel
Doh mis disculpas, tienes razón!
J-Dizzle

Respuestas:

452

La forma más fácil de obtenerlo usando el patrón de fecha h:mm a, donde

  • h - Hora en am / pm (1-12)
  • m - Minuto en hora
  • a - Marcador am / pm

Fragmento de código :

DateFormat dateFormat = new SimpleDateFormat("hh:mm a");

Leer más sobre documentación - SimpleDateFormat java 7

Subhrajyoti Majumder
fuente
61
Tenga en cuenta que el uso de dos h ("hh") le da un cero inicial (es decir, 01:23 AM). Una "h" le da la hora sin el cero a la izquierda (1:23 AM).
Ben Jakuben
9
Cómo obtener AM&PM en lugar de 'am' y 'p.m'
akash bs
@akashbs Creo que no hay una manera fácil de evitarlo, pero puede intentar algo como: en su cadena de fecha completa, llame a la subcadena de (longitud - 4) a (longitud -1) y guárdela en una variable_original y luego cree una nueva variable_modificada que usará el primer variable_original creado y reemplaza ".m" con "m", luego llame al método toUpCase después de que regrese a su cadena de fecha completa y llame a replace (variable_original, variable_modified) esto logrará lo que está buscando
Tamim Attafi
@akashbs Pero puedes usar locales, cada local usa diferentes formatos de fecha, creo que usar el local de EE. UU. también puede lograr lo que estás buscando
Tamim Attafi
@akashbs Para obtener más información, consulte estos documentos: developer.android.com/reference/java/text/SimpleDateFormat
Tamim Attafi
63

usar en "hh:mm a"lugar de "HH:mm a". Aquí hhpara el formato de 12 horas y HHpara el formato de 24 horas.

Demo en vivo

Ruchira Gayan Ranaweera
fuente
Gracias @RuchiraGayanRanaweei ... me pregunto si puedo capturar el formato 24 y convertirlo al formato AM / PM ...
gumuruh
Esto es importante. Acabo de tener un caso en el que "18 de noviembre de 2016 a las 5:28 p.m." se convirtió en "2016-11-18T05: 28: 00" en lugar de "2016-11-18T17: 28: 00" porque utilicé el marcador de posición de hora incorrecto. ¡Gracias!
Kekzpanda
20
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.S aa");
String formattedDate = dateFormat.format(new Date()).toString();
System.out.println(formattedDate);

Salida: 11-Sep-13 12.25.15.375 PM

MansoorShaikh
fuente
17
SimpleDateFormat formatDate = new SimpleDateFormat("hh:mm:ss a");
  • h se usa para los horarios AM / PM (1-12).

  • H se usa por 24 horas (1-24).

  • a es el marcador AM / PM

  • m es minuto en hora

Nota: Dos h imprimirá un cero a la izquierda: 01:13 p.m. Se imprimirá una h sin el cero inicial: 1:13 PM.

Parece que básicamente todo el mundo ya me ganó, pero estoy divagando

Johnny K
fuente
11
// hh:mm will print hours in 12hrs clock and mins (e.g. 02:30)
System.out.println(DateTimeFormatter.ofPattern("hh:mm").format(LocalTime.now()));

// HH:mm will print hours in 24hrs clock and mins (e.g. 14:30)
System.out.println(DateTimeFormatter.ofPattern("HH:mm").format(LocalTime.now())); 

// hh:mm a will print hours in 12hrs clock, mins and AM/PM (e.g. 02:30 PM)
System.out.println(DateTimeFormatter.ofPattern("hh:mm a").format(LocalTime.now())); 
Sucharith
fuente
bueno, esta es la mejor respuesta que encontré aquí, gracias
Martin Volek
7

Usando Java 8:

LocalTime localTime = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm a");
System.out.println(localTime.format(dateTimeFormatter));

La salida está en AM/PMformato.

Sample output:  3:00 PM
Bala
fuente
Especifique a Localellamando withLocaleal objeto formateador para determinar el lenguaje humano y las normas culturales que se utilizarán para generar el texto AM/ PM.
Basil Bourque
5

Simplemente reemplace la siguiente declaración y funcionará.

SimpleDateFormat formatDate = new SimpleDateFormat("hh:mm a");
usuario2481237
fuente
3

Si desea la hora actual con AM, PM en uso de Android

String time = new SimpleDateFormat("hh : mm a", Locale.getDefault()).format(Calendar.getInstance().getTime());

Si desea la hora actual con am, pm

String time = new SimpleDateFormat("hh : mm a", Locale.getDefault()).format(Calendar.getInstance().getTime()).toLowerCase();

O

Desde API nivel 26

LocalTime localTime = LocalTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("hh:mm a");
String time = localTime.format(dateTimeFormatter);
Margen
fuente
2
En 2019, no les enseñe a los jóvenes a usar la SimpleDateFormatclase desactualizada y notoriamente problemática . Al menos no como la primera opción. Y no sin ninguna reserva. Hoy tenemos mucho mejor en java.timela moderna API de fecha y hora de Java y sus DateTimeFormatter.
Ole VV
1
Gracias. La respuesta moderna también se puede usar en niveles bajos de API si agrega ThreeTenABP , el backport de java.time, a su proyecto de Android. Consulte Cómo usar ThreeTenABP en Android Project (para una tarea simple como esta, el valor puede ser discutible, pero para un poco más de trabajo de fecha y hora lo recomiendo).
Ole VV
Dado que AM y PM apenas se usan en otros idiomas además del inglés, probablemente usaría DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)(u otro idioma de habla inglesa).
Ole VV
2
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a");

Esto mostrará la fecha y hora

gopal
fuente
2
    //To get Filename + date and time


    SimpleDateFormat f = new SimpleDateFormat("MMM");
    SimpleDateFormat f1 = new SimpleDateFormat("dd");
    SimpleDateFormat f2 = new SimpleDateFormat("a");

    int h;
         if(Calendar.getInstance().get(Calendar.HOUR)==0)
            h=12;
         else
            h=Calendar.getInstance().get(Calendar.HOUR)

    String filename="TestReport"+f1.format(new Date())+f.format(new Date())+h+f2.format(new Date())+".txt";


The Output Like:TestReport27Apr3PM.txt
alaguvel c
fuente
Demasiado intrincado y poco intuitivo. Si debe usar el SimpleDateFormat en desuso, al menos ponga todo en una llamada. Además, explique por qué usa 12 en lugar de la hora real desde la medianoche hasta la 1. Además, nadie le preguntó sobre los nombres de los archivos.
Robert
2

tl; dr

Deje que las clases modernas java.time de JSR 310 generen automáticamente texto localizado, en lugar de codificar el reloj de 12 horas y AM / PM.

LocalTime                                     // Represent a time-of-day, without date, without time zone or offset-from-UTC.
.now(                                         // Capture the current time-of-day as seen in a particular time zone.
    ZoneId.of( "Africa/Casablanca" )          
)                                             // Returns a `LocalTime` object.
.format(                                      // Generate text representing the value in our `LocalTime` object.
    DateTimeFormatter                         // Class responsible for generating text representing the value of a java.time object.
    .ofLocalizedTime(                         // Automatically localize the text being generated.
        FormatStyle.SHORT                     // Specify how long or abbreviated the generated text should be.
    )                                         // Returns a `DateTimeFormatter` object.
    .withLocale( Locale.US )                  // Specifies a particular locale for the `DateTimeFormatter` rather than rely on the JVM’s current default locale. Returns another separate `DateTimeFormatter` object rather than altering the first, per immutable objects pattern.
)                                             // Returns a `String` object.

10:31 a. M.

Localizar automáticamente

En lugar de insistir en un reloj de 12 horas con AM / PM, es posible que desee dejar que java.time se localice automáticamente para usted. Llamar DateTimeFormatter.ofLocalizedTime.

Para localizar, especifique:

  • FormatStyle para determinar qué tan larga o abreviada debe ser la cadena.
  • Locale para determinar:
    • El lenguaje humano para la traducción del nombre del día, el nombre del mes y tal.
    • Las normas culturales que deciden cuestiones de abreviatura, capitalización, puntuación, separadores, etc.

Aquí obtenemos la hora actual del día como se ve en una zona horaria particular. Luego generamos texto para representar ese tiempo. Localizamos el idioma francés en la cultura de Canadá, luego el inglés en la cultura de los Estados Unidos.

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
LocalTime localTime = LocalTime.now( z ) ;

// Québec
Locale locale_fr_CA = Locale.CANADA_FRENCH ;  // Or `Locale.US`, and so on.
DateTimeFormatter formatterQuébec = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT ).withLocale( locale_fr_CA ) ;
String outputQuébec = localTime.format( formatterQuébec ) ;

System.out.println( outputQuébec ) ;

// US
Locale locale_en_US = Locale.US ;  
DateTimeFormatter formatterUS = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT ).withLocale( locale_en_US ) ;
String outputUS = localTime.format( formatterUS ) ;

System.out.println( outputUS ) ;

Vea este código en vivo en IdeOne.com .

10 h 31

10:31 a. M.

Albahaca Bourque
fuente
0
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss a");
Raju Ahmed
fuente
1
Es más útil si explica un poco sobre su respuesta.
Nima Derakhshanjan
("hh: mm: ss a") >>> Aquí, si no se utiliza, aparecerá 24 horas. así que si queremos AM / PM en su tiempo simplemente agregue este formato. Si hay alguna confusión por favor hágamelo saber.
Raju Ahmed
0

Para poner su formato actual de fecha y hora móvil en

9 de febrero de 2018 10:36:59 PM

Date date = new Date();
 String stringDate = DateFormat.getDateTimeInstance().format(date);

usted puede mostrar a su Activity, Fragment, CardView, ListViewen cualquier lugar mediante el uso deTextView

` TextView mDateTime;

  mDateTime=findViewById(R.id.Your_TextViewId_Of_XML);

  Date date = new Date();
  String mStringDate = DateFormat.getDateTimeInstance().format(date);
  mDateTime.setText("My Device Current Date and Time is:"+date);

  `
abhishek jha
fuente
0
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Date;

public class Main {
   public static void main(String [] args){
       try {
            DateFormat parseFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm a");
            String sDate = "22-01-2019 13:35 PM";
            Date date = parseFormat.parse(sDate);
            SimpleDateFormat displayFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm a");
            sDate = displayFormat.format(date);
            System.out.println("The required format : " + sDate);
        } catch (Exception e) {}
   }
}
Manas Ranjan Mahapatra
fuente
3
Estás comiendo una excepción. El controlador de excepciones al menos debe proporcionar una advertencia.
SL Barth - Restablece a Mónica el
-2

Puede usar SimpleDateFormat para esto.

SimpleDateFormat formatDate = new SimpleDateFormat("hh:mm a");

Espero que esto te ayude.

Mayank Bhatnagar
fuente
1
Lea las otras respuestas antes de agregar una nueva. Su respuesta es básicamente la misma que esta: stackoverflow.com/a/18736764/4687348
FelixSFD
66
Su respuesta podría ser útil, si explicara la diferencia entre su respuesta y la anterior que vinculé en mi primer comentario.
FelixSFD