2010-05-10 11 views
13

muszę program Java, aby uzyskać bieżącą datę bez datownika:program Java, aby otrzymać aktualną datę bez datownika

Date d = new Date(); 

daje mi datą i godziną.

Ale potrzebuję tylko daty, bez znacznika czasu. Używam tej daty do porównania z innym obiektem daty, który nie ma znacznika czasu.

Na drukowania

System.out.println("Current Date : " + d) 

z d powinien wydrukować May 11 2010 - 00:00:00.

+1

Czy chcesz porównać dwie daty, aby sprawdzić, czy są tego samego dnia (ignorując czas), czy chcesz wydrukować datę bez porcji? Mam wrażenie, że chciałeś pierwszy, ale odpowiedzi wydają się myśleć, że chcesz drugi –

+0

Po pierwsze, mówi o porównywaniu, a następnie daje drukowanie go jako przykład, aby wskazać, co oznacza przez brak sygnatury czasowej, więc zgaduję że naprawdę chce porównać czas, zamiast go wydrukować, ale jeśli tego właśnie chce, prawdopodobnie nie powinien wspominać o drukowaniu, ponieważ to dezorientuje. –

Odpowiedz

36

java.util.Date obiekt jest rodzajem datownik - zawiera liczbę milisekund od 1 stycznia 1970, 00:00:00 UTC. Zatem nie można użyć standardowego obiektu Date, aby zawierał tylko dzień/miesiąc/rok, bez czasu.

O ile mi wiadomo, nie ma łatwego sposobu porównywania dat, biorąc pod uwagę datę (i nie czas) w standardowym interfejsie API języka Java. Można użyć klasy Calendar i wyczyścić godziny, minuty, sekundy i milisekundy:

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

Zrób to samo z innym Calendar obiektu, który zawiera datę, które chcesz porównać go, a następnie użyj after() lub before() metody do zrób porównanie.

Jak wyjaśniono w Javadoc z java.util.Calendar.clear (Int pole):

HOUR_OF_DAY, GODZ i AM_PM pola są obsługiwane niezależnie a rozdzielczość obowiązuje zasada dotycząca pory dnia. Wyczyszczenie jednego z pól nie powoduje zresetowania wartości godziny tego kalendarza. Użyj zestawu (Calendar.HOUR_OF_DAY, 0), aby zresetować wartość godziny.

edycja - Powyższa odpowiedź pochodzi z 2010 roku; w języku Java 8 jest nowy interfejs API daty i czasu w pakiecie java.time, który jest znacznie bardziej wydajny i użyteczny niż stare klasy java.util.Date i java.util.Calendar. Użyj nowych klas daty i godziny zamiast starych.

+1

Nie wiedziałem o cal.clear(), zamierzam go ukraść i zaktualizować odpowiedź. – staticman

+0

Możesz, jeśli dasz mi +1 ;-) – Jesper

+0

Nie ma problemu, już zrobione. – staticman

4

Można użyć

// 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" 

Wystarczy popatrzeć na Formatter API documentation.

+0

Nie przekażę żadnej daty, o której wspomniałeś. – minil

+0

Zaktualizował kod, aby przejść przez GregorianCalendar.getInstance(), który zwraca bieżącą datę. – aioobe

+1

Dlaczego warto używać 'GregorianCalendar' jawnie - dlaczego nie użyć po prostu' Calendar.getInstance() '? – Jesper

3
DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy"); 
    java.util.Date date = new java.util.Date(); 
    System.out.println("Current Date : " + dateFormat.format(date)); 
11

Zawsze można użyć klasy apache commons 'DateUtils. Ma statyczną metodę isSameDay(), która "Sprawdza, czy dwa obiekty z datami są tego samego dnia, ignorując czas."

static boolean isSameDay(Date date1, Date date2) 
+0

Przeczytałem dokumentację isSameDay i nie rozumiem, jak to działa. Jak ustalić dzień bez korzystania ze strefy czasowej? czasami dwie instancje Data może być w tym samym dniu lub w różnych dniach (przed i po północy) w zależności od przyjętej strefy czasowej. Czy przyjmuje domyślną strefę czasową systemu? –

+1

Nie wiem dokładnie, co robi. Musiałbyś sprawdzić źródło. Jeśli jednak spojrzysz na interfejs API daty, wygląda na to, że robi wszystko w oparciu o lokalną strefę czasową. W rzeczywistości wszystkie jego metody konwersji do innych stref czasowych są przestarzałe. Tak naprawdę, wygląda na to, że Date nie radzi sobie z strefami czasowymi. Jeśli chcesz zrobić cokolwiek ze strefami czasowymi, spójrz na Kalendarz. –

+0

