Как изменить миллисекунду на объект даты в формате yyyy-MM-dd HH:mm:ss

Как изменить миллисекунды на объект Date в формате yyyy-MM-dd HH:mm:ss, например 2017-04-12 23:14:52?


person Nilendu Kumar    schedule 12.06.2017    source источник
comment
пожалуйста, укажите входные миллисекунды?   -  person kk.    schedule 12.06.2017
comment
Вы понимаете, что объект Date не имеет формата? Пожалуйста, прочтите codeblog.jonskeet.uk/2017/04. /23/все-о-java-util-дата   -  person Jon Skeet    schedule 12.06.2017
comment
Я надеюсь, что этот ответ поможет вам stackoverflow.com /вопросы/4142313/   -  person kk.    schedule 12.06.2017
comment
Что вы пробовали? Вы искали, прежде чем спрашивать? Очень смешно, если ничего полезного и полезного не подвернулось. Он, безусловно, уже существует, и вы можете найти его быстрее, чем кто-либо еще раз наберет его здесь.   -  person Ole V.V.    schedule 12.06.2017
comment
@ Тим, вопрос, на который вы ссылаетесь, касается только (и получения) форматирования в часы, минуты, секунды и миллисекунды, а не в год, месяц и день, как здесь просят. Я согласен с вами, что этот вопрос, должно быть, задавали и отвечали на него не один раз, а много раз.   -  person Ole V.V.    schedule 13.06.2017
comment
Я также согласен с вами, @Tim, что в этом вопросе, похоже, есть два вопроса: (1) как преобразовать миллисекунды с эпохи в объект даты (или даты-времени) (2) как отформатировать указанный объект. И то, и другое уже задавали и отвечали много раз.   -  person Ole V.V.    schedule 13.06.2017


Ответы (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 в часовом поясе Тихого океана/Окленда. Обратите внимание, что в последнем случае даже дата не совпадает. Таким образом, нет единственного способа преобразовать ваши миллисекунды в формат, который вы просили. Прежде чем мы сможем вам помочь, нам нужно знать, для какого часового пояса вы хотите это сделать.

Итак, я считаю, что вам нужно не одно, а два

  1. Способ сохранить момент времени в вашей программе.
  2. Способ форматирования вашего момента времени в строку в формате гггг-мм-дд чч:мм:сс для пользователя в некотором часовом поясе.

Для сохранения точки во времени используйте любой из

  • 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);

(и извините за повтор, нужного формата пока нет, т.е. не возможно).

person Ole V.V.    schedule 13.06.2017

Вы можете попробовать этот пример кода.

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

    }

}
person Ratnakar Sadasyula    schedule 12.06.2017
comment
Делая это, я получу String simpleDateFormat.format(calendar.getTime()) возвращает String, но мне нужен объект java.util.Date. Я попытался сделать simpleDateFormat.format(calendar.getTime())) после получения строки, но затем я получаю формат Tue Apr 25 23:52:17 IST 2017, который мне не нужен - person Nilendu Kumar; 12.06.2017
comment
Ты спрашиваешь о невозможном или, скорее, о противоречивом, @NilenduKumar. Объект java.util.Date не имеет и не может иметь формата. Это момент времени, не более того. - person Ole V.V.; 13.06.2017