Saltar al contenido

Conversión de fecha de cadena con nanosegundos

Por fin después de tanto batallar ya dimos con la respuesta de este atascamiento que muchos de nuestros lectores de este sitio web han presentado. Si tienes algún detalle que compartir no dejes de compartir tu información.

Solución:

El resultado que está obteniendo es absolutamente correcto.

Analicemos esto:

17.08.2012 05:35:19:7600000
  • 17: Día del mes (17)
  • 08: Mes del año (agosto)
  • 2012: Año (2012)
  • 05: Hora del día (5am)
  • 35: Minuto de hora (:35)
  • 19: Segundo de minuto (:19)
  • 7600000: Milisegundos de segundo (7,600,000)

Ahora, la forma en que la VM ve esto es que usted declara la hora del día como 5:35:19 a. m. y luego le agrega 7 600 000 milisegundos. 7.600.000 milisegundos = 7.600 segundos = 2 horas, 6 minutos, 40 segundos. 5:35:19 am + 02:06:40 = 7:41:59 am (y 0 milisegundos). Este es el resultado que está obteniendo. (También parece que no está configurando la zona horaria correctamente, por lo que el GMT string está 3 horas por detrás de su resultado).

Si desea conservar la :7600000, que yo sepa esto no es posible. Como esto se puede simplificar en segundos, la máquina virtual lo reducirá automáticamente a los otros incrementos de tiempo. Los milisegundos (el SSSS) debe ser para almacenar valores <1000.

Te sugiero que crees una nueva SimpleDateFormat para su salida; pero recuerde que los milisegundos serán absorbidos por los otros tiempos (ya que todos se almacenan como un solo long en el Date objeto).

    private String convertDate(String cdate)

    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");
    SimpleDateFormat postFormater = new SimpleDateFormat("yyyy-MM-dd");
    Date convertedDate;
    try
    
        convertedDate = dateFormat.parse(cdate);
        cdate = postFormater.format(convertedDate);
    
    catch (ParseException e)
    
        Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_SHORT).show();
    
    return cdate;

Prueba esto.

Esto es lo que necesita (pero perderá información de milisegundos):

"dd.MM.yyyy HH:mm:ss.'000000'"

si usaste "dd.MM.yyyy HH:mm:ss.SSSSSS"obtendría tres ceros a la izquierda para sus milisegundos.

si usaste "dd.MM.yyyy HH:mm:ss.SSS'000'"entonces podría formatear una fecha, pero no analizar ninguna fecha.

Pruébalo:

public static void main(String[] args) throws ParseException 
    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good


private static void printDate(String formatString) 
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // print that date
    System.out.println(formattedDate);


private static void tryToParseDate(String formatString) 
    Date now = new Date();
    SimpleDateFormat format = new SimpleDateFormat(formatString);
    String formattedDate = format.format(now);

    // try to parse it again
    try 
        format.parse(formattedDate);
        System.out.println("good");
     catch (ParseException e) 
        System.out.println("bad");
    

Reseñas y valoraciones del artículo

Si estás contento con lo expuesto, tienes la habilidad dejar un artículo acerca de qué te ha parecido este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *