Получение сегодняшней даты в Java - я попробовал обычные способы - PullRequest
14 голосов
/ 06 мая 2009

Мне нужна сегодняшняя дата - и ничего больше нуля («05/06/08 00:00:00»)

Я пробовал

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR, 0);        
Date date1 = calendar.getTime();                             
System.out.println(date1);

Run: (Это серьезно испортилось)

Если время на компьютере <12:00 в полдень: вс 8 марта 00:44:39 IST 2009 </p>

Если время на компьютере> 12:00 в полдень: вс 8 марта 12:46:53 IST 2009

Так что я бросил это.

Все установщики даты устарели (кроме времени эпохи), поэтому я не хочу их использовать

Единственное, о чем я мог подумать, это

Calendar calendar = Calendar.getInstance();     
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
String sDate = dateFormat.format(calendar.getTime());
Date today = dateFormat.parse(sDate);

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

Любой другой вариант?

Спасибо!

Ответы [ 10 ]

25 голосов
/ 06 мая 2009

Я использую это:

public static Date startOfDay(Date date) {
   Calendar dCal = Calendar.getInstance();
   dCal.setTime(date);
   dCal.set(Calendar.HOUR_OF_DAY, 0);
   dCal.set(Calendar.MINUTE, 0);
   dCal.set(Calendar.SECOND, 0);
   dCal.set(Calendar.MILLISECOND, 0);

   return dCal.getTime();
 }
18 голосов
/ 06 мая 2009

Мой стандартный совет для вопросов о дате / времени Java: не используйте java.util.{Calendar,Date}. Используйте Joda Time . Таким образом, вы можете представлять дату как дата (без ассоциированного часового пояса) вместо даты / времени. Или вы можете использовать DateMidnight, если это то, что вы хотите представить. (Будьте осторожны с комбинациями часового пояса и даты, где равно нет полуночи, хотя ...)

С чем вам нужно использовать Date? Если вам удастся избежать использования Joda везде, это здорово. В противном случае вы можете использовать Joda, чтобы делать то, что вы хотите, а затем конвертировать в миллисекунды (а затем в java.util.Date), когда вам действительно нужно.

(Решение Майкла при использовании Date / Calendar хорошо, если вы действительно хотите придерживаться сломанного API ... но я не могу преувеличить, насколько лучше Joda ...)

10 голосов
/ 06 мая 2009

Вы должны использовать HOUR_OF_DAY вместо HOUR и комбинировать его с MINUTE и SECOND.

import java.util.Calendar;
import static java.util.Calendar.HOUR_OF_DAY;
import static java.util.Calendar.MINUTE;
import static java.util.Calendar.SECOND;
import static java.util.Calendar.MILLISECOND;

public class Today { 
    public static void main( String [] args ) { 
        Calendar cal = Calendar.getInstance();
        cal.set( HOUR_OF_DAY, 0 );
        cal.set( MINUTE, 0 );
        cal.set( SECOND, 0 );
        cal.set( MILLISECOND, 0 );
        System.out.println( cal.getTime() );
    }
}

Полученные вами результаты обусловлены тем, что HOUR используется для AM / PM, а HOUR_OF_DAY - 24 часа.

HOUR_OF_DAY:

Номер поля для получения и установки с указанием часа дня. HOUR_OF_DAY используется для 24-часовых часов. Например, в 10: 04: 15.250 PM HOUR_OF_DAY - 22.

ЧАС:

Номер поля для получения и установки с указанием часа утра или дня. ЧАС используется для 12-часовых часов (0 - 11). Полдень и полночь представлены 0, а не 12. Например, в 10: 04: 15.250 PM ЧАС - 10.

9 голосов
/ 06 мая 2009

Компонент времени - это не просто часы (а Calendar.HOUR, как вы заметили, AM / PM). Вам необходимо установить все полей времени на 0: HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND.

4 голосов
/ 06 мая 2009

См. Общий язык Apache DateUtils.truncate ()

1 голос
/ 24 июня 2013

Я знаю, что это очень старый вопрос, больше не активный, но он стал главным, когда я искал в Google.

Хотя все советы очень хорошие, я не могу поверить, что никто просто не ответил:

Date date = new Date(System.currentTimeMillis());
System.out.println(date);

Что возвращает результат, сегодняшняя дата.

1 голос
/ 05 марта 2010

... или вы можете сделать это хакерским путем:

long MS_PER_DAY = 86400000L;
Date dateTime=new Date();
long offset = TimeZone.getDefault().getOffset(dateTime.getTime());
Date date= new Date(((dateTime.getTime()+offset)/MS_PER_DAY)*MS_PER_DAY-offset);
1 голос
/ 06 мая 2009

Как уже упоминалось выше, вы должны использовать

Calendar.HOUR_OF_DAY

В отличие от

Calendar.HOUR

Также вам необходимо очистить другие поля (Calendar.MINUTE, Calendar.SECOND и Calendar.MILLISECOND), установив их в ноль.

Извините, здесь нет простого пути. Боль, и именно поэтому они работают над новым API для Java 7, который, я полагаю, основан на Joda Time.

0 голосов
/ 06 мая 2009

Еще один голос за JodaTime.

java.util. Дата и Календарь настолько плохи, что они сломаны. (И SimpleDateFormat тоже мусор!)

Для чего стоит Java 7 будет включать новую библиотеку даты и времени, основанную на JodaTime.

0 голосов
/ 06 мая 2009

Почему манипуляции со строками?

Можете ли вы просто установить нужные значения в объекте Calendar перед преобразованием в Date с помощью getTime ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...