Расчет даты Java - PullRequest
       3

Расчет даты Java

0 голосов
/ 27 февраля 2012

У меня есть поле базы данных, где дата хранится в формате ДД / ММ / ГГГГ.Теперь, что я хочу сделать, это посмотреть, если сегодня дата = сохраненная дата - 1. В основном, если сегодня день до даты окончания.Исходя из этого, я сделаю некоторые действия ...

пример формата:

10/02/2012

Здесь есть проблема форматирования, потому что я использую это:

Date todayDate;

Исохраненная дата VARCHAR2 в БД.Я предполагаю, что мне придется преобразовать полученную дату в обычный формат даты или что-то в этом роде.Буду признателен за помощь.

Обновление:

                currentEndDate =  rset.getString("ENDDATE");
                endDate = (Date)formatter.parse(currentEndDate);
                /*Check if end date = today date - 1*/
                Calendar cal = Calendar.getInstance();
                //set to end date
                cal.setTime(endDate);
                //end date - 1
                cal.add(Calendar.DATE, -1); 
                Date today;

Теперь это то, что у меня есть ... Я пытаюсь получить конечную дату -1, поэтому я сделал это с помощью функции add (),Теперь, как я могу проверить, если дата окончания - 1 == сегодняшняя дата или нет?потому что когда я попытался:

if(today.equals(cal.add(Calendar.date, -1)))

, он сказал void return из функции add.Спасибо,

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Существует три типа JDBC, относящихся ко времени:

  1. Тип JDBC DATE представляет дату, состоящую из дня, месяца и года.Соответствующий тип SQL DATE определен в SQL-92, но он реализуется только подмножеством основных баз данных.Некоторые базы данных предлагают альтернативные типы SQL, которые поддерживают аналогичную семантику.
  2. Тип JDBC TIME представляет время, состоящее из часов, минут и секунд.Соответствующий тип SQL TIME определен в SQL-92, но он реализуется только подмножеством основных баз данных.Как и в случае с DATE, некоторые базы данных предлагают альтернативные типы SQL, поддерживающие сходную семантику.
  3. Тип JDBC TIMESTAMP представляет собой DATE плюс TIME плюс наносекундное поле.Соответствующий тип SQL TIMESTAMP определен в SQL-92, но он реализован только очень небольшим количеством баз данных.

Поскольку стандартный класс Java java.util.Date точно не соответствует ни одному из этих трех типов даты / времени JDBC (он включает в себя как данные DATE, так и TIME, но не имеет наносекунд), JDBC определяет три подкласса java.util.Date для соответствия типам SQL.Это:

  1. java.sql.Date для информации SQL DATE.Поля часа, минуты, секунды и миллисекунды базового класса java.util.Date должны быть установлены в ноль.Если количество миллисекунд, предоставленных конструктору java.sql.Date, является отрицательным, драйвер будет вычислять дату как число миллисекунд до 1 января 1970 года. В противном случае дата вычисляется как указанное число миллисекунд после 1 января,1970.
  2. java.sql.Time для информации о времени SQL.Поля год, месяц и день базового класса java.util.Date установлены на 1970, январь и 1. Это «нулевая» дата в эпоху Java.
  3. java.sql.Timestamp для SQLTIMESTAMP информация.Этот класс расширяет java.util.Date, добавляя поле наносекунд.

Все три временных класса JDBC являются подклассами java.util.Date, и поэтому они могут использоваться там, где ожидается java.util.Date.Например, методы интернационализации принимают в качестве аргумента объект java.util.Date, поэтому им могут передаваться экземпляры любого из классов JDBC, связанных со временем.

Объект метки времени JDBC имеет родительские компоненты даты и времени, а такжеотдельный компонент наносекунд.Если объект java.sql.Timestamp используется там, где ожидается объект java.util.Date, компонент наносекунд теряется.

Однако, поскольку объект java.util.Date сохраняется с точностью до одной миллисекунды, можно поддерживать эту степень точности при преобразовании объекта java.sql.Timestamp в объект java.util.Date.Это делается путем преобразования наносекунд в компоненте наносекунд в целые миллисекунды (путем деления числа наносекунд на 1 000 000) и последующего добавления результата к объекту java.util.Date.При этом преобразовании может быть потеряно до 999 999 наносекунд, но результирующий объект java.util.Date будет с точностью до одной миллисекунды.

Следующий фрагмент кода является примером преобразования объекта java.sql.Timestamp в java.util.Date объект с точностью до одной миллисекунды.

Timestamp t = new Timestamp(98724573287540L);
java.util.Date d;
d = new java.util.Date(t.getTime() + (t.getNanos() / 1000000));
1 голос
/ 27 февраля 2012

Вам нужно превратить строку в дату.Вы можете сделать это в своем запросе или после получения строкового результата:

Вариант 1: превратить его в тип даты в своем запросе:

SELECT TO_DATE("COLNAME", 'MM/DD/YYYY') FROM "MYTABLE"

Вариант 2: превратить его вТип даты после получения строки:

String date_from_db;
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date date = sdf.parse(date_from_db);

Затем вы можете увидеть, находится ли текущее время (new Date()) между полученной датой и днем ​​до этого.Если вы хотите обрабатывать все угловые случаи, включая високосные секунды, вам нужно будет использовать Calendar, но если вы не будете пропускать високосные секунды, тогда будет просто вычесть 24 * 60 * 60 * 1000миллисекунды от вашей даты в БД.

Вы не можете напрямую сравнить Date и Calendar согласно документации API :

...objects равны в том и только в том случае, если метод getTime возвращает одинаковое длинное значение для обоих

Кроме того, Calendar s equals() не будет работать:

Результат верен тогда и только тогда, когда аргумент является объектом Calendar той же системы календаря, который представляет то же значение времени

Простое решение: используйте Calendar 's getTime() метод, который возвращает объект Date, который будет легко сравниваться с другими датами, используя equals(), after() и before().

Или в коде:

cal.add(Calendar.DAY, -1);
if(cal.getTime().equals(new Date())) { ... }

Вы также можете создать другой Calendar и использовать его setTime(), но это кажется менее эффективным.

1 голос
/ 27 февраля 2012

Вы можете напрямую использовать Date тип в вашей БД, и вы можете иметь это непосредственно как Date экземпляр в java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...