Преобразование миллисекундной строки в Date на Java

У меня есть строка x = "1086073200000". Это в основном миллисекунда, которую мне нужно преобразовать в Date.

Для преобразования я использую

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

long tempo1=Long.parseLong(x);
System.out.println(tempo1);  // output is 86073200000 instead of the whole thing
long milliSeconds=1346482800000L;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
System.out.println(formatter.format(calendar.getTime())); 

Проблема заключается в том, что я преобразовываю строку x в long, некоторые цифры исчезают из-за ограничения на размер длинного.

Как сохранить всю строку.

БЛАГОДАРЯ.

Ответ 1

double tempo=Double.parseDouble(z);

Почему вы анализируете свой String, который должен быть Long как Double?

Попробуйте использовать Long.parseLong:

String x = "1086073200000"

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

long milliSeconds= Long.parseLong(x);
System.out.println(milliSeconds);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
System.out.println(formatter.format(calendar.getTime())); 

Ответ 2

Я пробовал этот код, и он работал у меня

public static void main(String[] args) {
    String x = "1086073200000";
    long foo = Long.parseLong(x);
    System.out.println(x + "\n" + foo);

    Date date = new Date(foo);
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    System.out.println(formatter.format(date)); 
}

Ответ 3

Я использовал следующее, и это сработало для меня

Date date=new Date(milliSeconds);

Ответ 4

Date date = new Date(milliseconds);

Ответ 5

TL;DR

Instant.ofEpochMilli ( 1_346_482_800_000L );

2012-09-01T07: 00: 00Z

Подробнее

принятый ответ Тимом Бендером и другой ответ enTropy являются правильными. Вы анализировали свою входную строку как double, а не как long.

java.time

Кроме того, в Вопросах и ответах используются старые устаревшие классы времени. Теперь они вытесняются пакетом java.time. См. Учебник Oracle. Большая часть функций java.time была перенесена на Java 6 и 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.

Подсчет с эпохи

Классы java.time подсчитываются из тех же epoch как старые классы, первый момент 1970 года в UTC. Таким образом, мы можем начинать то же самое, анализируя ввод как long.

String input = "1086073200000";
long millis = Long.parseLong ( input );

UTC

Используйте этот номер long, чтобы получить объект Instant. Этот класс представляет момент на временной шкале в UTC, аналогичный по существу старой java.util.Date. Но новые классы имеют разрешение до наносекунды, тогда как старые ограничены миллисекунды. К счастью, класс Instant имеет удобный метод factory, принимающий подсчет миллисекунд-с-эпохи, ofEpochMilli.

Instant instant = Instant.ofEpochMilli ( millis );

Часовой пояс

Теперь назначьте часовой пояс (ZoneId), чтобы получить ZonedDateTime. Это похоже на концепцию a java.util.Calendar, поскольку она представляет момент на временной шкале с определенным назначенным часовым поясом.

Всегда указывайте желаемый/ожидаемый часовой пояс. Хотя это необязательно, никогда не опускайте часовой пояс, как это было при использовании Calendar в вопросе. Если этот параметр опущен, то действующий часовой пояс JVMs по умолчанию применяется молча. Это значение по умолчанию может варьироваться от машины к машине и время от времени даже во время выполнения (!). Лучше указывать, чем предполагать.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );

Дамп для консоли. Обратите внимание, что часовой пояс 07 в UTC, но 03 в Québec, поскольку эта зона имела смещение -04:00, на четыре часа позади UTC, в течение лета под Летнее время (DST).

System.out.println ( "input: " + input + " | millis: " + millis + " | instant: " + instant + " | zdt: " + zdt );

вход: 1086073200000 | миллис: 1086073200000 | мгновенный: 2004-06-01T07: 00: 00Z | zdt: 2004-06-01T03: 00-04: 00 [Америка/Монреаль]

Строка не является датой

Как сохранить всю строку.

Не путайте строку текста, описывающую значение даты-времени с самой датой. Объект даты и времени может генерировать String для представления его значения, но эта строка является отдельной и отличной от объекта даты.

Чтобы сгенерировать String из объекта java.time, такого как ZonedDateTime, либо:

  • Вызовите toString, чтобы получить стандартную строку ISO 8601. (Как показано в примере выше)
  • Используйте DateTimeFormatter для:
    (a) Определите свой собственный формат или
    (b) Автоматически локализовать язык пользователей и культурные нормы пользователей.

Поиск для многих других вопросов и ответов для создания форматированных строк из DateTimeFormatter.


О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятный старый legacy классы даты-времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советуем перейти к классам java.time.

Чтобы узнать больше, см. Учебник Oracle, И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.

Ответ 6

У меня есть следующее

Date date = new Date(); date.setTime(Long.parseLong(milliseconds));

Где миллисекунды - это строка.

Надеюсь, это поможет.