2 votes

Java 8 - SQL Timestamp to Instant avec l'heure correctement formatée

J'ai lu les questions et réponses disponibles sur SO, mais je n'ai rien trouvé qui réponde à ma question de savoir comment formater mon temps au format 12h.

Voici mon code qui exécute une requête sur une base de données MySQL et renvoie les résultats, en vérifiant si un rendez-vous a lieu dans les 15 minutes suivant la connexion, afin de déclencher une alerte.

public void apptCheck(int userId) throws SQLException {

        // this method checks for an appointment occurring within 15 minutes of login

        Statement apptStatement = DBQuery.getStatement();
        String apptQuery = "Select apt.start, cs.customerName from DBName.appointment apt "
                + "JOIN DBName.customer cs ON cs.customerId = apt.customerId WHERE "
                + "userId = " + userId + " AND start >= NOW() AND start < NOW() + interval 16 minute";
        apptStatement.execute(apptQuery);
        ResultSet apptRs = apptStatement.getResultSet();
        while(apptRs.next()) {
            Timestamp apptTime = apptRs.getTimestamp("start");

            ResourceBundle languageRB = ResourceBundle.getBundle("wgucms/RB", Locale.getDefault());
            Alert apptCheck = new Alert(AlertType.INFORMATION);
            apptCheck.setHeaderText(null);
            apptCheck.setContentText(languageRB.getString("apptSoon") + " " + apptTime.toInstant().atZone(ZoneId.systemDefault()));

            apptCheck.showAndWait();

        } 

Mon résultat est le suivant :

enter image description here

Je veux que l'heure affiche 3:00, et non 19:00 - 06:00. Comment puis-je y parvenir ?

0voto

KeithG Points 126

J'ai trouvé la solution qui permet de convertir l'heure UTC en heure locale, puis de formater l'heure de manière à ce que l'alerte résultante soit au format 12 heures, sans la date ni les informations relatives au fuseau horaire. Voici le code complet :

while(apptRs.next()) {
        Timestamp apptTime = apptRs.getTimestamp("start");

        // perform time conversion from UTC to User Local Time
        ZoneId zidApptTime = ZoneId.systemDefault();
        ZonedDateTime newZDTApptTime = apptTime.toLocalDateTime().atZone(ZoneId.of("UTC"));
        ZonedDateTime convertedApptTime = newZDTApptTime.withZoneSameInstant(zidApptTime);

        ResourceBundle languageRB = ResourceBundle.getBundle("wgucms/RB", Locale.getDefault());
        Alert apptCheck = new Alert(AlertType.INFORMATION);
        apptCheck.setHeaderText(null);

        // set the Alert text and format in 12 hour format
        apptCheck.setContentText(languageRB.getString("apptSoon") + 
                convertedApptTime.toInstant().atZone(ZoneId.systemDefault())
                        .format(DateTimeFormatter.ofPattern("h:mm a")) + ".");

        apptCheck.showAndWait();

    }

0voto

Inanc Cakil Points 94
 ZonedDateTime zonedDateTime=ZonedDateTime.of(apptTime.toLocalDateTime(),ZoneId.systemDefault());

Vous pouvez utiliser ZonedDateTime et formater l'heure comme vous le souhaitez.

docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html ZonedDateTime a beaucoup de fonctionnalités que vous pouvez voir ici et vous pouvez obtenir l'heure, la minute, le jour, etc.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss"); 
String formattedString = zonedDateTime.format(formatter); 

Si vous ne voulez que l'heure au format 12h, vous pouvez utiliser ceci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X