entre - Java: Convertir cadenas en TimeStamp
hibernate date format (8)
Tengo un problema mientras trato de convertir un String en un TimeStamp. Tengo una matriz que tiene la fecha en el formato de yyyy-MM-dd
y quiero cambiar en el formato de yyyy-MM-dd HH:mm:ss.SSS
. Entonces, uso este código:
final String OLD_FORMAT = "yyyy-MM-dd";
final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
String oldDateString = createdArray[k];
String newDateString;
DateFormat formatter = new SimpleDateFormat(OLD_FORMAT);
Date d = formatter.parse(oldDateString);
((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT);
newDateString = formatter.format(d);
System.out.println(newDateString);
Timestamp ts = Timestamp.valueOf(newDateString);
System.out.println(ts);
y obtengo el siguiente resultado.
2009-10-20 00: 00: 00.000
2009-10-20 00: 00: 00.0
pero cuando intento simplemente hacer
String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);
Obtengo el resultado correcto:
2011-10-02 18: 48: 05.123
¿Sabes lo que podría estar haciendo mal? Gracias por la ayuda.
Estoy seguro de que la solución es que su oldDateString es algo así como "2009-10-20". Obviamente, esto no contiene datos de tiempo inferiores a días. Si formatea esta cadena con su nuevo formateador, ¿de dónde debería sacar los minutos, segundos y milisegundos?
El resultado es absolutamente correcto: 2009-10-20 00: 00: 00.000
Lo que necesitará para resolver esto es la marca de tiempo original (incluidos los datos de tiempo) antes de su primer formateo.
Me gustaría contribuir con la respuesta moderna. Cuando se formuló esta pregunta en 2013, el uso de la clase Timestamp
fue correcto, por ejemplo, para almacenar una fecha y hora en su base de datos. Hoy la clase está muy desactualizada. La moderna API de fecha y hora de Java salió con Java 8 en la primavera de 2014, hace tres años y medio. Recomiendo que uses esto en su lugar.
Dependiendo de su situación y de los requisitos exactos, hay dos reemplazos naturales para Timestamp
:
-
Instant
es un punto en la línea de tiempo. Para la mayoría de los propósitos, consideraría más seguro usar esto. UnInstant
es independiente de la zona horaria y generalmente funcionará bien incluso en situaciones donde su dispositivo cliente y su servidor de base de datos ejecutan diferentes zonas horarias. -
LocalDateTime
es una fecha y hora del día sin zona horaria, como 2011-10-02 18: 48: 05.123 (para citar la pregunta).
Un controlador JDBC moderno (JDBC 4.2 o superior) y otras herramientas modernas para el acceso a la base de datos estarán encantados de almacenar un Instant
o LocalDateTime
en la columna de la base de datos de la timestamp
de timestamp
del tipo de datos. Ambas clases y las otras clases de fecha y hora que estoy usando en esta respuesta pertenecen a la API moderna conocida como java.time
o JSR-310.
Es más fácil convertir la cadena a LocalDateTime
, así que vamos a tomar eso primero:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
String text = "2011-10-02 18:48:05.123";
LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
System.out.println(dateTime);
Esto imprime
2011-10-02T18:48:05.123
Si su cadena estaba en formato aaaa-MM-dd, en su lugar, haga lo siguiente:
String text = "2009-10-20";
LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
System.out.println(dateTime);
Esto imprime
2009-10-20T00:00
O aún mejor, tome el resultado de LocalDate.parse()
y guárdelo en una columna de base de datos con la date
del tipo de datos.
En ambos casos, el procedimiento para convertir de LocalDateTime
a Instant
es:
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(ts);
He especificado una conversión utilizando el huso horario predeterminado de la JVM porque esto es lo que la clase obsoleta habría usado. Sin embargo, esto es frágil, ya que la configuración de la zona horaria puede cambiarse bajo nuestros pies por otras partes de su programa o por otros programas que se ejecutan en la misma JVM. Si puede, especifique una zona horaria en el formato de región / ciudad , por ejemplo:
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
Siga estos pasos para obtener un resultado correcto:
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
Date parsedDate = dateFormat.parse(yourString);
Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
} catch(Exception e) { //this generic but you can control another types of exception
// look the origin of excption
}
Tenga en cuenta que .parse(String)
podría lanzar una ParseException
.
primero convierta su cadena de date
hasta la date
luego conviértala en timestamp
de timestamp
usando el siguiente conjunto de líneas
Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
puedes intentarlo una vez ...
String dob="your date String";
String dobis=null;
final DateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
final Calendar c = Calendar.getInstance();
try {
if(dob!=null && !dob.isEmpty() && dob != "")
{
c.setTime(df.parse(dob));
int month=c.get(Calendar.MONTH);
month=month+1;
dobis=c.get(Calendar.YEAR)+"-"+month+"-"+c.get(Calendar.DAY_OF_MONTH);
}
}
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = formatter.parse(dateString);
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println(timestamp);
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Util{
public static Timestamp convertStringToTimestamp(String str_date) {
try {
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
// you can change format of date
Date date = formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
return timeStampDate;
} catch (ParseException e) {
System.out.println("Exception :" + e);
return null;
}
}
}