Java программа для получения текущей даты без отметки времени

Мне нужна программа на Java, чтобы получить текущую дату без отметки времени:

Date d = new Date();

дает мне дату и время.

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

На печать

System.out.println("Current Date : " + d)

из d он должен напечатать May 11 2010 - 00:00:00,

17 ответов

Решение

java.util.Date Объект является своего рода меткой времени - он содержит количество миллисекунд с 1 января 1970 года, 00:00:00 UTC. Таким образом, вы не можете использовать стандарт Date объект должен содержать только день / месяц / год без времени.

Насколько я знаю, нет действительно простого способа сравнить даты, принимая во внимание только дату (а не время) в стандартном Java API. Вы можете использовать класс Calendar и очистите часы, минуты, секунды и миллисекунды:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.AM_PM);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

Сделать то же самое с другим Calendar объект, который содержит дату, с которой вы хотите сравнить, и использовать after() или же before() методы, чтобы сделать сравнение.

Как объяснено в Javadoc для java.util.Calendar.clear (int field):

Поля HOUR_OF_DAY, HOUR и AM_PM обрабатываются независимо, и применяется правило разрешения для времени суток. Очистка одного из полей не сбрасывает значение часа в календаре. Используйте set(Calendar.HOUR_OF_DAY, 0), чтобы сбросить значение часа.

редактировать - ответ выше с 2010 года; в Java 8 есть новый API даты и времени в пакете java.time который гораздо мощнее и полезнее старого java.util.Date а также java.util.Calendar классы. Используйте новые классы даты и времени вместо старых.

Вы всегда можете использовать Apache Commons' DateUtils учебный класс. Имеет статический метод isSameDay() которая "проверяет, если два объекта даты находятся в один и тот же день, игнорируя время".

static boolean isSameDay(Date date1, Date date2) 

