Дата против TimeStamp против календаря?

Меня иногда путают разные типы Date в java и их практическое использование. Вот я пытаюсь обобщить свое понимание

java.sql.Date :- Тонкая обертка вокруг значения миллисекунды, которая позволяет JDBC идентифицировать это как значение DATE SQL

java.sql.Timestamp :- Тонкая оболочка вокруг java.util.Date, которая позволяет API JDBC идентифицировать это как SQL Значение TIMESTAMP. Он добавляет возможность удерживать значение дробной секунды SQL TIMESTAMP, разрешая спецификацию дробных секунд до точности наносекунд

Я видел, что большинство проектов предпочитают Timestamp вместо даты. Я думаю, что основной причиной этого является то, что Timestamp может удерживать значение до точность nano секунд, тогда как данные могут сохраняться до миллисекунды. Правильно?

Calendar :- Этот класс предназначен для обработки даты, например: - для преобразования между конкретным моментом времени и набор полей календаря, таких как YEAR, MONTH, DAY_OF_MONTH, HOUR и т.д., а также для манипулирования полями календаря, такими как получение дата следующей недели. Хотя я не знаю, почему этот класс является абстрактным, когда существует только одна реализация. i.e GregorianCalendar.

Ответ 1

java.sql.Timestamp Тонкая оболочка вокруг java.util.Date, которая позволяет API JDBC идентифицировать это как значение SQL TIMESTAMP.

Если вы проверите java.sql.Timestamp JavaDoc, очень ясно, что этот класс расширяет от java.util.Date (как java.sql.Date). И в проектах реального мира вы должны просто java.util.Date хранить данные в своей базе данных и в основном java.sql.Timestamp, так как он сохраняет значение даты и времени, а java.sql.Date просто сохраняет значение даты.

С другой стороны, java.util.Calendar является абстрактным, поскольку из него больше java.util.GregorianCalendar реализовано больше реализаций. Если вы видите код Calendar#getInstance из HotSpot, вы увидите, что он вызывает createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)), и этот код метода использует 3 разных календаря: BuddhistCalendar, JapaneseImperialCalendar и GregorianCalendar. Этот код копируется из источника JDK 7:

private static Calendar createCalendar(TimeZone zone,
                                       Locale aLocale) {
    Calendar cal = null;

    String caltype = aLocale.getUnicodeLocaleType("ca");
    if (caltype == null) {
        // Calendar type is not specified.
        // If the specified locale is a Thai locale,
        // returns a BuddhistCalendar instance.
        if ("th".equals(aLocale.getLanguage())
                && ("TH".equals(aLocale.getCountry()))) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
    } else if (caltype.equals("japanese")) {
        cal = new JapaneseImperialCalendar(zone, aLocale);
    } else if (caltype.equals("buddhist")) {
        cal = new BuddhistCalendar(zone, aLocale);
    } else {
        // Unsupported calendar type.
        // Use Gregorian calendar as a fallback.
        cal = new GregorianCalendar(zone, aLocale);
    }

    return cal;
}

Теперь, зачем работать непосредственно с Calendar вместо GregorianCalendar? Потому что вы должны работать с абстрактными классами и интерфейсами, когда они предоставляются, вместо того, чтобы работать непосредственно с реализациями. Это лучше объясняется здесь: Что значит "программировать на интерфейс" ?

Кроме того, если вы будете работать с датой и временем, я рекомендую использовать библиотеку, например Joda-Time, которая уже обрабатывает и решает много проблем с текущим API-интерфейсом Java Date, а также предоставляет методы для получения этого объекта даты и времени в java.util.Date.

Ответ 2

Вы должны сначала понять, что те старые классы с датой, в которые были включены ранние версии Java, представляют собой запутанную путаницу с плохо разработанными классами с хаками. Они были первой попыткой промышленности на сложном объекте обработки данных на дату и заслуживают доверия. Но в конечном итоге они терпят неудачу.

Они были заменены новой инфраструктурой java.time, встроенной в Java 8 и более поздние версии.

  • java.sql.Date - используйте java.time.LocalDate вместо
  • java.sql.Timestamp - используйте java.time.Instant вместо
  • java.util.Calendar и GregorianCalendar - используйте java.time.ZonedDateTime вместо

Только для даты, без времени суток или часового пояса используйте LocalDate. На временной шкале в UTC используйте Instant. Чтобы назначить другой часовой пояс Instant, используйте ZonedDateTime.

Для работы с базами данных мы должны в конечном итоге увидеть, что драйверы JDBC обновлены, чтобы напрямую использовать эти новые типы java.time. Тем временем найдите удобные методы конвертера, найденные как в новом, так и в старом классах. Используйте java.sql.Date для значения только для даты. Используйте java.sql.Timestamp для значения даты и времени.

Я не буду включать код здесь, как это было сделано во многих других повторяющихся Вопросах. Пожалуйста, найдите StackOverflow.

Ответ 3

Первая строка в исходном вопросе содержит фразу "разные типы дат в java и их практическое использование"

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

Тип даты обрабатывает 99% внешних ненаучных данных с точностью до миллисекунды.