Java Date проблемы, поиск даты X дней назад - PullRequest
9 голосов
/ 22 июня 2011
Date nowdate = new Date();
long nowms = nowdate.getTime();
long differencems = numdaysback * 24 * 60 * 60 * 1000;
long thenms = nowms - differencems;
Date thendate = new Date(thenms);

Если numdaysback равен 365, то я бы предположил, что последний год будет год назад. но это не ... это около трех недель назад?!?

NUMDAYSBACK: 365
NOWDATE: Wed Jun 22 20:31:58 SGT 2011
NOWMS: 1308745918625
DIFFERENCEMS: 1471228928
THENMS: 1307274689697
THENDATE: Sun Jun 05 19:51:29 SGT 2011

Ответы [ 5 ]

26 голосов
/ 22 июня 2011

Как насчет:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
Date thendate = cal.getTime();

Возвращает одно и то же время суток независимо от летнего времени или високосных годов, короче и четче ...

Как правило, Calendar - это путь в таких случаях (если вы не используете стороннюю библиотеку, такую ​​как Joda Time). Вы можете использовать его для всех видов вычислений: добавьте N дней / часов / месяцев / секунд, урежьте время до целого часа и т. Д. - вещи, которые будут слишком болезненными только с long.

Что касается вашего исходного вопроса, он, похоже, является жертвой целочисленного переполнения. Это работает, если умножение явно использует long:

long differencems = 365 * 24 * 60 * 60 * 1000L;
3 голосов
/ 22 июня 2011

Просто попробуйте это:

long differencems = numdaysback * 24L * 60 * 60 * 1000;

С новым кодом вы не потеряете цифры из-за целочисленного умножения. Поскольку мы пометили литерал 24 как длинный, умножение будет выполнено путем автоматического преобразования первого операнда numdaysback в long. Остальное умножение также будет выполнено для длинных операндов.

1 голос
/ 29 ноября 2018

Если вы используете Java 8 и выше, вы можете использовать более новую библиотеку java.time , чтобы сделать это немного более аккуратно.

Date xDaysAgo = Date.from( Instant.now().minus( Duration.ofDays( x ) ) );
0 голосов
/ 22 июня 2011

Класс Date (неофициально) устарел.В API столько ошибок, что очень трудно точно определить дату / время.Самый простой пример - это что-то вроде вашего кода для differencems.Он не работает, если промежуток времени содержит переключатель перехода на летнее время (если вы не используете UT) и всегда не позаботится о дополнительных секундах.

Если ваше приложение зависит от правильных дат, вы можетеиспользуйте Joda Time .

0 голосов
/ 22 июня 2011

Эта строка:

long differencems = numdaysback * 24 * 60 * 60 * 1000;

RHS должно быть: 31536000000. У вас есть что-то намного меньше, причина в том, что RHS оценивается как int (так как все количества являются целыми числами), и выпревышают MAX_INT.Чтобы исправить это:

long differencems = numdaysback * 24 * 60 * 60 * 1000l;

Обратите внимание, что «l» означает, что 1000 будет длинной - теперь RHS будет оцениваться как длинная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...