2015-04-28 14 views
7

Sto provando a convertire un Date in un LocalTime (desidero solo le ore e i minuti della data) ma non sta funzionando. Ho guardato qui date-to-java-time e tenta di convertire un Date a LocalTime, ma che non ha funzionato così ho cercato di convertire i Date a Calendar e poi convertire Calendar a Date ma che anche non ha funzionato.Come convertire Data in LocalTime?

Penso che sia perché date memorizza l'ora in fasttime anziché cdate. Ma è solo una sensazione istintiva. Qui è il mio codice:

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

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

//convert the date to a local time 
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis()); 
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime(); 

non ottengo un errore di compilazione, ma le LocalTime sue ore non sono impostati e rimango 0.

+0

Per prima cosa, quale versione di Java stiamo parlando? –

+0

@ RafaelR.S.Robles JDK 1.8 – Stanko

risposta

9

L'input è effettivamente un LocalDateTime. Sarebbe molto più semplice semplicemente analizzarlo a un LocalDateTime e quindi ottenere il LocalTime da quello. Non ci sono zone di tempo di cui preoccuparsi, non le classi po-legacy (evitare Date e Calendar se possibile, ...)

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); 
    } 
} 
0

Prova questa

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

Sciocco per mescolare le vecchie classi fastidiose con le classi java.time. Le vecchie classi sono ora soppiantate dalle classi java.time. Non c'è bisogno di quelli vecchi. –

7

Questo è anche abbastanza semplice: LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()

2

Il accepted Answer by Jon Skeet è corretto. Questa risposta si espande su quelle idee.

Evitare legacy classi data-ora

Alcune delle altre risposte, e la questione, si mescolano le vecchie classi legacy data-ora con il nuovo. Questa è una pratica inutile e cattiva. L'intero punto delle classi java.time è sostituire le classi vecchie fastidiose e confuse.

  • Fate non bisogno java.util.Date.
  • non necessario java.util.Calendar.

LocalDateTime

La stringa di input è priva di qualsiasi informazioni su offset da-UTC o il fuso orario. Quindi lo analizziamo come un oggetto LocalDateTime.

Per analizzare, sostituiamo lo SPAZIO nel mezzo con uno T conforme allo standard ISO 8601 per i formati di data e ora.

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

LocalTime

a concentrarsi sul momento della giornata senza la data, per chiedere un LocalTime.

LocalTime lt = ldt.toLocalTime(); 

ZonedDateTime

Nota che niente di tutto questo sono momenti reali, non un punto sulla timeline. Senza il contesto di un offset da UTC o un fuso orario, non sappiamo se volevi dire 5 AM a Auckland NZ o 5 AM a Kolkata IN o 5 AM a Parigi Francia o alle 5 AM a Montréal Québec. Ognuno di questi sarebbe momenti molto diversi nel tempo.

Se dal contesto si conosce per certo il fuso orario desiderato, applicarlo. Applicare uno ZoneId per ottenere uno ZonedDateTime.

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

Da lì, chiedere il LocalTime se lo si desidera.

LocalTime lt = zdt.toLocalTime(); 

Instant

Se volete vedere quello stesso momento in UTC, estrarre un Instant. La classe Instant rappresenta un momento nella timeline in UTC con una risoluzione di nanoseconds (fino a nove (9) cifre di una frazione decimale).

In genere è meglio concentrarsi su UTC in gran parte della logica aziendale, della registrazione, dell'archiviazione dei dati e dello scambio di dati. Impara a pensare a UTC come "The One True Time".

Instant instant = zdt.toInstant(); // Same moment, shifted to UTC. 
Problemi correlati