Как изменить миллисекунды на объект Date в формате yyyy-MM-dd HH:mm:ss, например 2017-04-12 23:14:52?
Как изменить миллисекунду на объект даты в формате yyyy-MM-dd HH:mm:ss
Ответы (2)
Тебе этого не сделать. По нескольким причинам.
TL;DR: не используйте Date
, используйте Instant
. Ни в одном из них не может быть формата. Форматирование в строку зависит от часового пояса, поэтому вам нужно выбрать часовой пояс.
Во-первых, я понял из обсуждения, что вы запрашиваете объект java.util.Date
, имеющий формат yyyy-MM-dd HH:mm:ss
. Объект Date
не имеет и не может иметь в себе формата. Здесь вы должны попытаться понять разницу между самими данными и представлением данных пользователю. int
может содержать значение 25389, но не в формате 25389 (на самом деле внутреннее представление сильно отличается от 25389). Один и тот же int
может быть представлен пользователю как 25389, 000025389, 25389 или +25389, и это только некоторые из многих возможностей. Форматирование происходит за пределами int
, а int
остается прежним.
Точно так же объект Date
содержит момент времени. Одна и та же дата может быть отформатирована, например, 2017-04-12 23:14:52 или 12 апреля 2017 г. 23:14:52. Он даже может быть отформатирован для разных часовых поясов, что было бы неплохо, если в системе есть пользователи из разных часовых поясов. В качестве альтернативы мы можем показать пользователю лист календаря и/или часы, показывающие время. Опять же, форматирование происходит за пределами Date
, а Date
остается прежним.
Уточняя проблему часового пояса, один и тот же момент времени, представленный одним и тем же значением миллисекунды, может быть отформатирован как 2017-04-12 17:44:52 в UTC, 2017-04-12 19:44:52 в моем часовом поясе, 2017-04-12 23:14:52 в часовом поясе Азии/Калькутты или даже 2017-04-13 05:44:52 в часовом поясе Тихого океана/Окленда. Обратите внимание, что в последнем случае даже дата не совпадает. Таким образом, нет единственного способа преобразовать ваши миллисекунды в формат, который вы просили. Прежде чем мы сможем вам помочь, нам нужно знать, для какого часового пояса вы хотите это сделать.
Итак, я считаю, что вам нужно не одно, а два
- Способ сохранить момент времени в вашей программе.
- Способ форматирования вашего момента времени в строку в формате гггг-мм-дд чч:мм:сс для пользователя в некотором часовом поясе.
Для сохранения точки во времени используйте любой из
long
для значения миллисекунд, которое у вас уже есть- Объект
java.time.Instant
.
Почему я не упомянул java.util.Date
? Потому что этот класс давно устарел. Его конструкция очень быстро оказалась хлопотной. Они пытались исправить это, отказавшись от большинства методов и внедрив java.util.Calendar
, но это тоже не очень хорошо сработало. Наконец, опираясь на опыт библиотеки, известной как Joda-Time, они представили java.time
классов в Java 8 в 2014 году. Это было три года назад с момента написания и считается. Так что, ИМХО, мы уже должны были выбросить Date
и друзей за борт и начать использовать более новые классы. Так что предпочитайте Instant
Date
.
Изменить ваши миллисекунды на Instant
очень просто:
long milliseconds = 1492019092000L;
Instant pointInTime = Instant.ofEpochMilli(milliseconds);
Для форматирования вашего момента в строку для пользователя, как я уже сказал, нам требуется часовой пояс. Тогда сделайте
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String formattedDateTimeString = pointInTime.atZone(ZoneId.of("Asia/Kolkata"))
.format(formatter);
Итак, вам нужно заполнить нужный часовой пояс, где я поставил ZoneId.of("Asia/Kolkata")
. Если вы хотите использовать текущую настройку часового пояса JVM, просто введите ZoneId.systemDefault()
. Помните, однако, что настройка часового пояса может быть изменена даже посторонней программой, работающей в той же JVM, поэтому полагаться на это может быть ненадежно.
Результатом приведенного выше фрагмента кода является строка вида
2017-04-12 23:14:52
PS Если после прочтения вышесказанного вы действительно настаиваете, вот как получить java.util.Date
из вышеперечисленного:
Date myOutdatedDateInstance = Date.from(pointInTime);
(и извините за повтор, нужного формата пока нет, т.е. не возможно).
Вы можете попробовать этот пример кода.
public class MillDateConverter {
public static String dFormat = "yyy-MM-dd HH:mm:ss";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dFormat);
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
long milliSec=Long.parseLong("1086073200000");
System.out.println(milliSec);
calendar.setTimeInMillis(milliSec);
System.out.println(simpleDateFormat.format(calendar.getTime()));
}
}
java.util.Date
не имеет и не может иметь формата. Это момент времени, не более того.
- person Ole V.V.; 13.06.2017
Date
не имеет формата? Пожалуйста, прочтите codeblog.jonskeet.uk/2017/04. /23/все-о-java-util-дата - person Jon Skeet   schedule 12.06.2017