Получение сегодняшней даты в java - я пробовал обычные способы

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

Я пробовал

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

Запуск: (Это серьезно испортилось)

Если час на компьютере равен < 12:00 в полдень: Вс Мар 08 00:44:39 IST 2009

Если час на компьютере составляет > 12:00 в полдень: Вс Мар 08 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);

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

Любая другая опция?

Спасибо!

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Вы должны использовать 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:

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

ЧАС:

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

Ответ 4

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

Ответ 6

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

Calendar.HOUR_OF_DAY

В отличие от

Calendar.HOUR

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Что эффективно возвращает сегодня, дата.

Ответ 9

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

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

Ответ 10

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

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

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