Местное время от даты

Я пытаюсь преобразовать экземпляр Date в экземпляр 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();

Я не получаю ошибки компилятора, но значения экземпляра LocalTime неверны.

Я думаю, что это не работает, потому что Date хранит время в fasttime вместо cdate.

Я использую JDK версии 1.8.


person Stanko    schedule 28.04.2015    source источник
comment
Во-первых, о какой версии Java мы говорим?   -  person Rafael R. S. Robles    schedule 28.04.2015
comment
@RafaelRSRobles JDK 1.8   -  person Stanko    schedule 28.04.2015


Ответы (4)


Ваш ввод фактически является 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);
    }
}
person Jon Skeet    schedule 28.04.2015

Это тоже довольно просто:

LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(),
    ZoneId.systemDefault()).toLocalTime();
person johanwannheden    schedule 05.10.2016
comment
можно упростить с помощью LocalTime.ofInstant() - person Anthony; 17.07.2020

Правильный принятый ответ Джона Скита. Этот ответ расширяет эти идеи.

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

Некоторые другие ответы и вопрос смешивают старые устаревшие классы даты и времени с новыми. Это ненужная и плохая практика. Вся суть 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 с разрешением наносекунды (до девяти (9) цифр десятичной дроби).

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

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

Попробуйте это

    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();
person Community    schedule 28.04.2015
comment
Глупо смешивать неприятные старые классы с классами java.time. Старые классы теперь заменены классами java.time. Старые не нужны. - person Basil Bourque; 06.10.2016
comment
Если вам нужно использовать старые классы с новыми, что вы делаете? Рефакторинг любой имеющейся у вас кодовой базы для соответствия новым классам? Это не имеет смысла. Иногда нужно продолжать использовать старый стиль вместе с новым, и это относится к любой разработке, не только к Java. - person fleed; 23.11.2019