Как сравнить время Календаря с объектом java.sql.Time? - PullRequest
0 голосов
/ 07 января 2012

Я хочу знать, равны ли значения времени объекта Calendar значению объекта java.sql.Time.

Например,

Calendar c; //c.getTime().toString() == "Sat Jan 07 09:00:00 GMT 2012"
Time t;     //d.toString() == "09:00:00";

Я пытался

t.equals(c.getTime())

Но поскольку в календаре есть информация о дате, выражение является ложным.

Как лучше всего сравнить их?

Редактировать:
Объект Time извлекается через Hibernate и не содержит информации о дате.

Объект Calendar создается

Calendar c= Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 9);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);

Ответы [ 5 ]

2 голосов
/ 07 января 2012

То, как вы используете, прекрасно.Однако цель неясна.Почему вы хотите, чтобы c было равно d?

Кроме того, нет способа, чтобы d.toString() == "09:00:00" - Date всегда имела, ну, в том числе, дату.

Более важно, однако, то, что Date не имеет информации о часовом поясе (хорошо, она имела обыкновение иметь, но вам не рекомендуется касаться этой части Date), поэтому вы не можете отличить 09:00 UTC от 10:00 BST -то есть, если вы не укажете часовой пояс.Вы можете получить часовой пояс из Calendar c, и это как бы объясняет, что вам нужно сделать:

  1. Создать Calendar из вашей даты
  2. Скопировать часовой пояс из календаря, который выуже используйте
  3. Сравните поля Calendar, которые вас интересуют.Я полагаю, это будет час, минута, секунда и, возможно, миллисекунда.

Обновление: теперь, когда вы упомянули, что на самом деле java.sql.Time, я волнуюсь,Проблема в том, что

  • SQL-серверы обычно хранят время в виде структуры, содержащей часы, минуты, секунды и т. Д. То есть существует подразумеваемый часовой пояс (часовой пояс SQL Server)
  • java.sql.Time хранит время в миллисекундах с момента «нулевой эпохи» 1 января 1970 года. Часть даты обычно вырезается до 1 января 1970 года - но этот класс не содержит информацию о часовом поясе.(Ну, опять же, вроде как, но не рекомендуется.)
  • Calendar имеет явно установленный часовой пояс

На практике это означает, что время отСервер преобразуется в миллисекунды с использованием системного часового пояса по умолчанию , затем вы читаете это значение и сравниваете его с Calendar с его собственным часовым поясом.

Если это звучит запутанно и хрупко, это потому, чтоявляется.Таким образом, в основном у вас есть три часовых пояса:

  1. SQL Server TZ
  2. JVM по умолчанию TZ
  3. Календарь TZ

Все три должны бытьтак же, чтобы любое сравнение имело смысл.

1 голос
/ 07 января 2012

