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.
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);
}
}
C'est aussi très simple:
LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()
Le réponse acceptée par Jon Skeet est correct. Cette réponse développe ces idées.
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.
Java.util.Date
. 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.
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();