Comment puis-je convertir 'timeStamp' en date
après avoir obtenu le décompte en java?
Mon code actuel est le suivant:
public class GetCurrentDateTime {
public int data() {
int count = 0;
java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
java.sql.Date date = new java.sql.Date(timeStamp.getTime());
System.out.println(date);
//count++;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");
PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
ResultSet result = statement.executeQuery();
while (result.next()) {
// Do something with the row returned.
count++; //if the first col is a count.
}
} catch (Exception exc) {
System.out.println(exc.getMessage());
}
return count;
}
}
Voici ma base de données:
Ici, la sortie que j'ai obtenue était 2012-08-07 0, mais la requête équivalente renvoie 3. Pourquoi est-ce que j'obtiens 0?
PreparedStatement
avec une syntaxe incorrecte. Vous ne pouvez pas incorporer de variables Java dans le texte de votre chaîne SQL. À la place, intégrez?
la chaîne SQL, puis appelez lesset
méthodes pour transmettre des valeurs à PreparedStatement. Voir la bonne réponse de Sujay et la réponse de tenorsax .Réponses:
Créez simplement un nouvel
Date
objet avec lagetTime()
valeur du tampon comme paramètre.Voici un exemple (j'utilise un exemple d'horodatage de l'heure actuelle):
la source
la source
Juste:
la source
Je cherche cela depuis longtemps, il s'avère que le convertisseur Eposh le fait facilement:
Ou le contraire:
la source
tl; dr
…
…
…
java.time
Vous utilisez d'anciennes classes date-heure gênantes qui sont maintenant héritées, supplantées par les classes java.time modernes .
Apparemment, vous stockez un moment dans votre base de données dans une colonne d'un type entier. C'est malheureux. Vous devriez plutôt utiliser une colonne d'un type tel que la norme SQL
TIMESTAMP WITH TIME ZONE
. Mais, pour cette réponse, nous travaillerons avec ce que nous avons.Si vos enregistrements représentent des moments avec une résolution de quelques millisecondes et que vous voulez tous les enregistrements pour une journée entière, nous avons besoin d'une plage horaire. Nous devons avoir un moment de départ et un moment d'arrêt. Votre requête n'a qu'un seul critère date-heure où elle aurait dû avoir une paire.
La
LocalDate
classe représente une valeur de date uniquement sans heure du jour et sans fuseau horaire.Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde entier par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il est encore «hier» à Montréal Québec .
Si aucun fuseau horaire n'est spécifié, la machine virtuelle Java applique implicitement son fuseau horaire par défaut actuel. Cette valeur par défaut peut changer à tout moment, vos résultats peuvent donc varier. Mieux vaut spécifier explicitement votre fuseau horaire souhaité / attendu comme argument.
Indiquez un nom de fuseau horaire approprié dans le format
continent/region
, tels queAmerica/Montreal
,Africa/Casablanca
ouPacific/Auckland
. N'utilisez jamais l'abréviation de 3 à 4 lettres telle queEST
ouIST
car ce ne sont pas de vrais fuseaux horaires, non standardisés et même pas uniques (!).Si vous souhaitez utiliser le fuseau horaire par défaut actuel de la JVM, demandez-le et passez-le en argument. En cas d'omission, la valeur par défaut actuelle de la JVM est appliquée implicitement. Mieux vaut être explicite, car la valeur par défaut peut être modifiée à tout moment pendant l'exécution par n'importe quel code dans n'importe quel thread de n'importe quelle application dans la JVM.
Ou spécifiez une date. Vous pouvez définir le mois par un nombre, avec une numérotation sensée de 1 à 12 pour janvier-décembre.
Ou, mieux, utilisez les
Month
objets enum prédéfinis, un pour chaque mois de l'année. Conseil: utilisez cesMonth
objets dans toute votre base de code plutôt qu'un simple nombre entier pour rendre votre code plus auto-documenté, garantir des valeurs valides et assurer la sécurité de type .Avec un
LocalDate
en main, nous devons ensuite transformer cela en une paire de moments, le début et la fin de la journée. Ne supposez pas que la journée commence à 00:00:00 heure de la journée. En raison d'anomalies telles que l'heure d'été (DST), la journée peut commencer à une autre heure telle que 01:00:00. Laissez donc java.time déterminer le premier moment de la journée. Nous passons unZoneId
argument àLocalDate::atStartOfDay
pour rechercher de telles anomalies. Le résultat est unZonedDateTime
.Généralement, la meilleure approche pour définir un intervalle de temps est l'approche semi-ouverte où le début est inclusif tandis que la fin est exclusive . Ainsi, une journée commence par son premier moment et court jusqu'au premier moment du lendemain, mais sans l'inclure.
Notre requête pour une journée entière ne peut pas utiliser la commande SQL
BETWEEN
. Cette commande est entièrement fermée ([]
) (le début et la fin sont inclusifs) où, comme nous le voulons, semi-ouvert ([)
). Nous utilisons une paire de critères>=
et<
.Votre colonne est mal nommée. Évitez les milliers de mots réservés par diverses bases de données. Utilisons
placed
dans cet exemple.Votre code doit avoir utilisé des
?
espaces réservés pour spécifier nos moments.Mais nous avons des
ZonedDateTime
objets en main, alors que votre base de données stocke apparemment des entiers comme indiqué ci-dessus. Si vous aviez défini correctement votre colonne, nous pourrions simplement passer lesZonedDateTime
objets avec n'importe quel pilote JDBC prenant en charge JDBC 4.2 ou version ultérieure.Mais à la place, nous devons obtenir un compte à partir de l'époque en secondes entières. Je suppose que votre date de référence d'époque est le premier moment de 1970 en UTC. Méfiez-vous des pertes de données possibles, car la
ZonedDateTime
classe est capable d'une résolution nanoseconde. Toute fraction de seconde sera tronquée dans les lignes suivantes.Nous sommes maintenant prêts à transmettre ces entiers à notre code SQL défini ci-dessus.
Lorsque vous récupérez vos valeurs entières dans le
ResultSet
, vous pouvez les transformer enInstant
objets (toujours en UTC) ou enZonedDateTime
objets (avec un fuseau horaire attribué).À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
Tout d'abord, vous ne tirez pas parti de l'avantage d'utiliser un fichier
PreparedStatement
. Je vous suggère d'abord de modifier votrePreparedStatement
comme suit:Vous pouvez ensuite utiliser
statement.setXX(param_index, param_value)
pour définir les valeurs respectives. Pour la conversion entimestamp
, jetez un œil aux javadocs suivants:PreparedStatement.setTimeStamp ()
Horodatage
J'espère que cela t'aides!
la source
Dans Android, c'est très simple. Utilisez simplement la classe Calender pour obtenir currentTimeMillis.
En Java, utilisez simplement System.currentTimeMillis () pour obtenir l'horodatage actuel
la source
Vous ne savez pas ce que vous essayez de sélectionner dans la requête, mais gardez à l'esprit que
UNIX_TIMESTAMP()
sans arguments renvoie l'heure maintenant. Vous devriez probablement fournir une heure valide comme argument ou modifier la condition.ÉDITER:
Voici un exemple de requête limitée dans le temps basée sur la question:
EDIT: colonne d'horodatage
En cas d'utilisation d'horodatage
java.sql.Timestamp
et de PreparedStatement.setTimestamp () , c'est-à-dire:la source
new Date(timestamp.getTime())
devrait fonctionner, mais la nouvelle méthode sophistiquée de Java 8 (qui peut être plus élégante et plus sûre de type, ainsi que vous aider à utiliser les nouvelles classes de temps) consiste à appelerDate.from(timestamp.toInstant())
.(Ne vous fiez pas au fait qu'il
Timestamp
est lui - même une instance deDate
; voir l'explication dans les commentaires d' une autre réponse .)la source
la source
Je me sens obligé de répondre car d'autres réponses semblent être indépendantes du fuseau horaire, ce qu'une application du monde réel ne peut pas se permettre. Pour que la conversion d'horodatage à date soit correcte lorsque l'horodatage et la JVM utilisent des fuseaux horaires différents, vous pouvez utiliser LocalDateTime de Joda Time (ou LocalDateTime en Java8) comme ceci:
L'exemple ci-dessous suppose que l'horodatage est UTC (comme c'est généralement le cas avec les bases de données). Si vos horodatages sont dans un fuseau horaire différent, modifiez le paramètre de fuseau horaire de l'
toDate
instruction.la source
essayez d'utiliser ce code java:
la source
En supposant que vous ayez un préexistant
java.util.Date date
:la source
Vous pouvez utiliser cette méthode pour obtenir la date à partir de l'horodatage et du fuseau horaire d'une zone particulière.
la source
la source
la source