2015-04-28 2 views
7

Я пытаюсь преобразовать Date в LocalTime (мне нужны только часы и минуты), но это не работает. Я первый посмотрел здесь date-to-java-time и попытаться преобразовать Date в LocalTime, но это не сработало, так что я пытался преобразовать Date в Calendar, а затем преобразовать Calendar в Date но также не работает.Как преобразовать Date в LocalTime?

Я думаю, это потому, что date хранит время в fasttime вместо cdate. Но это всего лишь ощущение кишки. Вот мой код:

//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(); 

Я не получаю ошибку компиляции, но LocalTime его часы не установлены и оставаться 0.

+0

Во-первых, о какой версии Java мы говорим? –

+0

@ RafaelR.S.Robles JDK 1.8 – Stanko

ответ

9

Ваш ввод эффективно LocalDateTime. Было бы намного проще просто разобрать это на LocalDateTime, а затем получить LocalTime. Никаких временных зон не беспокоиться о том, не несколько-унаследованных классов (во избежание Date и Calendar, где это возможно ...)

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

Попробуйте

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

Глупо смешивать неприятные старые классы с классами java.time. Старые классы теперь вытесняются классами java.time. Нет необходимости в старых. –

7

Это также довольно просто: LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()

2

Правильный номер accepted Answer by Jon Skeet. Этот ответ расширяет эти идеи.

Избегайте унаследованное даты и время занятия

Некоторые других ответов, и вопрос, смешайте старые классы наследства даты и время с новым. Это ненужная и плохая практика. Весь смысл классов java.time равен заменить трудными и запутанными старыми классами.

  • Вы делаете не нужно java.util.Date.
  • Вы делаете не необходимо java.util.Calendar.

LocalDateTime

Вашей входная строка отсутствует какая-либо информация о офсетном из-UTC или часового пояса. Поэтому мы анализируем его как объект LocalDateTime.

Для синтаксического анализа мы заменяем ПРОСТРАНСТВО посередине на T, чтобы соответствовать стандарту ISO 8601 для форматов даты и времени.

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

LocalTime

Чтобы сосредоточиться на время- день без даты, попросите LocalTime.

LocalTime lt = ldt.toLocalTime(); 

ZonedDateTime

Обратите внимание, что ни одно из этого не реальные моменты, а не точка на временной шкале. Без контекста смещения-от-UTC или часового пояса мы не знаем, имело ли значение 5 утра в Окленде или в 5 утра в Калькутте, или в 5 утра в Париже или в 5 утра в Монреале Квебек. Каждый из них будет очень разными моментами времени.

Если по контексту вы точно знаете установленный часовой пояс, примените его. Примените ZoneId, чтобы получить ZonedDateTime.

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

Оттуда, попросите LocalTime при желании.

LocalTime lt = zdt.toLocalTime(); 

Instant

Если вы хотите увидеть тот же самый момент в UTC, извлечь Instant. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Как правило, лучше всего сосредоточиться на UTC в значительной части вашей бизнес-логики, регистрации, хранения данных и обмена данными. Научитесь думать о UTC как «Одно истинное время».

Смежные вопросы