Elettracompany.com

Компьютерный справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java sql time

16. Java — Дата и время

Java предоставляет класс Date, который доступен в пакете java.util, этот класс заключает в себе текущую дату и время.

Содержание

Конструкторы

Класс Date поддерживает два конструктора, которые показаны ниже.

Методы класса Date

Ниже представлены методы класса Date.

Текущая дата и время в Java

Получить текущую дату и время в Java достаточно не трудно. Вы можете использовать простой объект date вместе с методом toString(), чтобы вывести текущую дату и время следующим образом:

Получим следующий результат:

Сравнение дат

Существуют три способа в Java сравнить даты:

  • Можно использовать функцию getTime(), чтобы получить количество миллисекунд, прошедших с момента полуночи 1 января 1970, для обоих объектов, а затем сравнить эти два значения.
  • Вы можете использовать методы before(), after() и equals(). Поскольку 12 число месяца раньше 18 числа, например, new Date(99, 2, 12).before(new Date (99, 2, 18)) возвращает значение true.
  • Можно использовать метод compareTo(), который определяется сопоставимым интерфейсом и реализуется по дате.

Форматирование даты с помощью SimpleDateFormat

SimpleDateFormat — это конкретный класс для парсинга и форматирования даты в Java. SimpleDateFormat позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени. Например:

Получим следующий результат:

Формат-коды SimpleDateFormat

Для того, чтобы задать в Java формат даты и времени, используйте строковый шаблон (регулярные выражения) с датой и временем. В этой модели все буквы ASCII зарезервированы как шаблон письма, которые определяются следующим образом:

Форматирование даты с помощью printf

Формат даты и времени можно сделать без труда с помощью метода printf. Вы используете формат двух букв, начиная с t и заканчивая одним из символов в таблице, приведенных ниже. Например:

Получим следующий результат:

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

Индекс должен непосредственно следовать за % и завершаться $. Например:

Получим следующий результат:

Получим следующий результат:

Символы преобразования даты и времени

В Java вывод даты в нужном формате можно реализовать с помощью следующих символов преобразования:

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

Преобразование строки в дату

Класс SimpleDateFormat имеет некоторые дополнительные методы, в частности parse(), который в Java поможет нам перевести строку в дату соответствии с форматом, хранящимся в данном объекте SimpleDateFormat. Например:

Получим следующий результат:

Задержка по времени

Вы можете увеличить или уменьшить время работы программы на любой период времени, от одной миллисекунды до срока службы вашего компьютера. Например, следующая программа будет находится в режиме ожидания в течение 10 секунд:

Получим следующий результат:

Вместо Thread.sleep() рекомендуется использовать TimeUnit(): TimeUnit.NANOSECONDS.sleep(), TimeUnit.MICROSECONDS.sleep(), TimeUnit.MILLISECONDS.sleep(), TimeUnit.SECONDS.sleep(), TimeUnit.MINUTES.sleep(), TimeUnit.HOURS.sleep() или TimeUnit.DAYS.sleep().

Время выполнения программы

Довольно просто можно узнать время выполнения кода вашей программы с помощью System.currentTimeMillis(). Для этого необходимо в начале программы записать в переменную значение System.currentTimeMillis(), а в конце вычесть из текущего значения System.currentTimeMillis() переменную, записанную вначале. Рассмотрим пример, в котором измерим скорость работы кода программы, которая выводит 10 случайных чисел на экран.

Получим следующий результат:

Разница дат в Java

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

Получим следующий результат:

Количество дней между датами

А иногда Вам может понадобиться в Java узнать количество дней, часов, минут и т.п. между датами. Рассмотрим один из способов нахождения дней между двумя датами ниже в примере:

Получим следующий результат:

Класс GregorianCalendar

GregorianCalendar является конкретной реализацией класса Calendar, который отображает обычный григорианский календарь, с которым Вы знакомы. Мы не обсуждали класс Calendar в этом учебнике, для этого Вы можете посмотреть стандартную документацию Java.

Метод getInstance() Calendar возвращает GregorianCalendar, который инициализирован по умолчанию текущей датой и временем, локализацией и часовым поясом. GregorianCalendar определяет два поля: н. э и до н. э. Они представляют собой две эпохи, которые определяются по григорианскому календарю.

