Soy nuevo en Java, generalmente trabajo con PHP.
Estoy tratando de convertir esta cadena:
Lun mar 14 16:02:37 GMT 2011
En un objeto de calendario para poder extraer fácilmente el año y el mes de esta manera:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
¿Sería una mala idea analizarlo manualmente? ¿Usando un método de subcadena?
Cualquier consejo ayudaría, gracias!
Respuestas:
nota: establecer de
Locale
acuerdo a su entorno / requisitoVer también
fuente
java.time
. Este Q / A aparece bastante destacado en Google.tl; dr
El enfoque moderno utiliza las clases java.time .
Evite las clases de fecha y hora heredadas
La forma moderna es con las clases java.time. Las antiguas clases de fecha y hora, como
Calendar
han demostrado ser mal diseñadas, confusas y problemáticas.Defina un formateador personalizado para que coincida con su entrada de cadena.
Parse como a
ZonedDateTime
.Te interesa el año y el mes. Las clases java.time incluyen
YearMonth
clase para ese propósito.Puede consultar los números de año y mes si es necesario.
Pero el
toString
método genera una cadena en formato estándar ISO 8601 .Pon todo esto junto.
Volcado a la consola.
Código en vivo
Vea este código ejecutándose en IdeOne.com .
Conversión
Si debe tener un
Calendar
objeto, puede convertirlo aGregorianCalendar
usando nuevos métodos agregados a las clases anteriores.Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
Bueno, creo que sería una mala idea replicar el código que ya está presente en clases como
SimpleDateFormat
.Por otro lado, personalmente sugeriría evitar
Calendar
y porDate
completo si puedes, y usar Joda Time en su lugar, como una API de fecha y hora mucho mejor diseñada. Por ejemplo, debe tener en cuenta que noSimpleDateFormat
es seguro para subprocesos, por lo que necesita locales de subprocesos, sincronización o una nueva instancia cada vez que lo usa. Los analizadores y formateadores Joda son seguros para subprocesos.fuente
java.time
es el camino a seguir, Basil Bourque proporcionó una excelente respuesta.No es necesario crear un nuevo calendario, SimpleDateFormat ya usa un calendario debajo.
(No puedo comentar todavía, por eso creé una nueva respuesta)
fuente
SimpleDateFormat
es genial, solo ten en cuenta queHH
es diferente dehh
cuando trabajas con horas.HH
devolverá las horas basadas en 24 horas y hh devolverá las horas basadas en 12 horas.Por ejemplo, lo siguiente devolverá 12 horas:
Si bien esto devolverá el tiempo de 24 horas:
fuente
Analiza una hora con zona horaria,
Z
en el patrón es para zona horariaSalida: devolverá la hora UTC
Si no establecemos la zona horaria en patrón como
yyyy-MM-dd'T'HH:mm:ss
.SimpleDateFormat
utilizará la zona horaria que se ha establecido enSetting
fuente
Sí, sería una mala práctica analizarlo usted mismo. Eche un vistazo a SimpleDateFormat , convertirá la Cadena en una Fecha y puede establecer la Fecha en una instancia de Calendario.
fuente
Método simple:
fuente