Преобразование Long to Date в Java возвращает 1970

У меня есть список с Date d = new Date (1220227200); значения (например: 1220227200, 1220832000, 1221436800 ...), которые я загрузил из веб-службы. Я должен преобразовать его в Даты. К сожалению, таким образом, например:

long

возвращается 1 января 1970 года. Кто-нибудь знает другой способ его правильного преобразования?

java,date,long-integer,

86

Ответов: 10


DateКонструктор (нажмите на ссылку!) Принимает время как Instant.ofEpochSecond( 1_220_227_200L ) в миллисекундах , а не секунд. Вам нужно умножить его на 1000 и убедитесь, что вы его поставляете long.

1,220,227,200

Это показывает здесь

Вс авг. 31 20:00:00 GMT-04: 00 2008


ТЛ; др

DateTime

Знайте свои данные

Люди используют различные оценки во время отслеживания как число с эпохи . Поэтому, когда вы получаете некоторые числа, которые будут интерпретироваться как счет с эпохи, вы должны определить:

  • Какая эпоха?
    Многие эпохи были использованы в различных системах. Обычно используется время POSIX / Unix , где эпоха является первым моментом 1970 года в UTC. Но вы не должны считать эту эпоху.
  • Какая точность?
    С какой эпохи мы говорим секунды, миллисекунды , микросекунды или наносекунды ?
  • Какой часовой пояс?
    Обычно счет с эпохи находится в часовом поясе UTC / GMT, т. Е. Вообще не имеет смещения часового пояса. Но иногда, когда речь идет о неопытных программистах с неопределенностью или датой, может существовать подразумеваемый часовой пояс.

В вашем случае, как отмечали другие, вам кажется, что вам дали секунды со времен Unix. Но вы передаете эти секунды конструктору, который ожидает миллисекунды. Таким образом, решение умножается на 1000.

Уроки выучены:

  • Определите, не принимайте значения полученных данных.
  • Прочтите документ .

График, показывающий различные гранулярности разрешения в системах с датой, включая целые секунды, миллисекунды, микросекунды и наносекунды.

Ваши данные

Ваши данные, кажется, целые секунды. Если мы примем эпоху начала 1970 года, и если мы примем часовой пояс UTC, то longэто первый момент первого дня сентября 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.

long input = 1_220_227_200L;  // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".

Подайте это количество миллисекунд на конструктор. Этот конкретный конструктор предполагает, что подсчет относится к эпохе Unix 1970 года. Поэтому настройте часовой пояс по желанию, после строительства.

Используйте правильные названия часовых поясов , сочетание континента и города / региона. Никогда не используйте 3 или 4 буквенных кода, например, ESTони не стандартизированы, а не уникальны.

DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );

Для демонстрации снова настройте часовой пояс.

DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontreal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );

Сбросьте консоль. Обратите внимание на то, как в Монреале эта дата отличается, поскольку новый день начался в Европе, но еще не в Америке.

System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontreal: " + dateTimeMontreal );

При запуске.

dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontreal: 2008-08-31T20:00:00.000-04:00

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.

Instant instant = Instant.ofEpochSecond( 1_220_227_200L );

Примените смещение-от-UTC, ZoneOffset чтобы получить OffsetDateTime.

Еще лучше, если известно, примените часовой пояс, ZoneIdчтобы получить a ZonedDateTime.

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

35

Похоже, ваши длинные секунды, а не миллисекунды. Конструктор даты занимает время в миллисекундах, поэтому

Date d = new Date(timeInSeconds * 1000);

Вероятно, это временные метки в секундах, а не в миллисекундах, которые необходимы для нового конструктора Date (long). Просто умножьте их на 1000, и вы должны быть в порядке.


Установите время в мельницах только на объект Calendar

Calendar c = Calendar.getInstance();
c.setTimeInMillis(1385355600000l);
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH));
System.out.println(c.get(Calendar.DAY_OF_MONTH));
// get Date
System.out.println(c.getTime());
Java, дата, пор-целое число,