jdk descargar java

java - descargar - desea la fecha y hora actual en el formato “dd/MM/aaaa HH: mm: ss.SS”



java offline (7)

Estoy usando el siguiente código para obtener la fecha en el formato "dd / MM / aaaa HH: mm: ss.SS".

import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateAndTime{ public static void main(String[] args)throws Exception{ Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS"); String strDate = sdf.format(cal.getTime()); System.out.println("Current date in String Format: "+strDate); SimpleDateFormat sdf1 = new SimpleDateFormat(); sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS"); Date date = sdf1.parse(strDate); System.out.println("Current date in Date Format: "+date); } }

y estoy recibiendo siguiente salida

Current date in String Format: 05/01/2012 21:10:17.287 Current date in Date Format: Thu Jan 05 21:10:17 IST 2012

Sugiera amablemente lo que debería hacer para mostrar la fecha en el mismo formato de cadena (dd / MM / aaaa HH: mm: ss.SS), es decir, quiero la siguiente salida:

Current date in String Format: 05/01/2012 21:10:17.287 Current date in Date Format: 05/01/2012 21:10:17.287

Sugerir amablemente


tl; dr

  • Usa clases modernas de java.time .
  • Nunca use las clases Date / Calendar / SimpleDateFormat .

Ejemplo:

ZonedDateTime // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). .now( // Capture the current moment. ZoneId.of( "Africa/Tunis" ) // Always specify time zone using proper `Continent/Region` format. Never use 3-4 letter pseudo-zones such as EST, PDT, IST, etc. ) .truncatedTo( // Lop off finer part of this value. ChronoUnit.MILLIS // Specify level of truncation via `ChronoUnit` enum object. ) // Returns another separate `ZonedDateTime` object, per immutable objects pattern, rather than alter (“mutate”) the original. .format( // Generate a `String` object with text representing the value of our `ZonedDateTime` object. DateTimeFormatter.ISO_LOCAL_DATE_TIME // This standard ISO 8601 format is close to your desired output. ) // Returns a `String`. .replace( "T" , " " ) // Replace `T` in middle with a SPACE.

java.time

El enfoque moderno utiliza las clases de java.time que hace años reemplazaron a las terribles clases de fecha y hora, como Calendar & SimpleDateFormat .

quiere fecha y hora actual

Captura el momento actual en UTC usando Instant .

Instant instant = Instant.now() ;

Para ver ese mismo momento a través de la lente del tiempo de reloj de pared utilizado por las personas de una región en particular (una zona horaria), aplique un ZoneId para obtener un ZonedDateTime .

Especifique un nombre de zona horaria adecuado en el formato de continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca use la abreviatura de 3 a 4 letras, como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas, ni siquiera son únicas (!).

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ; ZonedDateTime zdt = instant.atZone( z ) ;

O, como acceso directo, pase un ZoneId al método ZonedDateTime.now .

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;

Las clases java.time utilizan una resolución de nanoseconds . Eso significa hasta nueve dígitos de una fracción decimal de un segundo. Si solo quieres tres, milisegundos, truncate . Pase el límite deseado como un objeto de enumeración ChronoUnit .

ZonedDateTime .now( ZoneId.of( "Pacific/Auckland" ) ) .truncatedTo( ChronoUnit.MILLIS )

en formato “dd / MM / aaaa HH: mm: ss.SS”

Recomiendo incluir siempre el desplazamiento desde UTC o la zona horaria al generar una cadena, para evitar ambigüedades y malentendidos.

Pero si insiste, puede especificar un formato específico al generar una cadena para representar su valor de fecha y hora. Un formateador predefinido incorporado casi cumple con el formato deseado, pero para una T donde desea un ESPACIO.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) .replace( "T" , " " ) ;

sdf1.applyPattern ("dd / MM / aaaa HH: mm: ss.SS");

Fecha fecha = sdf1.parse (strDate);

Nunca intercambies valores de fecha y hora usando texto destinado a ser presentado a humanos.

En su lugar, utilice los formatos estándar definidos para este mismo propósito, que se encuentran en ISO 8601 .

El java.time utiliza estos formatos ISO 8601 de forma predeterminada al analizar / generar cadenas.

Incluya siempre un indicador del desplazamiento desde UTC o la zona horaria al intercambiar un momento específico. Por lo tanto, debe evitarse su formato deseado discutido anteriormente para el intercambio de datos. Además, generalmente es mejor intercambiar un momento como UTC. Esto significa un Instant en java.time . Puede intercambiar un Instant desde un ZonedDateTime , ajustando efectivamente desde una zona horaria a UTC para el mismo momento, el mismo punto en la línea de tiempo, pero a una hora diferente del reloj de pared.

Instant instant = zdt.toInstant() ; String exchangeThisString = instant.toString() ;

2018-01-23T01: 23: 45.123456789Z

Este formato ISO 8601 usa una Z en el extremo para representar UTC, pronunciado "Zulu".

Acerca de java.time

El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date , java.util.Calendar , y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el tutorial de Oracle . Y busca para muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cadenas, no se necesitan clases java.sql.* .

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 y versiones posteriores: parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • La mayor parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time .
    • Para Android anterior (<26), el proyecto ThreeTen-Backport adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval , YearWeek , YearQuarter , y more .