Используйте DateFormat для решения этой проблемы:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
DateFormat dateFormat2 = new SimpleDateFormat("MM-dd-yyyy");
print(dateFormat.format(new Date()); // will print like 2014-02-20
print(dateFormat2.format(new Date()); // will print like 02-20-2014

Я сделал следующее, и это сработало: (текущая дата без отметки времени)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date today = dateFormat.parse(dateFormat.format(new Date()));

Вы могли бы использовать

// Format a string containing a date.
import java.util.Calendar;
import java.util.GregorianCalendar;
import static java.util.Calendar.*;

Calendar c = GregorianCalendar.getInstance();
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
// -> s == "Duke's Birthday: May 23, 1995"

Посмотрите на Formatter API документация.

  DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy");
  java.util.Date date = new java.util.Date();
  System.out.println("Current Date : " + dateFormat.format(date));

Вы можете получить к этой дате:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
print(dateFormat.format(new Date());

Принятый ответ Джеспер является правильным, но сейчас устарел. Классы java.util.Date и.Calendar печально известны своими проблемами. Избежать их.

java.time

Вместо этого используйте инфраструктуру java.time, встроенную в Java 8 и более поздние версии, перенесенную обратно в Java 6 и 7 и дополнительно адаптированную для Android.

Если вы действительно не заботитесь о времени суток и часовых поясах, используйте LocalDate в фреймворке java.time ().

LocalDate localDate = LocalDate.of( 2014 , 5 , 6 );

Имейте в виду, что если у вас есть шанс столкнуться с другими часовыми поясами или UTC, это неправильный путь. Наивные программисты склонны думать, что им не нужны часовые пояса, хотя на самом деле они нужны.

Вызов toString для генерации строки в стандартном формате ISO 8601.

String output = localDate.toString();

2014-05-06

Для других форматов выполните поиск переполнения стека для DateTimeFormatter учебный класс.

Joda времени

Хотя теперь вытесняется java.time, вы можете использовать аналогичные LocalDate класс в библиотеке Joda-Time (вдохновение для java.time).

LocalDate localDate = new LocalDate( 2014, 5, 6 );

Также вы можете использовать apache commons lib DateUtils.truncate():

Date now = new Date();
Date truncated = DateUtils.truncate(now, Calendar.DAY_OF_MONTH);

Время будет установлено на 00:00:00 так что вы можете работать с этой датой или распечатать ее в формате:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println(dateFormat.format(now);        // 2010-05-11 11:32:47
System.out.println(dateFormat.format(truncated);  // 2010-05-11 00:00:00
private static final DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 
    private static Date NOW = new Date();
    static {
        try {
            NOW = df1.parse(df1.format(new Date()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

Если вы действительно хотите использовать вместо Календаря дату для сравнения, это самый короткий фрагмент кода, который вы можете использовать:

Calendar c = Calendar.getInstance();
Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
                               c.get(Calendar.MONTH), 
                               c.get(Calendar.DAY_OF_MONTH)).getTime();

Таким образом вы убедитесь, что значения часов / минут / секунд / миллисекунд не заполнены.

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

java.sql.Date dt1 = new java.sql.Date(System.currentTimeMillis());
String dt1Text = dt1.toString();
System.out.println("Current Date1 : " + dt1Text);

Thread.sleep(2000);

java.sql.Date dt2 = new java.sql.Date(System.currentTimeMillis());
String dt2Text = dt2.toString();
System.out.println("Current Date2 : " + dt2Text);

boolean dateResult = dt1.equals(dt2);
System.out.println("Date comparison is " + dateResult);
boolean stringResult = dt1Text.equals(dt2Text);
System.out.println("String comparison is " + stringResult);

Выход:

Текущая дата1: 2010-05-10
Текущая дата2: 2010-05-10
Сравнение дат неверно
Сравнение строк верно

Вот полный пример этого. Но вы должны привести Стинга к дате.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

//TODO OutPut should LIKE in this format MM dd yyyy HH:mm:ss.SSSSSS
public class TestDateExample {

    public static void main(String args[]) throws ParseException {
        SimpleDateFormat changeFormat = new SimpleDateFormat("MM dd yyyy HH:mm:ss.SSSSSS");
         Date thisDate = new Date();//changeFormat.parse("10 07 2012"); 
         System.out.println("Current Date : " + thisDate);
         changeFormat.format(thisDate); 
        System.out.println("----------------------------"); 
        System.out.println("After applying formating :");
        String strDateOutput = changeFormat.format(thisDate);
        System.out.println(strDateOutput);

    }

}

Eaxmple

Я искал такое же решение, и мне помогло следующее.

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.clear(Calendar.HOUR);
    calendar.clear(Calendar.MINUTE);
    calendar.clear(Calendar.SECOND);
    calendar.clear(Calendar.MILLISECOND);

    Date today = calendar.getTime();

Обратите внимание, что я использую calendar.set(Calendar.HOUR_OF_DAY, 0) для HOUR_OF_DAY вместо использования метода clear, потому что это предлагается в javadocs метода Calendar.clear следующим образом

Поля HOUR_OF_DAY, HOUR и AM_PM обрабатываются независимо, и применяется правило разрешения для времени суток. Очистка одного из полей не сбрасывает значение часа в календаре. Используйте set (Calendar.HOUR_OF_DAY, 0), чтобы сбросить значение часа.

С вышеприведенным решением я получаю вывод как

Wed Sep 11 00:00:00 EDT 2013

Использование метода очистки для HOUR_OF_DAY сбрасывает часы в 12 при выполнении после 12:00 или 00 при выполнении до 12:00.

Я сделал следующее, и это сработало:

calendar1.set(Calendar.HOUR_OF_DAY, 0);
calendar1.set(Calendar.AM_PM, 0);
calendar1.set(Calendar.HOUR, 0);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);
calendar1.set(Calendar.MILLISECOND, 0);
Date date1 = calendar1.getTime();       // Convert it to date

Сделайте это для других случаев, с которыми вы хотите сравнить. Эта логика сработала для меня; Я должен был сравнить даты, равны ли они или нет, но вы можете сделать разные сравнения (до, после, равно и т. Д.)

Вот мой код для получения только даты:

Calendar c=Calendar.getInstance();
DateFormat dm = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date date = new java.util.Date();
System.out.println("current date is :    " + dm.format(date));

Я думаю, что это будет работать. Используйте Календарь, чтобы манипулировать полями времени (сбросьте их на ноль), затем получите дату из календаря.

Calendar c = GregorianCalendar.getInstance();
c.clear( Calendar.HOUR_OF_DAY );
c.clear( Calendar.MINUTE );
c.clear( Calendar.SECOND );
c.clear( Calendar.MILLISECOND );
Date today = c.getTime();

Или сделай наоборот. Поместите дату, с которой вы хотите сравнить в календаре и сравнить даты календаря

Date compareToDate;  // assume this is set before going in.
Calendar today = GregorianCalendar.getInstance();
Calendar compareTo = GregorianCalendar.getInstance();
compareTo.setTime( compareToDate );
if( today.get( Calendar.YEAR ) == compareTo.get( Calendar.YEAR ) &&
    today.get( Calendar.DAY_OF_YEAR  ) == compareTo.get( Calendar.DAY_OF_YEAR  ) ) {
  // They are the same day!
}
Другие вопросы по тегам