Существует несколько конструкторов для объектов GregorianCalendar:

java sql дата время

когда я вставляю SQL DateTime в базу данных, я получаю 2007-02-07 12:00:00.00

но я сделал Date объект вроде этого : 2007-02-07 17:29:46.00

как получить значение секунд в базе данных. Он всегда меняет его на 12:00:00.00

должен ли я использовать какие-либо форматтеры?

2 ответов

java.sql.Date представляет дату, а не дату и время. От документы:

чтобы соответствовать определению даты SQL, значения миллисекунды, обернутые java.язык SQL.Экземпляр Date необходимо «нормализовать», установив часы, минуты, секунды и миллисекунды равными нулю в конкретном часовом поясе, с которым связан экземпляр.

если вы хотите хранить дату и время, вы должны искать другой тип — например, java.sql.Timestamp . EDIT: это не означает, что вы используете тип столбца TIMESTAMP — как говорит paulsm4 в комментариях, это другое дело. Однако, насколько я вижу, JDBC поддерживает только:

  • Date (нет, вы тоже хотите время)
  • Time (нет, ты тоже хочешь свидание)
  • Timestamp (включает дату и время, но вам не нужна семантика SQL TIMESTAMP)

Я ожидал использование Java Timestamp введите столбец DATETIME для работы, хотя и без уровня точности, который Timestamp обеспечивает.

EDIT: после немного больше исследований, похоже, что вы мая хотите использовать java.sql.Time введите, но со специальными параметрами драйвера — по крайней мере, если вы используете драйвер Microsoft. См. эти документы на настройка JDBC для получения дополнительной информации.

tl; dr

вы, вероятно, смущены, не понимая, что java.util.Date — дата -, с-Тип времени, а его подкласс java.sql.Date выдает быть классом только для даты, но на самом деле его время суток равно нулю. Чертовски ужасный дизайн. Избегайте обоих этих классов полностью. Использовать java.время классы только.

для столбца только даты в базе данных определите столбец как SQL-standard DATE тип.

java.время

современный подход использует java.время классы добавлены в Java 8 и более поздние версии.

Читать еще:  Java string replace regexp

когда я вставляю SQL DateTime в базу данных, я получаю 2007-02-07 12:00: 00.00

нет такой вещи, как стандартный тип SQL, как DateTime , ни один такой класс в Java. Поэтому я не знаю ваших намерений.

что касается входной строки, 2007-02-07 17:29:46.00 , разберите это как LocalDateTime потому что ему не хватает какого-либо индикатора часового пояса или смещения от UTC.

этот формат SQL-стиля почти соответствует ISO 8601 стандартные. Чтобы полностью соответствовать, замените пространство посередине на T . The java.время классы используют форматы ISO 8601 по умолчанию при разборе / генерации строк.

A LocalDateTime тут не представляю момент, есть не a точка на временной шкале. Он представляет собой потенциальные моменты в диапазоне около 26-27 часов.

стандартный SQL предлагает тип данных для такого значения, TIMESTAMP WITHOUT TIME ZONE .

умные объекты, а не тупые строки

весь ваш подход является ошибочным, спорным текстом и использованием устаревших классов даты и времени. Вместо этого обмен java.время объекты.

начиная с JDBC 4.2, вам никогда не нужно использовать хлопотную старую java.типы sql, такие как java.sql.Date или java.sql.Timestamp . Вы можете напрямую обмениваться java.объекты времени с вашей базой данных через setObject / getObject методы.

если вы пытаетесь работать только со значениями даты, используйте тип SQL-standard DATE и класс Java LocalDate .

как получить значение секунд в базе данных

не уверен, что вы подразумеваете под «стоимость секунды».

возможно, вы хотите отсчет секунд от ссылка эпоху первого момента 1970 года в UTC.

если бы вашей целью было просто создать экземпляр java.sql.Date , не беспокойся. Никогда больше не используйте этот класс. Но, к вашему сведению, ваша конкретная проблема, вероятно, является побочным эффектом ужасного дизайна, используемого для этого класса. The java.sql.Date класс наследует от java.util.Date что-дата-с-Тип времени. The java.sql.Date класс выдает быть значением только для даты, но на самом деле его время суток установлено на 00:00:00. Хуже того, документация говорит нам игнорировать тот факт, что он является подклассом. Не трудитесь пытаться понять это; просто используйте java.время вместо.

