parse - java util date format
¿Alternativas a FastDateFormat para un análisis de fecha eficiente? (6)
Muy consciente de los problemas de rendimiento y de subprocesos con SimpleDateFormat
, decidí FastDateFormat
, hasta que me di cuenta de que FastDateFormat
es solo para formatear, ¡no hay análisis!
¿Existe una alternativa a FastDateFormat
, que está lista para usar de manera inmediata y mucho más rápida que SimpleDateFormat
?
Creo que FastDateFormat
es uno de los más rápidos, por lo que cualquier cosa que sea tan rápido lo haría.
Solo curiosidad, ¿alguna idea de por qué FastDateFormat
no admite el análisis? ¿No limita seriamente su uso?
¿Realmente necesitas analizar fechas tan rápido? ¿Ha probado SimpleDateFormat y lo encontró demasiado lento para sus necesidades?
Tenga en cuenta que hay varias formas de almacenar en caché instancias de clase que no sean seguras para subprocesos (por ejemplo, ThreadLocal, pools).
A partir de Java 8, se puede usar DateTimeFormatter junto con la API de Java 8 Time para analizar y formatear las fechas. De la documentación:
Esta clase es inmutable y segura para subprocesos.
Se recomienda usar esta clase si es posible para el trabajo nuevo en el futuro en lugar de usar SimpleDateFormat.
El ''problema'' con SimpleDateFormat no es el rendimiento, su seguridad de subprocesos.
Si tiene miles de subprocesos y la sincronización no es un problema, use la sincronización (también puede agrupar las instancias para aliviar esto un poco)
Si tiene una cantidad razonable de subprocesos, la forma recomendada es tener una instancia separada para cada SimpleDateFormat.
ACTUALIZAR
A partir de Java 8, solo use DateTimeFormatter
. Es inmutable, seguro para hilos, más rápido y más flexible. (También ofrece características agradables como patrones predeterminados para cadenas de fecha / hora ISO-8601).
En la mejor de las suposiciones, es mantener FastDateFormat ... bueno ... rápido, limitándolo a la visualización solamente.
Apache Commons DateUtils
tiene una función parseDate
, pero que usa SimpleDateFormat
internamente.
Una alternativa es usar la biblioteca JodaTime . Es un reemplazo completo para tratar con los DateFormat
, Date
y Calendar
.
JodaTime tiene un DateTimeFormatter
que se puede usar para crear objetos DateTime
(el equivalente de JodaTime de los objetos Date
de Java) a partir de cadenas.
Un ejemplo de cómo usarlo es el siguiente:
String strInputDateTime = "2010-12-27"; // An example, this would really come from outside
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dt = fmt.parseDateTime(strInputDateTime);
Aunque no sé si esto es realmente más rápido que SimpleDateFormat
.
Encontré algo interesante aquí de este caso en Android: http://andmob.wikidot.com/faq-simpletimeformat
SimpleDateFormat, la primera vez que intente analizar (o, presumiblemente, formatear) una fecha, se cargará en todos los datos de la zona horaria para su ubicación. Esto llevará 2-3 segundos. Se espera que esto se solucione en una futura edición de Android.
Mientras tanto, considere usar AsyncTask para "calentar" SimpleDateFormat en su proceso antes de que lo necesite. Simplemente analice alguna fecha en AsyncTask doInBackground () para que cargue las zonas horarias en algún momento en que no afecte tanto al usuario. Una vez que se haya iniciado en su proceso, SimpleDateFormat se ejecutará rápidamente hasta que finalice su proceso.
Tenga en cuenta que desde commons-lang 3.2, FastDateFormat admite el análisis y la impresión.