Подтвердить что ты не робот

Минимальная/максимальная дата/время в JodaTime

Есть ли способ в JodaTime построить Date/DateTime, который всегда будет меньше/больше любого другого Date/DateTime? Что-то вдоль линий

DateTime bigBang = DateTime.xxx();
DateTime endOfUniverse = DateTime.yyy();

Ограничение: я не хочу использовать стандартные библиотеки Java Date.

4b9b3361

Ответ 1

java.time

Проект Joda-Time сейчас находится в режиме обслуживания. Команда советует перейти на классы java.time.

Мин/макс в java.time смотрите в моем ответе на похожий вопрос.

Joda времени

Joda-Time отслеживает время в миллисекундах с момента первого момента 1970 года в UTC. Этот счетчик поддерживается с помощью 64-битного long целого числа. Таким образом, технически максимум и минимум - это + / - пределы long.

… new DateTime( Long.MIN_VALUE )
… new DateTime( Long.MAX_VALUE )

Joda-Time не имеет таких минимальных/максимальных значений, которые можно было бы использовать в качестве констант. Напротив, обратите внимание, что преемник Joda-Times, java.time, встроенный в Java 8 и более поздние версии, действительно предлагает константы LocalDateTime.MIN и LocalDateTime.MAX.

Кстати, команда Joda-Time посоветовала нам перейти на java.time. Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport, а затем адаптирована для Android в ThreeTen-ABP.

Слишком большой, слишком маленький

Остерегайтесь этих крайностей. Их использование не практично. Различные библиотеки, приложения, базы данных и другие приемники/источники значений даты и времени могут иметь очень разные ограничения, некоторые намного больше, но обычно намного меньше.

Например, многие системы используют старую традицию UNIX & POSIX по отслеживанию времени в качестве 32-разрядного целого числа целых секунд с 1970-01-01T00: 00: 00Z. Естественный предел в + / - два миллиарда секунд приводит к надвигающейся проблеме 2038 года.

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

Временное решение

Вы можете определить свой собственный минимум/максимум.

Вам могут потребоваться экстремальные значения, такие как год 0000 и год 9999. Joda-Time поддерживает годы позже, чем 9,999, но я бы придерживался 4 цифр, чтобы соответствовать широко используемым форматам для отображения на экране и в отчетах. Визуально четыре девятки выделяются как фиктивная дата.

Или вам может потребоваться ожидаемое минимальное значение, соответствующее вашей бизнес-логике. Если вы создаете новую систему выставления счетов, то вы знаете, что год всегда должен быть в этом году или позже.

Я предлагаю определить константы на вспомогательном классе. Что-то вроде этого:

package com.example;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class JodaTimeHelper {

    static final public DateTime START_OF_TIME = new DateTime( 0000, 1, 1, 0, 0, 0, DateTimeZone.UTC );
    static final public DateTime END_OF_TIME = new DateTime( 9999, 1, 1, 0, 0, 0, DateTimeZone.UTC );

    static final public DateTime MINIMUM_INVOICE_DATETIME = new DateTime( 2015, 1, 1, 0, 0, 0, DateTimeZone.UTC );

}

Вот синтаксис для вызова этих констант.

System.out.println( "START_OF_TIME: " + JodaTimeHelper.START_OF_TIME );
System.out.println( "END_OF_TIME: " + JodaTimeHelper.END_OF_TIME );
System.out.println( "MINIMUM_INVOICE_DATETIME: " + JodaTimeHelper. MINIMUM_INVOICE_DATETIME );

Когда беги.

START_OF_TIME: 0000-01-01T00:00:00.000Z
END_OF_TIME: 9999-01-01T00:00:00.000Z
MINIMUM_INVOICE_DATETIME: 2015-01-01T00:00:00.000Z

Ответ 2

Когда все даты находятся в пределах одного и того же TimeZone, вы можете создать объект DateTime с полями, присвоенными минимальному или максимальному значению.
Однако при использовании этого конструктора

DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute)

с Years.MAX_VALUE.getYears() У меня есть следующее исключение:

введите описание изображения здесь

Таким образом, используя максимальное количество лет от исключения, я придумал следующую дату окончания даты:

DateTime dtMax = new DateTime(292278993, 12, 31, 23, 59, 59);
System.out.println(dtMax);
// prints 292278993-12-31T23:59:59

Подробнее см. документация.
Также интересное обсуждение можно прочитать здесь.

Ответ 3

После прочтения множества различных касаний на этом я, наконец, решил выяснить минимальный случай, который работает как минимум, так и максимум для часовой пояс UTC. И получается, что попытка использовать Long MIN_VALUE и MAX_VALUE отправить мне кроличьи следы.

Итак, учитывая следующий фрагмент кода:

new DateTime(milliseconds, DateTimeZone.UTC)

вот минимальные/максимальные значения, которые работают для milliseconds (проверены на Java 1.7):

UTC_DATE_TIME_MIN_VALUE_IN_MILLIS = 9223372017129599999L
UTC_DATE_TIME_MAX_VALUE_IN_MILLIS = -9223372017043200000L

Оба эти значения составляют примерно 20 миллиардов от Long.MIN_VALUE и Long.MAX_Value.