web-dev-qa-db-fra.com

Heure locale à partir de la date

J'essaie de convertir une instance Date en une instance LocalTime.

// Create the Date
Date date = format.parse("2011-02-18 05:00:00.0");    

// Convert to Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

// Convert Calendar to LocalTime
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis());
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();

Je ne reçois pas d'erreur de compilation, mais les valeurs d'instance LocalTime sont incorrectes.

Je pense que cela ne fonctionne pas car Date enregistre le temps dans fasttime au lieu de cdate.

J'utilise JDK version 1.8.

11
Stanko

Votre contribution est effectivement une LocalDateTime. Il serait beaucoup plus simple d'analyser simplement cela dans un LocalDateTime et d'obtenir ensuite le LocalTime à partir de cela. Pas de fuseau horaire à prendre en compte, pas de classes quelque peu héritées (évitez Date et Calendar si possible ...)

import Java.time.*;
import Java.time.format.*;
import Java.util.*;

public class Test {

    public static void main(String[] args) {
        DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US);

        String text = "2011-02-18 05:00:00.0";
        LocalDateTime localDateTime = LocalDateTime.parse(text, formatter);
        LocalTime localTime = localDateTime.toLocalTime();
        System.out.println(localTime);
    }
}
11
Jon Skeet

C'est aussi très simple: LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()

9
johanwannheden

Le réponse acceptée par Jon Skeet est correct. Cette réponse développe ces idées.

Évitez les anciennes classes date-heure

Certaines des autres réponses, ainsi que la question, mélangent les anciennes classes date-heure héritées avec les nouvelles. C'est inutile et c'est une mauvaise pratique. L'intérêt des classes Java.time est de remplacer les anciennes classes gênantes et déroutantes.

  • Vous n'avez pas besoin de Java.util.Date
  • Vous n'avez pas besoin de Java.util.Calendar.

LocalDateTime

Votre chaîne d'entrée ne contient aucune information sur le décalage par rapport à UTC ou le fuseau horaire. Nous l’analysons donc comme un objet LocalDateTime .

Pour analyser, nous remplaçons l’ESPACE au milieu par un T afin de respecter la norme ISO 8601 pour les formats date-heure.

String input = "2011-02-18 05:00:00.0".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );

LocalTime

Pour vous concentrer sur l'heure sans la date, demandez un LocalTime .

LocalTime lt = ldt.toLocalTime();

ZonedDateTime

Notez qu’il ne s’agit pas de moments réels, ni de points sur la timeline. Sans le contexte d'un décalage par rapport à UTC ou à un fuseau horaire, nous ne savons pas si vous vouliez parler de 5 heures à Auckland NZ ou de 5 heures à Kolkata IN ou de 5 heures à Paris en France ou de 5 heures à Montréal au Québec. Chacun de ces moments serait très différent dans le temps.

Si, par contexte, vous connaissez avec certitude le fuseau horaire prévu, appliquez-le. Appliquez un ZoneId pour obtenir un ZonedDateTime .

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

À partir de là, demandez la LocalTime si vous le souhaitez.

LocalTime lt = zdt.toLocalTime(); 

Instant

Si vous voulez voir le même moment dans UTC , extrayez une Instant. La classe Instant représente un moment sur la ligne temporelle en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).

Il est généralement préférable de se concentrer sur UTC dans une grande partie de votre logique d’entreprise, de la journalisation, du stockage et de l’échange de données. Apprenez à penser à UTC comme «Le seul vrai temps».

Instant instant = zdt.toInstant();  // Same moment, shifted to UTC.
3
Basil Bourque

Essaye ça

    String datestring = "2011-02-18 05:00:00.0";
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//take a look at MM
    Date date = dt.parse(datestring );
    Instant instant = Instant.ofEpochMilli(date.getTime());
    LocalTime res = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
0
user4624062