2011-03-02 27 views
5

Estoy usando Java 6, y tengo un tiempo de la fecha actual como una cadena, como esta: 14:21:16, y necesito convertir esto a Timestamp object para almacenar en un base de datos.Java: convertir un tiempo a partir de hoy en una marca de tiempo

Sin embargo, parece que no hay una buena manera de obtener una marca de tiempo de esto. Timestamp.valueOf(String) está bastante cerca, pero requiere una fecha. ¿Hay una buena manera de hacer un objeto Timestamp a partir de una cadena?

Respuesta

5

¿qué tal esto:

final String str = "14:21:16"; 
final Timestamp timestamp = 
    Timestamp.valueOf(
     new SimpleDateFormat("yyyy-MM-dd ") 
     .format(new Date()) // get the current date as String 
     .concat(str)  // and append the time 
    ); 
System.out.println(timestamp); 

salida:

2011-03-02 14: 21: 16,0

+0

Gracias por su respuesta, de hecho funciona :) –

+0

+1 sobre la base de que funciona, y parece ser fácil encontrar respuestas que no existen por razones que no entendemos. –

+0

@Tom sí, la API de fecha de Java es horrible, pero creo que una respuesta funcional sin bibliotecas externas es imprescindible (aunque me gusta más la respuesta de Jon Skeet) –

6

En lo personal, yo usaría Joda Time para analizar el tiempo a un LocalTime, y añadir que a día de hoy de LocalDate para obtener una LocalDateTime, a continuación, convertir que en un Instant usando todo el tiempo que la zona que le interesa. (O utilice LocalTime.toDateTimeToday(DateTimeZone).)

a continuación, basta con crear una marca de tiempo con el constructor Timestamp(long).

Hay un montón de otros enfoques (por ejemplo, utilizando SimpleDateFormat en lugar de analizar con Joda Time, si realmente quiere ...) pero en última instancia es muy probable que desee el constructor Timestamp(long) al final. (La ventaja de utilizar Joda El tiempo aquí es que es obvio lo que está siendo representado en cada etapa -. Usted no está tratando de tratar a un "momento único" como "fecha y hora" o viceversa)

0
String str = "14:21:16"; 
DateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
Date date = formatter.parse(str); 
Timestamp timestamp = new Timestamp(date.getTime()); 
+0

comprueba qué 'System.out.println (timestamp)' muestra y verás que no es la fecha actual. –

1

Use org.apache.commons.lang.time.DateUtils:

Date today = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);  
DateFormat df = new SimpleDateFormat("HH:mm:ss"); 
Date time = df.parse("14:21:16"); 
Timestamp time = new Timestamp(today.getTime() + time.getTime()); 
+0

+1 para obtener una mejor forma de obtener el valor de tiempo para el comienzo de hoy, aunque requiere org.apache.commons.lang.time.DateUtils –

+0

Bueno, también podría hacer 'long millisToday = new Date(). getTime()/86400000; // 86400000 el número de milisegundos por día ' – Thomas

+0

Por cierto, la biblioteca Apache commons-lang proporciona tantas utilidades útiles que hará que su vida sea mucho más fácil cuando lo use. – Thomas

4

mejor que pueda surgir con el uso de la API estándar no es tan bonito:

// Get today's date and time. 
    Calendar c1 = Calendar.getInstance(); 
    c1.setTime(new Date()); 

    // Get the required time of day, copy year, month, day. 
    Calendar c2 = Calendar.getInstance(); 
    c2.setTime(java.sql.Time.valueOf("14:21:16")); 
    c2.set(Calendar.YEAR, c1.get(Calendar.YEAR)); 
    c2.set(Calendar.MONTH, c1.get(Calendar.MONTH)); 
    c2.set(Calendar.DAY_OF_MONTH, c1.get(Calendar.DAY_OF_MONTH)); 

    // Construct required java.sql.Timestamp object. 
    Timestamp time = new Timestamp(c2.getTimeInMillis()); 

    Let's see what we've done. 
    System.out.println(time); 

Tenga en cuenta que java.sql.Time. valueOf acepta una cadena de la forma "HH: MM: SS" como lo requiera. Otros formatos requerirían el uso de SimpleDateFormat.

+0

Gracias por su respuesta, de hecho estaba interesado en una solución que utiliza solo la API estándar. –

+0

Respuesta totalmente válida, que no es agradable no es tu culpa :-) (+1) –

Cuestiones relacionadas