2012-02-17 1 views
9

Мы сохраняем дату и дату и время как объект Date.Как узнать, содержит ли объект java.util.Date временную часть?

Но, в конце, нам нужно определить, является ли объект Date датой или датой.

05/18/05 00:00:00 и 05/18: 05 оба имеют час/минуту. Я не могу сказать им обособленно.

+0

Из-за любопытства, у Java нет способа сравнить разные форматы дат? Это очень просто в .NET. – Jason

+0

'Календарь c = Calendar.getInstance(); Дата x; // заполняется некоторыми данными ' ' c.setTime (x); c.get (Calendar.YEAR) // или поле, которое вы хотите. –

+0

@Jason «форматы даты» в java предназначены для рендеринга/синтаксического анализа. Даты всего лишь завернутые миллионы с 1970 года, которые вы можете сравнить. Даты не имеют «формата» - они форматируются объектом DateFormat. – Bohemian

ответ

3

java.util.Date - это, по сути, момент времени, а не дата, поэтому нет возможности использовать его только в качестве даты. Вам нужно будет придумать другой подход.

+0

Да. Этот подход является ошибочным. Нам нужен другой объект для даты и времени. – thinkanotherone

+0

Я не могу поверить, что это было отмечено как лучший ответ. Это не решение, просто мнение – FiruzzZ

0

Возможно, вы можете использовать библиотеку Google's DateTime для проверки.

У него есть методы parseDateTime и parseDate, которые будут вызывать NumberFormatException, если они не отформатированы правильно.

Тогда вы могли бы сделать ...

try { 
    DateTime someVar = DateTime.parseDate("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date... 
} 

try { 
    DateTime someVar = DateTime.parseDateTime("your_date_as_a_string"); 
} catch (java.lang.NumberFormatException nfe) { 
    // This isn't a date/time... 
} 
+0

Вам следует избегать использования исключений для управления потоком! – Bohemian

+0

@Bohemian - а? почему нет? –

+0

На самом деле, при работе с пользовательским вводом (т. Е. Текстовыми полями в веб-форме), где вам нужно проверить правильность даты, заданной пользователем, использование синтаксического анализатора на входящем в них вводом будет единственным способом, которым я являюсь чтобы подтвердить его ... –

0

Я понимаю, что вы на самом деле имеем дело с java.sql.Date и java.sql.Timestamp случаях, как полученные из JDBC ResultSet в то время как они объявлены против своего суперкласса java.util.Date, верно?

В этом случае просто используйте instanceof.

if (date instanceof java.sql.Date) { 
    // It was originally a DATE. 
} else if (date instanceof java.sql.Timestamp) { 
    // It was originally a TIMESTAMP (DATETIME). 
} 
5

Если ваши DateTimes не гарантированы не будет в полночи, то есть они никогда не HH:mm:ss из 00:00:00, нет надежного способа сказать «дату» и DateTimes, которые случаются быть в полночи друг от друга.

Если DateTimes никогда не в полночь, а затем:

if (new SimpleDateFormat("HH:mm:ss").format(object).equals("00:00:00")) 

бы сделать, чтобы определить, является ли Date объект является «дата».

Я думаю, что ваш дизайн испорчен, и вы должны найти другое решение. Я также считаю, что название класса Date ошибочно и вызывает подобную путаницу.

+0

'' 00:00:00 ".equals (новый формат SimpleDateFormat (" hh: mm: ss "). format (object));' – rptmat57

+0

@rpt, что вы думаете? – Bohemian

+0

просто лучше использовать струнные литералы на другой стороне. хотя я не думаю, что метод формата когда-либо возвращал нуль – rptmat57

0

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

Итак, подумав немного поперечно здесь, вы можете создать свой собственный класс, который расширяет Date, который имеет переменную-член, называемую «isDateTime». Затем, когда вы первоначально загружаете дату или значение datetime, установите для boolean значение true или false в зависимости от того, является ли это datetime или нет.

3

Использование Apache Commons-Ланг-3:

DateUtils.truncate(fecha, Calendar.DAY_OF_MONTH).equals(fecha) 
1

Нет необходимости для синтаксического анализа, форматирования или 3-библиотеки сторон. Вы можете легко сделать:

Calendar c = ... 
c.setTime(date); 
//this doesn't care about nanos 
if(c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) > 0) { 
.... 
} 

PD: Я делаю это с 1000-25.000 объектов и, похоже, не поставит под угрозу производительность, но, конечно, все будет зависеть от того, где и почему вы хотите это сделать.

+0

Является ли этот подход более эффективным или сравнивает временную часть как 'String', как описал _Bohemian_? – dk7

+1

Как я уже сказал, для этого «подхода» не нужен SimpleDateFormat (который не является ** дешевым объектом **, который будет создан, если u будет делать много раз сравнение), также SDF не является потоковым сейфом, поэтому зависит контекст (многопоточный), он может потерпеть неудачу и еще несколько причин, которые не соответствуют теме – FiruzzZ

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