metodos - tipo de dato para hora en java
Convertir cadena en objeto de calendario en Java (8)
tl; dr
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
2011-03
Evite las clases heredadas de fecha y hora
La forma moderna es con las clases java.time. Las antiguas clases de fecha y hora como Calendar
han demostrado estar mal diseñadas, son confusas y problemáticas.
Defina un formateador personalizado para que coincida con su entrada de cadena.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
Parse como ZonedDateTime
.
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
Usted está interesado en el año y el mes. Las clases java.time incluyen la clase YearMonth
para ese propósito.
YearMonth ym = YearMonth.from( zdt );
Puede interrogar los números de año y mes si es necesario.
int year = ym.getYear();
int month = ym.getMonthValue();
Pero el método toString
genera una cadena en formato estándar ISO 8601 .
String output = ym.toString();
Pon todo esto junto.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();
Volcado a la consola.
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
entrada: Lun Mar 14 16:02:37 GMT 2011
zdt: 2011-03-14T16: 02: 37Z [GMT]
ym: 2011-03
Código de Live
Vea este código ejecutándose en IdeOne.com .
Conversión
Si debe tener un objeto de Calendar
, puede convertirlo en un GregorianCalendar
utilizando nuevos métodos agregados a las clases anteriores.
GregorianCalendar gc = GregorianCalendar.from( zdt );
Acerca de java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy fecha y hora como java.util.Date
, Calendar
y SimpleDateFormat
.
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 de java.time?
- Java SE 8 y SE 9 y posteriores
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- Vea Cómo usar ...
El proyecto ThreeTen-Extra amplía 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 .
Soy nuevo en Java, por lo general trabajo con PHP.
Estoy tratando de convertir esta cadena:
Lun Mar 14 16:02:37 GMT 2011
En un objeto de calendario para que pueda 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!
Bueno, creo que sería una mala idea replicar el código que ya está presente en clases como SimpleDateFormat
.
Por otro lado, personalmente sugiero evitar el Calendar
y la Date
completo si es posible, 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 SimpleDateFormat
no es seguro para subprocesos, por lo que necesita SimpleDateFormat
subprocesos, sincronización o una nueva instancia cada vez que la use. Los analizadores y formateadores Joda son seguros para subprocesos.
Método simple:
public Calendar stringToCalendar(String date, String pattern) throws ParseException {
String DEFAULT_LOCALE_NAME = "pt";
String DEFAULT_COUNTRY = "BR";
Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
Date d = format.parse(date);
Calendar c = getCalendar();
c.setTime(d);
return c;
}
No es necesario crear un nuevo calendario, SimpleDateFormat ya usa un calendario debajo.
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();
(No puedo comentar todavía, es por eso que creé una nueva respuesta)
Parse un tiempo con zona horaria, Z
en patrón es para zona horaria
String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssZ", Locale.getDefault());
try {
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(aTime));
Log.i(TAG, "time = " + cal.getTimeInMillis());
} catch (ParseException e) {
e.printStackTrace();
}
Salida: devolverá la hora UTC
1508899140000
Si no configuramos la zona horaria en un patrón como yyyy-MM-dd''T''HH:mm:ss
. SimpleDateFormat
usará la zona horaria que se haya configurado en Setting
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.
SimpleDateFormat
es genial, solo tenga en cuenta que HH
es diferente de hh
cuando se trabaja con horas. HH
devolverá horas basadas en 24 horas y hh regresará horas basadas en 12 horas.
Por ejemplo, lo siguiente devolverá 12 horas de tiempo:
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
Si bien esto devolverá 24 horas de tiempo:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
nota: configure la configuración Locale
según su entorno / requisito
Ver también