Comment convertir TimeStamp en date en Java?


105

Comment puis-je convertir 'timeStamp' en dateaprè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: entrez la description de l'image ici

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?



Pouvez-vous nous montrer des exemples de ce à quoi ressemblent les données du tableau?
oldrinb

date (1344255451,1344255537,1344312502) et statut ont (Q, Q, Q)
Krishna Veni


Le titre de cette question est un hareng rouge . Le vrai problème est l'utilisation incorrecte d'un PreparedStatementavec 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 les setméthodes pour transmettre des valeurs à PreparedStatement. Voir la bonne réponse de Sujay et la réponse de tenorsax .
Basil Bourque

Réponses:


188

Créez simplement un nouvel Dateobjet avec la getTime()valeur du tampon comme paramètre.

Voici un exemple (j'utilise un exemple d'horodatage de l'heure actuelle):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 Qu'est-ce qui vous fait penser qu'il est obsolète? Les derniers documents java 7 et 8 disent le contraire ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () et docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman

4
Cela produira un résultat incorrect si le fuseau horaire d'horodatage et le fuseau horaire JVM sont différents.
Robert Mugattarov

Comment le mettre en forme au 14.03.2014 par exemple?
shurrok le

6
Je déteste quand les personnes utilisent des bibliothèques dans leurs réponses et je m'attends à ce que tout le monde sache comment les importer: /
Sodj

38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();

Pourquoi l'avez-vous multiplié par 1000?
Sharpless512

3
Parce que l'initialisation de la date est en millisecondes et l'horodatage est en secondes! Idem pour toutes les autres conversions! C'est bon ?
VincentLamoute

10

Juste:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());

7

Je cherche cela depuis longtemps, il s'avère que le convertisseur Eposh le fait facilement:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

Ou le contraire:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));

6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

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 LocalDateclasse 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 que America/Montreal, Africa/Casablancaou Pacific/Auckland. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que ESTou ISTcar ce ne sont pas de vrais fuseaux horaires, non standardisés et même pas uniques (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

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.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Ou, mieux, utilisez les Monthobjets enum prédéfinis, un pour chaque mois de l'année. Conseil: utilisez ces Monthobjets 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 .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Avec un LocalDateen 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 un ZoneIdargument à LocalDate::atStartOfDaypour rechercher de telles anomalies. Le résultat est un ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

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.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

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 placeddans cet exemple.

Votre code doit avoir utilisé des ?espaces réservés pour spécifier nos moments.

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

Mais nous avons des ZonedDateTimeobjets 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 les ZonedDateTimeobjets 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 ZonedDateTimeclasse est capable d'une résolution nanoseconde. Toute fraction de seconde sera tronquée dans les lignes suivantes.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

Nous sommes maintenant prêts à transmettre ces entiers à notre code SQL défini ci-dessus.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

Lorsque vous récupérez vos valeurs entières dans le ResultSet, vous pouvez les transformer en Instantobjets (toujours en UTC) ou en ZonedDateTimeobjets (avec un fuseau horaire attribué).

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

À 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, et SimpleDateFormat.

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?

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

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, YearQuarteret plus .


4

Tout d'abord, vous ne tirez pas parti de l'avantage d'utiliser un fichier PreparedStatement. Je vous suggère d'abord de modifier votre PreparedStatementcomme suit:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

Vous pouvez ensuite utiliser statement.setXX(param_index, param_value)pour définir les valeurs respectives. Pour la conversion en timestamp, jetez un œil aux javadocs suivants:

PreparedStatement.setTimeStamp ()
Horodatage

J'espère que cela t'aides!


4

Dans Android, c'est très simple. Utilisez simplement la classe Calender pour obtenir currentTimeMillis.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

En Java, utilisez simplement System.currentTimeMillis () pour obtenir l'horodatage actuel


3

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:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

EDIT: colonne d'horodatage

En cas d'utilisation d'horodatage java.sql.Timestampet de PreparedStatement.setTimestamp () , c'est-à-dire:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);

maintenant ma condition est select * de xcart_orders où status = 'Q' AND date = CURDATE (). maintenant également affiché zéro seulement
Krishna Veni

@krishnaveni quels enregistrements essayez-vous de sélectionner?
ténorsax

date (11111111,123456767,122333344) et status = (Q, Q, Q) .. tous sont enregistrés dans ma base de données.Maintenant, je souhaite avoir besoin de vérifier la requête et d'obtenir la valeur de comptage et d'afficher sur ma console (c'est-à-dire) combien les données sont mises en correspondance après avoir renvoyé la valeur de comptage
Krishna Veni

@krishnaveni Si vous souhaitez que l'ensemble de résultats soit lié à une certaine date, utilisez cette date dans la requête, sinon supprimez la condition de date.
tenorsax

dans mon code fonctionne avec succès lorsque la date est au format aaaa-mm-jj enregistré dans ma base de données. Mais maintenant, ma date est enregistrée dans un horodatage dans ce format 1343469690. Comment obtenir la valeur de comptage? Comment puis-je écrire un code ici
Krishna Veni

3

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 à appeler Date.from(timestamp.toInstant()).

(Ne vous fiez pas au fait qu'il Timestampest lui - même une instance de Date; voir l'explication dans les commentaires d' une autre réponse .)


3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());

3

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:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

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' toDateinstruction.


2

essayez d'utiliser ce code java:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);

0

En supposant que vous ayez un préexistant java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );

0

Vous pouvez utiliser cette méthode pour obtenir la date à partir de l'horodatage et du fuseau horaire d'une zone particulière.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.