Я столкнулся с неприятной проблемой, и я не могу объяснить себе, почему она появляется.
В основном я хочу добавить время к метке времени (простой long).
I понять это следующим образом. Если я добавлю время к временной метке, я закончу в будущем. Если я вычитаю время из метки времени, я заканчиваю в прошлом.
В моем примере все наоборот. Если я добавляю что-то к своей отметке времени, она уменьшается, а если я вычитаю что-то, добавляется.
public class MyClass {
public static void main(String args[]) {
static final int MONTH_IN_SECONDS = 2629743;
final long current = System.currentTimeMillis();
System.out.println("Current: " + current);
final long future = System.currentTimeMillis() + (MONTH_IN_SECONDS * 1000 * 3);
System.out.println("Addition: " + future);
final long past = System.currentTimeMillis() - (MONTH_IN_SECONDS * 1000 * 3);
System.out.println("Subtraction: " + past);
}
}
Результат (сравните первые 5 символов):
Current: 1582275101365
Addition: 1581574395774 // smaller than current even though it should be greater
Subtraction: 1582975806958 // great than current even though it should be smaller
Почему это происходит? Переполнен ли термин (MONTH_IN_SECONDS * 1000 * 3)
, потому что это всего лишь целое число и, следовательно, расчет не работает (или заканчивается отрицательным значением)?
Если я изменю термин на (MONTH_IN_SECONDS * 1000L * 3)
, то, похоже, он будет работать правильно. Это потому, что полный термин приведен к long
?