Java TimeZoneOffset преобразование времени

Использование Jdk8. Я пытаюсь конвертировать время на самом деле просто часы дня (например, 1130) в DateTime. Я пробую это двумя способами, так как ниже ни один из них не работает правильно. 1130 конвертируется в 11:00 и еще 3:00 ни один из них не является правильным. Есть ли еще 3-й способ именования моего часового пояса.

Long ltime = Long.parseLong("1130");
   Long  seconds = (ltime/100)*60*60;
   LocalDateTime tsutcDttime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
    LocalDateTime lclDttime =   LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault());
 System.out.println("ZoneId.systemDefault: " +ZoneId.systemDefault());
 System.out.println("UTC LocalDateTime : "+ tsutcDttime); 
 System.out.println("Sys Def LocalDateTime : "+ lclDttime); 

ZoneId.systemDefault: Америка / Los_Angeles

UTC LocalDateTime: 1970-01-01T11:00

Sys Def LocalDateTime: 1970-01-01T03:00

Эта проблема была решена ниже.

Часть 2 этой проблемы Для некоторых из моих временных компонентов у меня есть Дата, а для некоторых других - нет (но я все равно должен конвертировать все в datetime.

Как мне добавить фактическую дату, когда она у меня есть? Я не вижу метод LocalDate (дата)? Для других просто дадим дефолт до 1970, если не найдется лучшего солна. Ниже просто ставится дата 1970 года:

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(secondsOfDay, 0, ZoneOffset.UTC); 

Но когда у меня есть свидание, я бы хотел добавить его в secondsOfDay и создать свой DateTime- How. Лайк Дата = 1 января 2016 + секунды OfDay

Спасибо

2 ответа

Предполагая, что строка "1130" означает 11 часов и 30 минут, вам необходимо выполнить преобразование в секунды отдельно для часов и минут:

long ltime = Long.parseLong("1130");

long hoursAsSeconds = (ltime / 100) * 60 * 60;
long minsAsSeconds = (ltime % 100) * 60;

long secondsOfDay = hoursAsSeconds + minsAsSeconds;

Вы можете использовать LocalTime чтобы получить местное время с учетом секунд:

LocalTime localTime = LocalTime.ofSecondOfDay(secondsOfDay);

Вы также можете получить местное время напрямую, анализируя время следующим образом:

LocalTime localTime = LocalTime.parse("1130", DateTimeFormatter.ofPattern("HHmm"));

От этого вы можете получить LocalDateTime используя что-то вроде:

LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), localTime);

Или ZonedDateTime с помощью:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.now(), localTime, ZoneId.of("America/Los_Angeles"));

Это выражение вызывает проблему:

 Long  seconds = (ltime/100)*60*60;

Оператор деления возвращает целочисленное значение, поэтому вы теряете здесь точность.

1130/100 = 11.3 ~ 11
11 * 60*60 = 39600
11.3 * 60*60 = 40680

Деление должно быть последней операцией в вашем выражении:

Long  seconds = (ltime*60*60)/100;
Другие вопросы по тегам