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

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

Date d = new Date();

дает дату и временную метку.

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

При печати

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

of d он должен напечатать May 11 2010 - 00:00:00.

Ответ 1

A 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, ЧАСЫ и AM_PM обрабатываются независимо и применяется правило разрешения для времени суток. При очистке одного из полей не reset значение часа дня этого Календаря. Используйте set (Calendar.HOUR_OF_DAY, 0) до reset значение часа.

edit - ответ выше с 2010 года; в Java 8 в пакете java.time появился новый API с датой и временем, который намного более эффективен и полезен, чем старые классы java.util.Date и java.util.Calendar. Используйте новые классы даты и времени вместо старых.

Ответ 2

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

static boolean isSameDay(Date date1, Date date2) 

Ответ 3

Используйте 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

Ответ 4

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

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

Ответ 5

Вы можете использовать

// 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 Birthday: %1$tm %1$te,%1$tY", c);
// -> s == "Duke Birthday: May 23, 1995"

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Также вы можете использовать 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

Ответ 9

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();
        }
    }

Ответ 10

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

java.time

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

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

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 );

Ответ 11

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

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!
}

Ответ 12

Здесь неэлегантный способ сделать это быстро без дополнительных зависимостей.
Вы можете просто использовать 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
Сравнение даты неверно
Сравнение строк истинно

Ответ 13

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

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

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

Ответ 14

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

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

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

Ответ 15

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

    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, потому что это предлагается в методе Calendar.clear javadocs следующим образом

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

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

Wed Sep 11 00:00:00 EDT 2013

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

Ответ 16

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

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));