Descargo de responsabilidad: esta respuesta no respalda el uso de la clase Date (de hecho, es obsoleta y está mal diseñada, por lo que prefiero desalentarla por completo). Intento responder a una pregunta periódica sobre objetos de fecha y hora con un formato. Para este propósito estoy usando la clase Date como ejemplo. Otras clases son tratadas al final.

No quieres

No quieres una Date con un formato específico. Una buena práctica en todos, excepto en los programas más simples de desechar, es mantener su interfaz de usuario aparte de su modelo y su lógica empresarial. El valor del objeto Date pertenece a su modelo, así que mantenga su Date allí y nunca permita que el usuario la vea directamente. Cuando te adhieras a esto, nunca importará qué formato tiene la Date . Cuando el usuario debe ver la fecha, formatéela en una String y muestre la cadena al usuario. De manera similar, si necesita un formato específico para la persistencia o el intercambio con otro sistema, formatee la Date en una cadena para ese propósito. Si el usuario necesita ingresar una fecha y / o hora, acepte una cadena o use un selector de fecha o tiempo.

Caso especial: almacenamiento en una base de datos SQL. Puede parecer que su base de datos requiere un formato específico. No tan. Use yourPreparedStatement.setObject(yourParamIndex, yourDateOrTimeObject) donde yourDateOrTimeObject es LocalDate , Instant , LocalDateTime o una instancia de una clase adecuada de fecha y hora desde java.time. Y otra vez no te preocupes por el formato de ese objeto. Buscar más detalles.

No se puede

Una Date no tiene, como en no puede tener un formato. Es un punto en el tiempo, nada más, nada menos. Un contenedor de un valor. En su código sdf1.parse convierte su cadena en un objeto Date , es decir, en un punto en el tiempo. No conserva la cadena ni el formato que estaba en la cadena.

Para terminar la historia, veamos la siguiente línea de su código también:

System.out.println("Current date in Date Format: "+date);

Para poder realizar la concatenación de cadenas requerida por el signo + Java debe convertir su Date en una String primero. Lo hace llamando al método toString de su objeto Date . Date.toString siempre produce una cadena como Thu Jan 05 21:10:17 IST 2012 . No hay forma de cambiar eso (excepto en una subclase de Date , pero no desea eso). Luego, la cadena generada se concatena con la cadena literal para producir la cadena impresa por System.out.println .

En resumen, el "formato" se aplica solo a las representaciones de cadena de fechas, no a las fechas en sí.

¿No es extraño que una fecha no tenga un formato?

Creo que lo que he escrito es como deberíamos esperar. Es similar a otros tipos. Piense en un int . El mismo int puede formatearse en cadenas como 53,551 , 53.551 (con un punto como separador de miles), 00053551 , +53 551 o incluso 0x0000_D12F . Todo este formato produce cadenas, mientras que el int mantiene igual y no cambia su formato. Con un objeto Date es exactamente lo mismo: puede formatearlo en muchas cadenas diferentes, pero la Date sí permanece siempre igual.

¿Puedo tener un LocalDate, un ZonedDateTime, un Calendar, un GregorianCalendar, un XMLGregorianCalendar, un java.sql.Date, Time o Timestamp en el formato de mi elección?

No, no puedes, y por las mismas razones que arriba. Ninguna de las clases mencionadas, de hecho, ninguna fecha ni clase de tiempo que he conocido, puede tener un formato. Puede tener el formato deseado solo en una String fuera de su objeto de fecha y hora.

Campo de golf

  • Model–view–controller en Wikipedia
  • Todo sobre java.util.Date en el blog de codificación de Jon Skeet
  • La respuesta de Basil Bourque explicando qué hacer en su lugar (también utiliza clases que son más modernas y mucho más fáciles de programar que Date )

El siguiente código da el resultado esperado. ¿Es eso lo que quieres?

import java.util.Calendar; import java.util.Date; public class DateAndTime { public static void main(String[] args) throws Exception { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS"); String strDate = sdf.format(cal.getTime()); System.out.println("Current date in String Format: " + strDate); SimpleDateFormat sdf1 = new SimpleDateFormat(); sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS"); Date date = sdf1.parse(strDate); String string=sdf1.format(date); System.out.println("Current date in Date Format: " + string); } }


La salida en su primera línea de impresión está utilizando su formateador. La salida en su segundo (la fecha creada a partir de su cadena analizada) se emite utilizando Date # toString, que se formatea de acuerdo con sus propias reglas. Es decir, no estás utilizando un formateador.

Las reglas son según lo que está viendo y se describe aquí: http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#toString ()


No puede, porque está llamando a Date.toString() que siempre incluirá la zona horaria del sistema si está en el formato de fecha predeterminado para la configuración regional predeterminada. El valor de Date sí no tiene ningún concepto de formato. Si desea formatearlo de una manera particular, use SimpleDateFormat.format() ... usando Date.toString() es casi siempre una mala idea.



Utilizar:

System.out.println("Current date in Date Format: " + sdf.format(date));