2012-09-19 14 views
13

Potrzebuję wygenerować nowy obiekt Data dla daty wygaśnięcia karty kredytowej, mam tylko miesiąc i rok, w jaki sposób mogę wygenerować datę na podstawie tych dwóch? Potrzebuję najprostszy możliwy sposób. Czytałem tutaj inne odpowiedzi, ale wszystkie wydają się zbyt wyrafinowane.Jak wygenerować datę z zaledwie miesiąca i roku w Javie?

+0

Dlaczego nie używasz żadnej cyfry od 1 do 31 na dzień, na przykład 1? – krackmoe

+1

Po prostu nowa data ("2013-04-01")? – antonpug

+0

Nie musisz używać Kalendarza lub Kalendarza Gregoriańskiego. Ale można ustawić dzień, miesiąc, rok z: zestaw (int rok, int miesiąc, data int) i getTime() otrzymujesz obiekt Date zwrócony – krackmoe

Odpowiedz

37

Można użyć java.util.Calendar:

Calendar calendar = Calendar.getInstance(); 
calendar.clear(); 
calendar.set(Calendar.MONTH, month); 
calendar.set(Calendar.YEAR, year); 
Date date = calendar.getTime(); 
+2

Nie mogę użyć nowej daty ("2013-05-01")? Od jakiegoś czasu nie programowałem w Javie, ale z większości języków wydaje się to rozsądnym sposobem na zrobienie tego? – antonpug

+4

Jako ostrzeżenie, pole dnia zostanie ustawione na dzisiejszą datę. Sprawdź zamierzone zachowanie, jeśli bieżący dzień jest poza zakresem dla miesiąca docelowego. Na przykład, ustawiając miesiąc na luty, gdy "kalendarz" ma pole dnia wynoszące 30. Można rozsądnie ustawić dzień na znaną, prawidłową wartość dla każdego miesiąca (np .: 1) przed ustawieniem miesiąca i roku. –

+0

Dobrze, lepiej wyczyść wszystkie domyślne wartości – Reimeus

5

Prawdopodobnie brak odpowiedzi, ponieważ poprosiłeś o numer java.util.Date, ale wydaje się dobrą okazją, aby wskazać, że większość prac z datami, godzinami i kalendarzami w Javie powinna prawdopodobnie być wykonana z biblioteką Joda-Time, w takim przypadku

new LocalDate(year, month, 1) 

przychodzi na myśl.

Joda-Time ma wiele innych fajnych rzeczy dotyczących dni w miesiącu. Na przykład, jeśli chcesz wiedzieć pierwszy dzień bieżącego miesiąca, można napisać

LocalDate firstOfThisMonth = new LocalDate().withDayOfMonth(1); 

w komentarzu poprosić o przechodzącej ciąg do konstruktora java.util.Date, na przykład:

new Date("2012-09-19") 

ten wersja konstruktora jest przestarzała, więc nie używaj go. Powinieneś utworzyć narzędzie do formatowania daty i zadzwonić pod numer parse. To dobra rada, ponieważ prawdopodobnie będziesz miał year i month jako wartości całkowite, i będziesz musiał stworzyć dobry ciąg, odpowiednio wyściełany i rozdzielony i wszystko to, co jest niezwykle trudne we wszystkich przypadkach. Z tego powodu użyj formatera daty, który doskonale wie, jak dbać o wszystkie te rzeczy.

Inne wcześniejsze odpowiedzi pokazały, jak to zrobić.

+0

Cóż, zasób przekazuję to, aby wziąć datę, więc muszę to zapewnić. – antonpug

+0

Tak, przepraszam, poszerzyłem odpowiedź ... –

0

Najbardziej rozsądnym podejściem byłoby użycie konstruktora Date ("RRRR-MM-DD"), mimo że jest przestarzałe. Jest to najprostszy sposób na stworzenie daty w locie. Wkręć tego, kto zdecyduje się go wycofać. Długo termin na żywo ("RRRR-MM-DD") !!!

+0

Konstruktor ten działa niewiarygodnie w różnych strefach czasowych. Krótko mówiąc, nie jest dobrze określone, co można z niego wyciągnąć. Otrzymasz tę datę o północy w pewnej strefie czasowej, która pozostawia miejsce na 26 lub 27 godzin zmian. Konstruktor został wycofany z konkretnego powodu. –

17

java.Czas

Korzystanie java.time ramy wbudowany w Java 8

import java.time.YearMonth; 

int year = 2015; 
int month = 12; 
YearMonth.of(year,month); // 2015-12 

od String

YearMonth.parse("2015-12"); // 2015-12 

ze zwyczajem DateTimeFormatter

import java.time.format.DateTimeFormatter; 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM yyyy"); 
YearMonth.parse("12 2015", formatter); // 2015-12 

Konwersje Aby przekonwertować YearMonth na bardziej standardową reprezentację daty, która jest LocalDate.

LocalDate startMonth = date.atDay(1); //2015-12-01 
LocalDate endMonth = date.atEndOfMonth(); //2015-12-31 
0

Nie używaj tej odpowiedzi. Użyj odpowiedzi: Przemek i Ray Toel. Jak mówi Przemek, wolą używać YearMonth do reprezentowania roku i miesiąca. Jak obie mówią, jeśli musisz użyć daty, użyj LocalDate, to data bez pora dnia.

Jeśli koniecznie potrzebujesz staromodnego obiektu java.util.Date dla starszego interfejsu API, którego nie możesz zmienić, oto jeden prosty sposób na jego uzyskanie. Może nie działać zgodnie z oczekiwaniami, może nie dostarczyć dokładnie takiej daty, jakiej potrzebujesz, zależy to od Twoich konkretnych wymagań.

YearMonth expiration = YearMonth.of(2021, 8); // or .of(2021, Month.AUGUST); 
    Date oldFashionedDateObject = Date.from(expiration 
      .atDay(1) 
      .atStartOfDay(ZoneId.systemDefault()) 
      .toInstant()); 
    System.out.println(oldFashionedDateObject); 

Na moim komputerze to drukuje

Sun Aug 01 00:00:00 CEST 2021 

Co mamy jest pierwszego dnia miesiąca o północy w mojej lokalnej strefy czasowej - a dokładniej, ustawienie strefy czasowej za mojego JVM. Jest to jedna dobra domena, której oczekuje API ze starszej wersji, ale jest także niebezpieczna. Ustawienie strefy czasowej JVM może zostać zmienione pod naszymi stopami przez inne części programu lub przez inne programy działające w tej samej maszynie JVM. Innymi słowy, nie możemy być naprawdę pewni, co otrzymujemy.

Problem strefy czasowej jest jeszcze gorszy, jeśli data jest przesyłana do komputera z inną strefą czasową, np. Z klienta do serwera lub odwrotnie, lub do bazy danych z własną strefą czasową. Istnieje około 50% ryzyka, że ​​Twój Date pojawi się jako czas w poprzednim miesiącu.

Jeśli znasz strefę czasową wymaganą na końcu, pomożesz określić na przykład ZoneId.of("America/New_York") zamiast domyślnego systemu w powyższym fragmencie.

Jeśli Twój interfejs API jest łagodny i potrzebuje tylko pewnego punktu w odpowiednim miesiącu, lepiej będzie, jeśli dodasz go do 2-tego miesiąca UTC lub 3-go miesiąca w Twojej własnej strefie czasowej. Oto, jak to zrobić:

Date oldFashionedDateObject = Date.from(expiration 
      .atDay(2) 
      .atStartOfDay(ZoneOffset.UTC) 
      .toInstant()); 
Powiązane problemy