2013-07-29 4 views
10

Меня иногда путают разные типы Date в java и их практическое использование. Здесь я пытаюсь подвести итог моего пониманияДата против TimeStamp против календаря?

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

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

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

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

ответ

13

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? Потому что вы должны работать с абстрактными классами и интерфейсами, когда они предоставляются, вместо того, чтобы работать непосредственно с реализациями. Это лучше поясняется здесь: What does it mean to "program to an interface"?

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

1

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

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

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

+0

Когда вы говорите «Тип даты», я понимаю, вы имеете в виду 'java.util.Date' (о чем не спрашивали, но все еще актуально). В соответствии с ответом [Basil Bourque] (https://stackoverflow.com/a/32975887/5772882) я использую вместо этого 'java.time.Instant'. –

4

Прежде всего, вы должны понимать, что те старые классы времени, которые были связаны с ранними версиями 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.

Смежные вопросы