Преобразование миллисекундной строки в 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));
Где миллисекунды - это строка.
Надеюсь, это поможет.