У меня есть список с длинными значениями (например: 1220227200, 1220832000, 1221436800 ...), который я загрузил из веб-службы. Я должен преобразовать его в даты. К сожалению, так, например:
Date d = new Date(1220227200);
возвращает 1 января 1970 года. Кто-нибудь знает другой способ правильно его преобразовать?
java
date
long-integer
мммики
источник
источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь наследие , вытесняется java.time классов , встроенных в Java 8 и более поздних версий.Ответы:
Date
Конструктор (нажмите на ссылку!) Принимает время какlong
в миллисекундах , а не секунд. Вам нужно умножить его на 1000 и убедиться, что вы указали его какlong
.Это показано здесь
источник
Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));
в качестве альтернативы, используйте для более чистого и менее сложного решения.ТЛ; др
Знай свои данные
Люди используют различную точность при отслеживании времени как числа с эпохи . Поэтому, когда вы получаете некоторые числа, которые можно интерпретировать как количество с эпохи, вы должны определить:
Даты многих эпох использовались в различных системах. Обычно используется время POSIX / Unix , где эпоха - это первый момент 1970 года по UTC. Но не стоит предполагать эту эпоху.
Мы говорим о секундах, миллисекундах , микросекундах или наносекундах с эпохи?
Обычно отсчет времени находится в часовом поясе UTC / GMT, то есть вообще не имеет смещения часового пояса. Но иногда при привлечении неопытных программистов или программистов, не знающих дату и время, может быть подразумеваемый часовой пояс.
В вашем случае, как отмечали другие, вам, кажется, дали секунды с эпохи Unix. Но вы передаете эти секунды конструктору, который ожидает миллисекунды. Итак, решение - умножить на 1000.
Уроки выучены:
Ваши данные
Ваши данные кажутся целыми секундами. Если мы примем эпоху начала 1970-х, и если мы примем часовой пояс UTC, то
1,220,227,200
это первый момент первого дня сентября 2008 года.Joda времени
Классы java.util.Date и .Calendar, связанные с Java, как известно, вызывают проблемы. Избежать их. Вместо этого используйте либо библиотеку Joda-Time, либо новый пакет java.time, входящий в состав Java 8 (и вдохновленный Joda-Time).
Обратите внимание, что в отличие от juDate, a
DateTime
в Joda-Time действительно знает свой собственный часовой пояс . Итак, в примере кода Joda-Time 2.4, показанном ниже, обратите внимание, что сначала мы анализируем миллисекунды, используя стандартное значение UTC. Затем, во-вторых, мы назначаем часовой пояс Парижа для корректировки. Тот же момент на временной шкале Вселенной, но другое время на настенных часах . Для демонстрации мы снова настраиваемся на UTC. Почти всегда лучше явно указать желаемый / ожидаемый часовой пояс, чем полагаться на неявное значение по умолчанию (часто это причина проблем при работе с датой и временем).Нам нужны миллисекунды для создания DateTime. Итак, введите секунды и умножьте на тысячу. Обратите внимание, что результат должен быть 64-битным,
long
как если бы мы переполнили 32-битныйint
.Подайте это количество миллисекунд в конструктор. Этот конкретный конструктор предполагает, что счетчик относится к эпохе Unix 1970 года. Поэтому настройте часовой пояс по желанию после построения.
Используйте правильные названия часовых поясов , сочетание континента и города / региона. Никогда не используйте трех- или четырехбуквенные коды,
EST
поскольку они не являются ни стандартизированными, ни уникальными.Для демонстрации снова настройте часовой пояс.
Выгрузить в консоль. Обратите внимание, как отличается дата в Монреале, поскольку новый день начался в Европе, но еще не в Америке.
При запуске.
java.time
Создатели Joda-Time попросили нас перейти на его замену, фреймворк java.time, как только это будет удобно. Хотя Joda-Time продолжает активно поддерживаться, вся дальнейшая разработка будет осуществляться на классах java.time и их расширениях в проекте ThreeTen-Extra.
Фреймворк времени Java определяется JSR 310 и встроен в Java 8 и новее. Классы java.time были перенесены на Java 6 и 7 в проекте ThreeTen-Backport и на Android в проекте ThreeTenABP .
An
Instant
- это момент на временной шкале в формате UTC с разрешением наносекунды. Его эпоха - это первый момент 1970 года по всемирному координированному времени.Примените смещение от UTC,
ZoneOffset
чтобы получить файлOffsetDateTime
.Еще лучше, если известно, примените часовой пояс,
ZoneId
чтобы получитьZonedDateTime
.источник
Похоже, ваши лонги - это секунды, а не миллисекунды. Конструктор даты принимает время в миллисекундах, поэтому
источник
Только установите время в мельницах на объекте Calendar
источник
Вероятно, это временные метки в секундах, а не в миллисекундах, которые требуются для конструктора java new Date (long). Просто умножьте их на 1000, и все будет в порядке.
источник
Длинные значения, скорее всего, соответствуют временным меткам эпохи , а значения следующие:
1220227200 = понедельник, 01 сентября 2008 г., 00:00:00 GMT
1220832000 = понедельник, 08 сентября 2008 г., 00:00:00 GMT
1221436800 = понедельник, 15 сентября 2008 г., 00:00:00 GMT
Эти длинные значения можно преобразовать в java.util.Date с учетом того факта, что java.util.Date использует миллисекунды - как указывалось ранее, но с некоторым недостатком - например:
Теперь для правильного отображения даты можно использовать java.text.DateFormat, как показано ниже:
Ниже приведены результаты отображения преобразованного длинного значения в java.util.Date без использования и использования DateFormat:
источник
Попробуй это:
источник
Попробуйте это с настройкой формата даты.
Примечание: проверьте 24-часовой или 12-часовой цикл.
источник
1220227200 соответствует 15 января 1980 г. (и действительно, new Date (1220227200) .toString () возвращает «Thu Jan 15 03:57:07 CET 1970»). Если вы передадите длинное значение дате, то есть до 01.01.1970, она фактически вернет дату 01.01.1970. Убедитесь, что ваши значения не в этой ситуации (ниже 82800000).
источник
Новая дата (число) возвращает дату в
number
миллисекундах после 1 января 1970 года. Скорее всего, ваш формат даты не показывает часы, минуты и секунды, чтобы вы могли видеть, что это совсем немного после 1 января 1970 года.Вам нужно проанализировать дату в соответствии с правильной маршрутизацией синтаксического анализа. Я не знаю, что такое 1220227200, но если это секунды после 1 ЯНВАРЯ 1970, умножьте его, чтобы получить миллисекунды. Если это не так, преобразуйте его каким-либо образом в миллисекунды после 1970 года (если вы хотите продолжать использовать java.util.Date).
источник
Работает для меня. Вы, вероятно, захотите умножить его на 1000, поскольку вы получаете секунды с 1970 года, и вам нужно передать миллисекунды с 1 января 1970 года.
источник