2012-03-09 7 views
46

Мне нужно создать два объекта даты. Если текущая дата и время 9 марта 2012 11:30 утра затемПолучить сегодняшнюю дату на Java в полночь

  • дата объект d1 должны быть 9 марта 2012 12:00 утра
  • даты объект d2 должен содержать текущую дату самого

Дата не будет введена, это системная дата.

Update:

Date dt = new Date(); 
System.out.print(dt.toString()); 

дает текущую дату и время

+6

Что пробовали? Это сработало? Если нет, почему бы и нет? –

+0

@pst добавленный раздел - это d2, который я хочу. Теперь мне нужен объект d1, который является полночь. –

ответ

48
Calendar c = new GregorianCalendar(); 
    c.set(Calendar.HOUR_OF_DAY, 0); //anything 0 - 23 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.SECOND, 0); 
    Date d1 = c.getTime(); //the midnight, that's the first second of the day. 

должно быть Пт 9 марта 00:00:00 IST 2012

+9

Разве вам не нужно устанавливать миллисекунды на ноль? –

+0

Также задан часовой пояс - TimeZone tz = TimeZone.getTimeZone ("UTC"); cal.setTimeZone (tz); –

4

Если вы можете добавить внешнюю LIBS к вашему проекту. Я бы порекомендовал вам попробовать Йоду-время. У него очень умный способ работы с датами.

http://joda-time.sourceforge.net/

+0

+1 за предложение Джоды. его класс DateMidnight должен сделать это за вас. –

+3

@AshwiniRaman Нет, а не 'DateMidnight'. Все «полуночные» классы и методы в Йода-Вре были устаревшими. Они были основаны на ошибочных идеях. Вместо этого используйте метод '' withTimeAtStartOfDay' (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay--) метода 'DateTime'. –

10
Calendar currentDate = Calendar.getInstance(); //Get the current date 
SimpleDateFormat formatter= new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss"); //format it as per your requirement 
String dateNow = formatter.format(currentDate.getTime()); 
System.out.println("Now the date is :=> " + dateNow); 
+0

хорошая работа @ChandraSekhar: D – gumuruh

+0

Это не в полночь, как задает вопрос. – Hugo

1
private static Date truncateTime(Calendar cal) { 
     cal.set(Calendar.HOUR_OF_DAY, 0); 
     cal.set(Calendar.MINUTE, 0); 
     cal.set(Calendar.SECOND, 0); 
     cal.set(Calendar.MILLISECOND, 0); 
     return new Date(cal.getTime().getTime()); 
} 
public static void main(String[] args) throws Exception{ 
     Date d2 = new Date(); 
     GregorianCalendar cal = new GregorianCalendar(); 
     cal.setTime(d2); 
     Date d1 = truncateTime(cal); 
     System.out.println(d1.toString()); 
     System.out.println(d2.toString()); 
} 
35
Date date = new Date(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); 
System.out.println(sdf.format(date)); 
+0

, пожалуйста, измените свой код как 'System.out.println (sdf.format (date));' тогда лучше .. – Raki

+0

благодарит за участие –

+5

Это не в полночь, как задает вопрос. – Hugo

4

Для текущей даты и времени:

String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 

Это будет показано, как:

5 февраля 2013 12:40:24 PM

+0

Это не в полночь, как задает вопрос. – Hugo

1
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
Date date = new Date(); System.out.println(dateFormat.format(date)); //2014/08/06 15:59:4 
+1

Это не в полночь, как задает вопрос. – Hugo

1

Использование org.apache.commons.lang3.time.DateUtils

Date pDate = new Date(); 
DateUtils.truncate(pDate, Calendar.DAY_OF_MONTH); 
7

Вот Java 8, используя новый java.time package (Tutorial).

Если вы можете использовать Java 8 объектов в коде используйте LocalDateTime:

LocalDateTime now = LocalDateTime.now(); // current date and time 
LocalDateTime midnight = now.toLocalDate().atStartOfDay(); 


Если вам требуется унаследованных даты, т.е.java.util.Date:

Преобразовать LocalDateTime вы создали выше Date с помощью этих преобразований:

LocalDateTime ->ZonedDateTime ->Instant ->Date

  1. вызов atZone(zone) с заданным временем -zone (или ZoneId.systemDefault() для временной зоны системы по умолчанию) для создания объекта ZonedDateTime, с поправкой на DST при необходимости.

    ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal")); 
    
  2. Вызов toInstant() преобразовать ZonedDateTime Ань Instant:

    Instant i = zdt.toInstant() 
    
  3. Наконец, вызов Date.from(instant) преобразовать Instant к Date в:

    Date d1 = Date.from(i) 
    


В итоге он будет похож на это для вас:

LocalDateTime now = LocalDateTime.now(); // current date and time 
LocalDateTime midnight = now.toLocalDate().atStartOfDay(); 
Date d1 = Date.from(midnight.atZone(ZoneId.systemDefault()).toInstant()); 
Date d2 = Date.from(now.atZone(ZoneId.systemDefault()).toInstant()); 


Смотрите также раздел Legacy Date-Time Code (The Java™ Tutorials) для совместимости нового java.time функциональности с унаследованными java.util классов.

0

Defining 'полуночи

Слово «полночь» сложно определить.

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

Предлагаю лучше подумать об этом, чтобы получить «первый момент дня».

Это поддерживает широко используемый подход, определяющий промежуток времени как «Полуоткрытый», где начало включено, в то время как окончание является исключительным. Таким образом, полный день начинается с первого момента дня и заканчивается, но не включая, первый момент , следующий за день. Весь день хотелось бы (обратите внимание на дату, идущую от 3-го по 4-й):

2016-02-03T00: 00: 00.0-08: 00 [Америка/Los_Angeles]/2016-02-04T00: 00: 00.0-08: 00 [Америка/Los_Angeles]

Joda времени

При использовании Joda-Time библиотеки, вызовите withTimeAtStartOfDay.

Обратите внимание, как мы указываем часовой пояс. Если опустить, текущий часовой пояс JVM неявно применяется. Лучше быть явным.

DateTime todayStart = DateTime.now(DateTimeZone.forID("America/Montreal")).withTimeAtStartOfDay() ; 

При использовании Java 8 или новее лучше использовать пакет java.time, встроенный в Java. См. sibling Answer от Йенса Хоффмана.

2

Решение в Java 8:

Date startOfToday = Date.from(ZonedDateTime.now().with(LocalTime.MIN).toInstant()); 
+1

Использование Java 8 замечательно. Два предложения: (1) Дать явный часовой пояс. (2) Используйте 'LocalDate.now (ZoneId.of (« Азия/Карачи »)) atStartOfDay (ZoneId.of (« Азия/Карачи »)), чтобы принять во внимание случай, когда день не начинается с 00 : 00 (обычно при переходе на летнее время (DST)). В качестве альтернативы используйте 'ZonedDateTime.truncatedTo()'. –

Смежные вопросы