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?
Odpowiedz
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();
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
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. –
Dobrze, lepiej wyczyść wszystkie domyślne wartości – Reimeus
Jak
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM");
Date utilDate = formatter.parse(year + "/" + month);
Skopiowane z Create a java.util.Date Object from a Year, Month, Day Forma czy może jak
DateTime aDate = new DateTime(year, month, 1, 0, 0, 0);
skopiowane z What's the Right Way to Create a Date in Java?
'DateTime' pochodzi z biblioteki Joda. –
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ć.
Cóż, zasób przekazuję to, aby wziąć datę, więc muszę to zapewnić. – antonpug
Tak, przepraszam, poszerzyłem odpowiedź ... –
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") !!!
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. –
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
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());
- 1. Obiekt Data tylko z roku i miesiąca
- 2. wybierz liczbę całkowitą() według roku i miesiąca?
- 3. Jak zamienić osobne kolumny roku, miesiąca i dnia w jedną datę?
- 4. Dzień juliański roku w Javie
- 5. Format daty tylko do miesiąca i roku - "MMM-rrrr"
- 6. Porównaj bieżącą datę z przechowywaną datetime używając tylko miesiąca w roku
- 7. mysql datatype do przechowywania miesiąca i roku tylko
- 8. LINQ: Grupa według miesiąca i roku w polu datetime
- 9. Jak wyświetlić wybór miesiąca i roku dla karty kredytowej
- 10. Linq: grupa według roku i miesiąca i zarządzaj pustymi miesiącami
- 11. Otrzymasz pierwszą datę, ostatnią datę miesiąca?
- 12. Tworzenie datetime w Railsach za pomocą miesiąca, dnia i roku
- 13. Bezpieczny sposób na uzyskanie bieżącego miesiąca i roku w serii
- 14. MomentJS zwraca niewidoczną datę 1 dnia miesiąca
- 15. Znacznik czasu Pythona od dnia, miesiąca, roku
- 16. Grupa zapytań MySQL Wg dnia/miesiąca/roku
- 17. Zmień datę zmiennej ciągłej miesiąca
- 18. Jak piętro datę na pierwszą datę tego miesiąca?
- 19. Porównanie danych SQL Server na podstawie tylko miesiąca i roku.
- 20. Python wybierz losową datę w bieżącym roku
- 21. regex datę jak nazwa miesiąca dzień przecinkiem i rok
- 22. Jak grupować według miesiąca i roku, gdy ma tylko pole datetime?
- 23. Jak mogę uzyskać datę pierwszej sekundy roku z SQL?
- 24. Jak uzyskać liczbę dni w miesiącu z danego miesiąca i roku?
- 25. Jak uzyskać numer miesiąca z numeru roku i tygodnia w języku C#?
- 26. java otrzymam pierwszą datę i ostatnią datę danego miesiąca oraz dany rok
- 27. Jak wygenerować wartość SALT w Javie?
- 28. Jak wygenerować TimeUUID w Javie/Scala
- 29. Jak uzyskać pierwszą datę bieżącego miesiąca w Node.js?
- 30. Jak przekonwertować datę POSIX na dzień roku w R?
Dlaczego nie używasz żadnej cyfry od 1 do 31 na dzień, na przykład 1? – krackmoe
Po prostu nowa data ("2013-04-01")? – antonpug
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