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);
}
}
Я искал такое же решение, и мне помогло следующее.
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!
}