Вы можете использовать Date, Calendar, GregorianCalendar, SimpleDateFormat` и т. Д.с датой-временем в Java.Давайте рассмотрим несколько примеров.

SimpleDateFormat dayFormat = new SimpleDateFormat("D");
int _currentDay = Integer.parseInt(dayFormat.format(new Date(System.currentTimeMillis())));

SimpleDateFormat monthFormat = new SimpleDateFormat("M");
int _currentMonth = Integer.parseInt(monthFormat.format(new Date(System.currentTimeMillis())));

SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
int _currentYear = Integer.parseInt(yearFormat.format(new Date(System.currentTimeMillis())));

System.out.println(_currentDay+"/"+_currentMonth+"/"+_currentYear);

Будет отображать текущую дату на основе текущей миллисекунды.


String toDate = "07/1/2012";

DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
Calendar currentDateCal = Calendar.getInstance();

// Zero out the hour, minute, second, and millisecond.
currentDateCal.set(Calendar.HOUR_OF_DAY, 0);
currentDateCal.set(Calendar.MINUTE, 0);
currentDateCal.set(Calendar.SECOND, 0);
currentDateCal.set(Calendar.MILLISECOND, 0);

Date currentDate = currentDateCal.getTime();

Date toDt;

try
{
     toDt = df.parse(toDate);
}
catch (ParseException e)
{
     toDt = null;
     System.out.println(e.getMessage());
}

if (currentDate.equals(toDt))
{
     System.out.println(currentDate);  // Displays the current date.

     //Rest of the stuff.
}

String toDate = "07/12/2012";
try
{
     if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime() / (1000 * 60 * 60 * 24) >= System.currentTimeMillis() / (1000 * 60 * 60 * 24)) 
     {
         System.out.println("True");
     }
     else
     {
         System.out.println("Untrue");
     }
}
catch(ParseException ex)
{
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

String toDateAsString = "07/12/2012";
Date toDate=null;

try
{
    toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString);
}
catch (ParseException ex)
{
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

long toDateAsTimestamp = toDate.getTime();
long currentTimestamp = System.currentTimeMillis();
long getRidOfTime = 1000 * 60 * 60 * 24;
long toDateAsTimestampWithoutTime = toDateAsTimestamp / getRidOfTime;
long currentTimestampWithoutTime = currentTimestamp / getRidOfTime;

if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime)
{
    System.out.println("True");
}
else
{
    System.out.println("False");
}

Вариант JodaTime :

String toDateAsString = "07/01/2012";
DateTime toDate = DateTimeFormat.forPattern("MM/d/yyyy").parseDateTime(toDateAsString);
DateTime now = new DateTime();

if (!toDate.toLocalDate().isBefore(now.toLocalDate()))
{
    System.out.println("True");
} 
else
{
    System.out.println("False");
}
0 голосов
/ 09 мая 2014

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

Методология:

  • java.sql.Time имеет getTime() из-за наследования от java.util.Date.Используя этот метод, можно создать объект java.util.Date, который представляет только часть времени с начала эпохи Java.
  • Для сравнения необходимо преобразовать требуемый объект java.util.Calendar, чтобы получить объект java.util.Date, который представляет другойвремя, прошедшее с эпохи Java.
  • Поскольку части даты теперь эквивалентны, любое сравнение между этими двумя объектами будет сравнивать только части времени, дающие желаемый результат.

Без дополнительной информации, здесьэто код:

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test {

    /**
     * Method to convert a calendar object to java's epoch date
     * keeping only the time information
     */
    public static Date toEpochDate(Calendar calendar) {
        return new Date(Time.valueOf(new SimpleDateFormat("HH:mm:ss").format(calendar.getTime())).getTime());
    }

    public static void main(String[] args) {

        // create any calendar object
        Calendar someTime = Calendar.getInstance();
        someTime.set(Calendar.HOUR_OF_DAY, 17);
        someTime.set(Calendar.MINUTE, 0);
        someTime.set(Calendar.SECOND, 0);

        // convert it to java epoch date
        Date someDate = toEpochDate(someTime);

        // create a date object from java.sql.Time
        Date fromSqlTime = new Date(Time.valueOf("17:00:00").getTime());

        // now do the comparison
        System.out.println("Some Date: " + someDate.toString());
        System.out.println("Sql Time: " + fromSqlTime.toString());
        System.out.println("Are they equal? " + someDate.equals(fromSqlTime));
    }
}

Приведенный выше выводит следующий вывод:

Some Date: Thu Jan 01 17:00:00 EST 1970
Sql Time: Thu Jan 01 17:00:00 EST 1970
Are they equal? true

Используя вышеуказанную методологию и изменяя .equals() на .before() или .after(), различныеМогут быть созданы удобные методы сравнения времени.

0 голосов
/ 07 января 2012

С тех пор, как вы пометили этот вопрос DateTime, я предполагаю, что вы уже используете Joda

...
//Initialize Calendar and Date Object

DateTime d1 = new DateTime(c.getTime());
DateTime d2 = new DateTime(d.getTime());

// Convert d1 and d2 to LocalDate say ld1 and ld2 since, Java Date defaults to GMT

ld1.compareTo(ld2); 

0 голосов
/ 07 января 2012

почему бы вам не сравнить время в миллисекундах?

Date d;
Calendar c;
System.out.println(d.getTime() == c.getTimeInMillis());
...