2012-03-09 14 views
46

Potrzebuję utworzyć dwa obiekty z datami. Jeżeli bieżąca data i czas jest 09 marca 2012 11:30 następniePobierz dzisiejszą datę w Javie o północy

  • data obiektu d1 powinno być 09 marca 2012 00:00
  • data obiekt d2 powinna zawierać aktualną datę samego

Data nie zostanie wprowadzona, jest to data systemowa.

Aktualizacja:

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

daje bieżącą datę i czas

+6

Co zostało próbował? Zadziałało? Jeśli nie, dlaczego nie? –

+0

@ pst dodana sekcja to d2, której chcę. Teraz potrzebuję obiektu d1, który jest czasem północy. –

Odpowiedz

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. 

powinny być Pią 09 marca 00:00:00 IST 2012

+9

Nie powinieneś także ustawić milisekund na zero? –

+0

Ustaw również strefę czasową - TimeZone tz = TimeZone.getTimeZone ("UTC"); cal.setTimeZone (tz); –

4

Jeśli jesteś w stanie dodać bibliotekami zewnętrzne do projektu. Polecam wypróbowanie Joda-time. Ma bardzo sprytny sposób pracy z datami.

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

+0

+1 za sugestię Jody. jego klasa DateMidnight powinna zrobić to za Ciebie. –

+3

@AshwiniRaman Nie, nie "DateMidnight" dłużej. Wszystkie klasy i metody "północy" w Joda-Time zostały przestarzałe. Oparte były na błędnych pomysłach. Zamiast tego użyj metody ['withTimeAtStartOfDay'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay--) w dniu' 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

Dobra robota @ChandraSekhar: D – gumuruh

+0

To nie jest o północy, kiedy pyta. – 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

zmodyfikuj swój kod jako 'System.out.println (sdf.format (data)); wtedy jest lepiej .. – Raki

+0

dziękuję za udostępnienie –

+5

To nie jest o północy, kiedy pyta. – Hugo

4

Dla Aktualna data i czas:

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

To będzie pokazany jako:

05 lutego 2013 12:40:24

+0

To nie jest o północy, jak pytanie pytanie. – 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

To nie jest o północy, kiedy pytanie zadaje pytanie. – Hugo

1

Korzystanie org.apache.commons.lang3.time.DateUtils

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

Oto Java 8 oparte rozwiązanie, przy użyciu nowego java.time package (Tutorial).

Jeśli można użyć Java 8 obiektów w kodzie, użyj LocalDateTime:

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


Jeśli potrzebujesz termin Legacy, to znaczyjava.util.Date:

Konwersja utworzonego powyżej LocalDateTime do Date pomocą tych konwersji:

LocalDateTime ->ZonedDateTime ->Instant ->Date

  1. połączenia atZone(zone) o określonej godzinie -zone (lub ZoneId.systemDefault() dla domyślnej strefy czasowej systemu) aby utworzyć obiekt ZonedDateTime, dostosowany do DST w razie potrzeby.

    ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal")); 
    
  2. połączeń toInstant() do konwersji ZonedDateTime do Instant:

    Instant i = zdt.toInstant() 
    
  3. Wreszcie, zadzwoń Date.from(instant) do konwersji Instant Do Date:

    Date d1 = Date.from(i) 
    


Podsumowując będzie wyglądać podobnie jak to dla ciebie:

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


Zobacz także sekcja Legacy Date-Time Code (The Java™ Tutorials) interoperacyjności nowego java.time funkcjonalności z istniejącymi java.util klas.

0

Definiowanie "Północ"

Słowo "północ" jest trudne do zdefiniowania.

Niektórzy myślą o nim jako o przed rozpoczyna się nowy dzień. Próba przedstawienia tego w oprogramowaniu tak trudnym jak ostatnia chwila dnia zawsze może zostać podzielona na mniejsze części sekundy.

Proponuję lepszy sposób myślenia o tym, aby uzyskać "pierwszą chwilę dnia".

To obsługuje powszechnie stosowane podejście polegające na definiowaniu przedziału czasu jako "Półotwartego", gdzie początek obejmuje włącznie, a zakończenie jest wyłączne. Więc cały dzień zaczyna się od pierwszej chwili dnia i biegnie do, ale nie włączając, pierwszego dnia po dniu. Chciałby to cały dzień (zwróć uwagę na datę od 3 do 4):

2016-02-03T00: 00: 00.0-08: 00 [Ameryka/Los_Angeles]/2016-02-04T00: 00: 00.0-08: 00 [Ameryka/Los_Angeles]

Joda-Time

przypadku korzystania z biblioteki Joda-Time, zadzwoń withTimeAtStartOfDay.

Zobacz, jak określamy strefę czasową. Jeśli zostanie pominięty, domyślna domyślna strefa czasowa maszyny JVM zostanie domyślnie zastosowana. Lepiej być wyraźnym.

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

W przypadku korzystania z języka Java 8 lub nowszego lepiej użyć pakietu java.time wbudowanego w Javę. Zobacz sibling Answer autorstwa Jensa Hoffmana.

2

roztworu w Java 8:

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

Korzystanie z Java 8 jest świetne. Dwie sugestie: (1) Podaj wyraźną strefę czasową. (2) Użyj 'LocalDate.now (ZoneId.of (" Asia/Karachi ")) atStartOfDay (ZoneId.of (" Asia/Karachi "))' aby wziąć pod uwagę przypadek, gdzie dzień zaczyna się od 00 : 00 (zwykle przy przejściu na czas letni (DST)). Alternatywnie użyj 'ZonedDateTime.truncatedTo()'. –

Powiązane problemy