Data wewnętrznie wynosi milisekundy od "1 stycznia 1970, 00:00:00 GMT". Spodziewam się, że obliczenia dzienne również będą w GMT. – ToolmakerSteve

0

Myślę, że to zadziała. Użyj Kalendarza, aby manipulować polami czasu (zresetuj je do zera), a następnie pobierz Data z kalendarza.

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

Albo zrobić odwrotnie. Umieścić datę chcesz porównać w kalendarzu i porównać kalendarz Terminy

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! 
} 
0

Oto nieeleganckie sposób to zrobić szybko, bez dodatkowych zależności.
Można po prostu użyć java.sql.Date, która rozszerza java.util.Date, chociaż dla porównań trzeba będzie porównać ciągi.

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

wyjściowa:

Aktualny Data wprowadzenia1: 2010-05-10
Aktualny date2: 2010-05-10
porównanie Data jest fałszywy
porównanie String jest prawdą

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

Zrobiłem to i zadziałało:

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 

Wykonaj tę czynność dla innych instancji, które chcesz porównać. Ta logika działała dla mnie; Musiałem porównać daty, czy są one równe lub nie, ale można robić różne porównań (przed, po, równa, etc.)

7

zrobiłem w następujący sposób i to działało: (Aktualna data bez datownika)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
Date today = dateFormat.parse(dateFormat.format(new Date())); 
4

można dostać w tym terminie:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
print(dateFormat.format(new Date()); 
0

Jeśli naprawdę chcesz używać Data zamiast do kalendarza dla porównania, jest to najkrótszy kawałek kodu można użyć:

Calendar c = Calendar.getInstance(); 
Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
           c.get(Calendar.MONTH), 
           c.get(Calendar.DAY_OF_MONTH)).getTime(); 

W ten sposób upewnisz się, że wartości godziny/minuty/sekundy/milisekund są puste.

0

Szukałem tego samego rozwiązania i dla mnie działały poniższe.

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

Należy pamiętać, że używam calendar.set (Calendar.HOUR_OF_DAY, 0) dla HOUR_OF_DAY zamiast korzystać z jasną metodę, ponieważ jest sugerowane w Javadocs metoda Calendar.clear jako poniższym

Pola HOUR_OF_DAY, HOUR i AM_PM są obsługiwane niezależnie, a stosowana jest reguła rozdzielczości dla pory dnia. Usunięcie jednego z pól nie resetuje wartości godziny tego kalendarza. Użyj zestawu (Calendar.HOUR_OF_DAY, 0), aby zresetować wartość godziny.

Z powyższej oddelegowanego rozwiązanie mam wyjścia jak

Wed Sep 11 00:00:00 EDT 2013 

Korzystanie wyraźny sposób HOUR_OF_DAY resetuje godzinę w temperaturze 12 podczas wykonywania po 12PM lub 00 podczas wykonywania przed 12pm.

8

Zastosowanie DateFormat, aby rozwiązać ten problem:

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 
+0

To jest prosty sposób na uzyskanie daty w wybranym formacie. – Janpan

1

accepted answer by Jesper jest poprawna, ale teraz przestarzałe. Klasy java.util.Date i .Calendar są notorycznie kłopotliwe. Unikaj ich.

java.time

Zamiast używać java.time ramy, zbudowany w Javie 8 i nowszych back-ported to Java 6 & 7 i further adapted to Android.

Jeśli naprawdę nie zależy Ci na porach dnia i strefach czasowych, użyj funkcji LocalDate w ramach java.time().

LocalDate localDate = LocalDate.of(2014 , 5 , 6); 

Należy pamiętać, że jeśli masz żadnego szansę konieczności radzenia sobie z innych stref czasowych lub UTC, to w niewłaściwy sposób, aby przejść. Naiwni programiści mają tendencję do myślenia, że ​​nie potrzebują stref czasowych, podczas gdy w rzeczywistości to robią.

Zadzwoń pod numer toString, aby wygenerować ciąg znaków w standardowym formacie ISO 8601.

String output = localDate.toString(); 

2014-05-06

przypadku innych formatów, wyszukiwania przepełnienie stosu dla DateTimeFormatter klasie.

Joda-Time

Choć obecnie wypierany przez java.time, można użyć podobnego LocalDate klasę w Joda-Time biblioteki (inspiracją dla java.time).

LocalDate localDate = new LocalDate(2014, 5, 6); 
2

Również można użyć Apache Commons lib DateUtils.truncate():

Date now = new Date(); 
Date truncated = DateUtils.truncate(now, Calendar.DAY_OF_MONTH); 

Czas zostanie ustawiony na 00:00:00 więc można pracować z tym terminie lub wydrukować sformatowane:

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 
0

Oto mój kod do pobrania:

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)); 
Powiązane problemy