J'ai un problème pendant que j'essaye de convertir une chaîne en un TimeStamp. J'ai un tableau qui a la date dans le format de yyyy-MM-dd
et je veux changer dans le format de yyyy-MM-dd HH:mm:ss.SSS
. Donc, j'utilise ce code:
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);
et j'obtiens le résultat suivant.
2009-10-20 00: 00: 00.000
2009-10-20 00: 00: 00.0
mais quand j'essaie de faire simplement
String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);
J'obtiens le bon résultat:
2011-10-02 18: 48: 05.123
Savez-vous ce que je pourrais faire de mal? Merci pour l'aide.
Suivez ces étapes pour un résultat correct:
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
}
Veuillez noter que .parse(String)
peut émettre un ParseException
.
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;
}
}
}
Je voudrais apporter la réponse moderne. Lorsque cette question a été posée en 2013, il était correct d'utiliser la classe Timestamp
, par exemple pour stocker une date-heure dans votre base de données. Aujourd'hui, la classe est dépassée depuis longtemps. L'API Java de date et heure modernes est née avec Java 8 au printemps 2014, il y a trois ans et demi. Je vous recommande de l'utiliser à la place.
Selon votre situation et vos besoins, il existe deux substituts naturels à Timestamp
:
Instant
est un point sur la ligne de temps. Pour la plupart des cas, je considérerais qu'il est le plus sûr de l'utiliser. Une Instant
est indépendante du fuseau horaire et fonctionnera généralement bien même dans les cas où votre machine cliente et votre serveur de base de données exécutent des fuseaux horaires différents.LocalDateTime
est une date et une heure sans fuseau horaire, comme 2011-10-02 18: 48: 05.123 (pour citer la question).Un pilote JDBC moderne (JDBC version 4.2 ou supérieure) et d'autres outils modernes d'accès à une base de données seront heureux de stocker une variable Instant
ou une variable LocalDateTime
dans la colonne de base de données de type timestamp
. Les deux classes et les autres classes date-heure que j'utilise dans cette réponse appartiennent à l'API moderne connue sous le nom de Java.time
ou JSR-310.
Il est plus facile de convertir votre chaîne en LocalDateTime
. Commençons donc par ceci:
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);
Cette imprime
2011-10-02T18:48:05.123
Si votre chaîne était au format aaaa-MM-jj, faites plutôt:
String text = "2009-10-20";
LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
System.out.println(dateTime);
Cette imprime
2009-10-20T00:00
Ou mieux encore, prenez le résultat de LocalDate.parse()
et stockez-le dans une colonne de base de données de type date
.
Dans les deux cas, la procédure de conversion d'une LocalDateTime
en une Instant
est la suivante:
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(ts);
J’ai spécifié une conversion en utilisant le fuseau horaire par défaut de la machine virtuelle, car c’est ce que la classe obsolète aurait utilisée. Ceci est toutefois fragile, car le réglage du fuseau horaire peut être modifié sous nos pieds par d’autres parties de votre programme ou par d’autres programmes exécutés sur la même machine virtuelle. Si vous le pouvez, spécifiez un fuseau horaire au format région/ville à la place, par exemple:
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = formatter.parse(dateString);
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println(timestamp);
convertissez d'abord votre chaîne de date en date
puis convertissez-la en timestamp
en utilisant le jeu de lignes suivant
Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
Java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
Je suis sûr que la solution est que oldDateString ressemble à "2009-10-20". Évidemment, cela ne contient aucune donnée temporelle inférieure à jours. Si vous formatez cette chaîne avec votre nouveau formateur, où doit-il extraire les minutes, les secondes et les millisecondes?
Le résultat est donc tout à fait correct: 2009-10-20 00: 00: 00.000
Ce qu'il vous faut pour résoudre ce problème, c'est l'horodatage d'origine (y compris les données temporelles) avant votre premier formatage.
Le moyen le plus simple pour convertir String en Java.sql.Timestamp:
Timestamp t = new Timestamp(DateUtil.provideDateFormat().parse("2019-01-14T12:00:00.000Z").getTime());
pouvez-vous l'essayer une fois ...
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);
}
}