EDIT: me había perdido la parte "haciendo caso omiso de la hora del día". Es ahora presente, pero cerca del final ...
El enfoque más simple es probablemente usar SimpleDateFormat
, habiendo establecer la zona horaria apropiada:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = format.parse(text);
long millis = date.getTime();
(Ajuste de la zona horaria es la parte importante aquí, ya de lo contrario, va a interpretar el valor de estar en la zona horaria local de .)
alternativa, si estás haciendo algo menos trivial que esto, utilizar Joda Time que es un mucho mejor API de fecha/hora. En particular, SimpleDateFormat
no es seguro para subprocesos mientras que DateTimeFormatter
es:
// This can be reused freely across threads after construction.
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.withLocale(Locale.US)
.withZoneUTC();
// Option 1
DateTime datetime = formatter.parseDateTime(text);
long millis = dateTime.getMillis();
// Option 2, more direct, but harder to diagnose errors
long millis = formatter.parseMillis(text);
Ahora hasta ahora, hemos analizado sintácticamente todo el caboodle entero. La forma más fácil de ignorar la parte de fecha es sólo para redondearlo - después de todo, Java no observa los segundos intercalares, por lo que sólo puede truncar:
long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit
long dayMillis = (millis/millisPerDay) * millisPerDay;
que la voluntad "redondo hacia 1970" por lo que si tener una fecha antes de 1970 redondeará al final del día, pero sospecho que es poco probable que sea un problema.
Con la versión Joda Time usted podría utilizar esto en su lugar:
DateTime dateTime = formatter.parseDateTime(text);
long millis = dateTime.toLocalDate().getLocalMillis();
yo personalmente no ir con la idea de tomar una subcadena. Aunque en realidad no está interesado en preservando la hora/minuto/segundo, creo que es apropiado analizar lo que le han dado y , luego descartar información. Aparte de cualquier otra cosa, hace que tu código no funcione correctamente con datos incorrectos, p.
"2012-06-100"
o
"2012-06-14 25:01:25"
indicar problemas en lo que eres tú el suministro de datos, y es bueno para detectar que en lugar de seguir ciegamente sólo porque los primeros 10 caracteres están bien.
Desde OP sólo quiere la fecha, me subcadena (0,10) primero y analizar sólo la fecha. –
@PeterLawrey: ¡Realmente me había perdido esa parte! Editará ... –
@PeterLawrey: He argumentado en contra de la llamada subserie al final de la publicación. –