если вы пытаетесь работать только с временем суток, извлеките , теперь режим обслуживания, советует переходить на java.время классы.

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Не нужны ниточки, не нужны ниточки. java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и зафиксировать.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.время занятия.
    • для более раннего Android (ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP..

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к Java.время. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и больше.

A deeper look into the Java 8 Date and Time API

Within this post we will have a deeper look into the new Date/Time API we get with Java 8 (JSR 310). Please note that this post is mainly driven by code examples that show the new API functionality. I think the examples are self-explanatory so I did not spent much time writing text around them 🙂

Let’s get started!

Working with date and time objects

All classes of the Java 8 Date/Time API are located within the java.time package. The first class we want to look at is java.time.LocalDate . A LocalDate represents a year-month-day date without time. We start with creating new LocalDate instances:

LocalTime and LocalDateTime are the next classes we look at. Both work similar to LocalDate . A LocalTime works with time (without dates) while LocalDateTime combines date and time in one class:

By default LocalDate / Time classes will use the system clock in the default time zone. We can change this by providing a time zone or an alternative Clock implementation:

From LocalDate / Time objects we can get all sorts of useful information we might need. Some examples:

Some information can be obtained without providing a specific date. For example, we can use the Year class if we need information about a specific year:

We can use the plus and minus methods to add or subtract specific amounts of time. Note that these methods always return a new instance (Java 8 date/time classes are immutable).

TemporalAdjusters are another nice way for date manipulation. TemporalAdjuster is a single method interface that is used to separate the process of adjustment from actual date/time objects. A set of common TemporalAdjusters can be accessed using static methods of the TemporalAdjusters class.

Static imports make this more fluent to read:

Time zones

Working with time zones is another big topic that is simplified by the new API. The LocalDate / Time classes we have seen so far do not contain information about a time zone. If we want to work with a date/time in a certain time zone we can use ZonedDateTime or OffsetDateTime :

Timestamps

Classes like LocalDate and ZonedDateTime provide a human view on time. However, often we need to work with time viewed from a machine perspective. For this we can use the Instant class which represents timestamps. An Instant counts the time beginning from the first second of January 1, 1970 (1970-01-01 00:00:00) also called the EPOCH. Instant values can be negative if they occured before the epoch. They follow ISO 8601 the standard for representing date and time.

Periods and Durations

Period and Duration are two other important classes. Like the names suggest they represent a quantity or amount of time. A Period uses date based values (years, months, days) while a Duration uses seconds or nanoseconds to define an amount of time. Duration is most suitable when working with Instants and machine time. Periods and Durations can contain negative values if the end point occurs before the starting point.

Читать еще:  Код ошибки msvcr100 dll

Formatting and parsing

Formatting and parsing is another big topic when working with dates and times. In Java 8 this can be accomplished by using the format() and parse() methods:

Conversion between different date / time objects

Of course we do not always have objects of the type we need. Therefore, we need an option to convert different date/time related objects between each other. The following examples show some of the possible conversion options:

With Java 8 we get a very rich API for working with date and time located in the java.time package. The API can completely replace old classes like java.util.Date or java.util.Calendar with newer, more flexible classes. Due to mostly immutable classes the new API helps in building thread safe systems.

The source of the examples can be found on GitHub.

How to Convert java.util.Date to java.time.LocalDate in Java 8 — Examples Tutorial

Hello guys, once you move to Java 8, you will often find yourself working between old and new Date and Time API, as not all the library and system you interact will be using Java 8. One of the common tasks which arise from this situation is converting old Date to new LocalDate and that’s what you will learn in this tutorial. There seems to be a couple of ways to convert a java.util.Date to java.time.LocalDate in Java 8, but which one is the best way? We’ll figure it out in this article, but first, let’s explore these different ways to convert a java.util.Date object to LocalDate in Java 8 code.

Btw, even though both Date and LocalDate is used to represent dates in Java they are not quite same, they don’t contain even similar information.

For example, the old Date class contains both date and time components but LocalDate is a just date, it doesn’t have any time part in it like «15-12-2016» , which means when you convert Date to LocalDate then time-related information will be lost and when you covert LocalDate to Date, they will be zero.

In other words, to convert java.util.Date to java.time.LocalDate , you need to ignore the time part.

Another key difference between Date and LocalDate is the time zone. The old date doesn’t have timezone associated with it but when you print it will print in system’s default time zone. Similarly, the LocalDate is also the date of local timezone i.e. it will give you the date of the machine where Java is running.

Btw, these are just tip of the iceberg of massive new and improved DateTime API of Java 8. If you are interested to learn and master this very useful topic, I suggest you join The Complete Java MasterClass course on Udemy. One of the most up-to-date and affordable course to learn Java better, it was recently updated to cover Java 11 and we see a newer version after Java 12 release.

3 Ways to Convert java.util.Date to java.time.LocalDate in Java 8

Here are some of the common ways to convert a java.util.Date to java.time.LocalDate class in Java 8. These approaches demonstrate different techniques of conversion and you can choose whichever you want to and depend on what suits best to your situation, but we’ll analyze pros and cons of each approach and conclude which is the best and easiest way to convert old Date to new LocalDate in Java 8.

1. Using Instant and ZonedDateTime

This approach is simple and straightforward. Since Date represents both date and time, but without timezone, it is equivalent to new java.time.Instant class, which is nothing but a point in time scale.

The Java designer provides to/from methods like toInstant() to convert java.util.Date to java.time.Instant Object .

Here is the code:

Once you converted old Date to Instant class, you can convert it into ZonedDateTime by using the default timezone of System.

Why we have used default timezone, given LocalDate doesn’t store timezone information? Well, because the date can change when timezone changes and LocalDate is the date in the local timezone, hence we use ZoneId.systemDefault() to convert Instant to ZonedDateTime .

The final, toLocalDate() method strips off time and timezone related information and returns you just Date. So it’s a three-step process but very easy once you understand basic concepts of java.time API. You can further see the Java 8 New Features In Simple Way to learn more about this class and API.

2. Using Millisecond

We can use the same technique to convert java.util.Date to java.time.LocalDate in Java 8. This example is quite similar to the previous example where we first get an Instant, then timeZone information for calculating LocalDate.

I want to learn more about the relationship between new and old date and time API, you can further in What’s New in Java 8 course on Pluralsight. It has nicely explained the connection between old and new Date Time API.

Btw, you would need a Pluralsight membership to access this course which cost around $29 per month but give access to more than 5000+ online courses on Pluralsight to learn any latest technology.

Even if you don’t have a membership, you can still access this course by taking advantage of their 10-day free pass which provides 200 minutes of watch time to access any course.

Читать еще:  Javascript form serialize

3. Using java.sql.Date (Best way)

This is my favorite and certainly the best and easiest way to convert a java.util.Date to java.time.LocalDate in Java8. It’s quite similar to the way we convert util date to SQL date.

You get the number of millisecond from Epoch by calling getTime() to create a java.sql.Date and then just call the toLocalDate() method which is conveniently added by Java API designers for easy conversion from java.sql.Date to java.time.LocalDate.

Now, some of you might be having doubt that why not such method is added into a java.util.Date and why they have added it instead on java.sql.Date ?

Well, you can answer this question by yourself if you know the difference between java.util.Date and java.sql.Date class.

The java.util.Date object is not really a date like «21-12-2016», instead, it contains both date and time e.g. «21-12-2016:06:04», while later just contain the date, which is what LocalDate represent in new java.time API, hence a toLocalDate() method in java.sql.Date makes perfect sense.

You can further read Java SE 8 for Really Impatient by Cay S. Horstmann to learn more about Java 8 Date and Time API and how to convert classes from old Date and Calendar API to new Date and Time API.

4. Using Individual Fields

Why? because all three methods like getYear() , getMonth(), and getDate() are deprecated and can be removed in the future version without notice.

It’s also tricky to understand the code e.g. why you adding 1900 on the year and doing plus 1 on month? It’s because of java.util.Date return year from 1900 and the first month is zero in old Date API but 1 in new Date API.

That’s all about 3 ways to convert java.util.Date to java.time.LocalDate in Java 8. Actually, we have seen four ways to do the job but the second one is very similar to the first one, hence you can think of the same way.

Bottom line is to remember that Date is not equal to LocalDate, instead, it’s an equivalent class in a new date and time API is Instant, hence you have the toInstant() conversion method defined in Date class.

The closest class of LocalDate in old Date and Calendar API is the java.sql.Date because similar to java.time.LocalDate this class also just contain date value, no time fractions. This is why you have a toLocalDate() method defined in this class.

So, next time, you retrieve date from the database using JDBC, you can directly convert it to LocalDate as well. This is also the best way to convert java.util.Date to java.time.LocalDate in Java 8 in my opinion.

Btw, this is just the tip of the iceberg from Java 8. If you want to learn more about new features, particularly JSR 310 or new Date and Time API, I suggest checking the following resources to learn more about Java 8 features.

Как преобразовать java.time.Duration в java.sql.Time?

Каков наилучший способ преобразования java.time.Duration -объекта в java.sql.Time ?Как преобразовать java.time.Duration в java.sql.Time?

Я получаю ISO8601-String, как PT15M51S и Duration.parse(String s) вполне подходит в этом случае.

Но теперь я боюсь, как получить java.sql.Time , но это в PreparedStatement с setTime(java.sql.Time time) , чтобы сохранить его в моей базе данных MySQL с помощью JDBC.

Я закончил тем, что писал солитер как от org.apache.commons.lang3.time.DurationFormatUtils :

И для следующей проблемы: Как получить java.time.Duration от java.sql.Time .

ответ

Является ли структура базы данных фиксированной? Я думаю, TIME или TIMESTAMP , вероятно, не лучший тип данных для продолжительности. Я бы изменил тип столбца на BIGINT (aka Long ) и конвертировал продолжительность в миллисекунды (или наносекунды в зависимости от ваших потребностей) с Duration.toMillis() .

Если это не вариант, вы можете использовать аналогичную логику и представлять продолжительность как смещение от определенной отметки времени, например 1970-01-01T00:00:00.000Z с Duration.addTo(referenceDate) или java.sql.Time(durationInMillis) . Чтобы снова получить экземпляр Duration , вам нужно будет использовать Duration.ofMillis(sqlTime.getTime()) .

Это в основном варианты у вас есть:

Использование BIGINT в качестве колонного типа (предпочтительное решение):

Использование TIME или TIMESTAMP как тип столбца. Вы можете заменить java.sql.Time с java.sql.Timestamp в коде ниже в зависимости от фактического типа столбца:

Согласно документации в MySQL TIME типа поддерживает диапазоны от -838:59:59 до 838:59:59 (см here). Но по умолчанию ни один из типов TIME , DATE или TIMESTAMP не поддерживает дробные секунды, если только заданная точность не указана во время создания столбцов базы данных (см. here). То есть для хранения миллисекунды в TIME столбце таблицы должен быть создан так:

Обновление:

  • Добавлено более подробные примеры кода
  • Добавлена ​​ссылка Документация MySQL относительно поддерживаемых минимальных значений для TIME

A java.sql.Time is не Продолжительность, это время в течение дня (т.е. обычные 24-часовые часы).Хранение длительности в нем — это взломать и взломать этот хак, если эта продолжительность больше 24 часов. Вам лучше хранить его как строку продолжительности ISO, или в виде типа данных (например, двойной или, возможно, числовой), или если ваша база данных поддерживает это: в interval .

Однако, если вы все еще хотите сохранить длительность в SQL TIME : Точка преобразования из java.time в java.sql.Time является java.time.LocalTime использованием java.sql.Time.valueOf(LocalTime) . Таким образом, чтобы конвертировать из Duration в java.sql.Time вы можете сделать:

Спинка преобразование будет:

Имейте в виду, что java.sql.Time может иметь только точность в секундах. При использовании драйвера JDBC 4.2 совместимость с драйвером java.sql.Time не требуется, поскольку сохранение java.time.LocalTime поддерживается напрямую с использованием setObject(1, ) и getObject(1, java.time.LocalTime.class) .

Хотя я согласен с тем, что хранить длительность в столбце ‘TIME’ не рекомендуется, это не будет длиться дольше 24 часов. Я обновил свой ответ ссылкой на соответствующий раздел документации по MySQL . – dpr

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector