Jak mogę utworzyć znacznik czasu z datą 23/09/2007?
100
Przez Timestamp
, jak sądzę masz na myśli java.sql.Timestamp
. Zauważysz, że ta klasa ma konstruktor akceptujący long
argument. Możesz przeanalizować to za pomocą DateFormat
klasy:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .A co z tym?
źródło
Co masz na myśli znacznik czasu? Jeśli masz na myśli milisekundy od epoki Uniksa:
Jeśli chcesz mieć rzeczywisty obiekt java.sql.Timestamp:
źródło
Calendar.SEPTEMBER
tl; dr
java.time
Zaktualizujmy tę stronę, wyświetlając kod przy użyciu java.time wbudowanej w Javę 8 i nowszą.
Te nowe klasy są inspirowane przez Joda-Time , zdefiniowane przez JSR 310 i rozszerzone przez ThreeTen-Extra . Wypierają one notorycznie kłopotliwe stare klasy daty i godziny, dołączane do wczesnych wersji Javy.
W java.time
Instant
jest moment na osi czasu w UTC. AZonedDateTime
to natychmiastowa zmiana na strefę czasową (ZoneId
).Strefa czasowa jest tutaj kluczowa. Daty
September 23, 2007
nie można przetłumaczyć na moment na osi czasu bez zastosowania strefy czasowej. Weź pod uwagę, że nowy dzień w Paryżu wstaje wcześniej niż w Montrealu, gdzie wciąż jest „wczoraj”.Ponadto java.sql.Timestamp reprezentuje zarówno datę, jak i godzinę. Musimy więc podać godzinę, która pasuje do daty. Zakładamy, że chcesz, aby pierwsza chwila dnia była porą dnia. Zwróć uwagę, że nie zawsze jest to odpowiednia pora
00:00:00.0
powodu czasu letniego i prawdopodobnie innych anomalii.Zauważ, że w przeciwieństwie do starej klasy java.util.Date iw przeciwieństwie do Joda-Time, typy java.time mają rozdzielczość nanosekund, a nie milisekund. Jest to zgodne z rozdzielczością java.sql.Timestamp.
Zwróć uwagę, że java.sql.Timestamp ma nieprzyjemny zwyczaj niejawnego stosowania bieżącej domyślnej strefy czasowej maszyny JVM do wartości daty i godziny podczas generowania reprezentacji w postaci ciągu za pomocą tej
toString
metody. Tutaj widzisz zastosowaną mojąAmerica/Los_Angeles
strefę czasową. Natomiast klasy java.time są bardziej rozsądne i korzystają ze standardowych formatów ISO 8601 .Zrzuć na konsolę.
Po uruchomieniu.
Nawiasem mówiąc, od wersji JDBC 4.2 można bezpośrednio używać typów java.time. Nie ma potrzeby
java.sql.Timestamp
.PreparedStatement.setObject
ResultSet.getObject
Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani
java.sql.*
klas.Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Możesz też wykonać następujące czynności:
źródło
Zgodnie z API konstruktor, który zaakceptowałby rok, miesiąc itd., Jest przestarzały. Zamiast tego powinieneś użyć Konstruktora, który akceptuje długie. Możesz użyć implementacji Calendar, aby utworzyć żądaną datę i uzyskać dostęp do reprezentacji czasu jako długości, na przykład za pomocą metody getTimeInMillis .
źródło
Dla kompletności również rozwiązanie z Joda-Time w wersji 2.5 i jego
DateTime
klasie:źródło
DateTime
obiektu zostanie zastosowana bieżąca domyślna strefa czasowa maszyny JVM . Oznacza to, że wyniki będą się różnić w zależności od różnych komputerów lub konfiguracji systemu operacyjnego hosta lub ustawień maszyny wirtualnej. Aby uzyskać przewidywalne wyniki, przekaż strefę czasową do tegoDateTime
konstruktora. Wybierz odpowiednią nazwę strefy czasowej dla swojego zamiaru. Na przykładDateTimeZone.forID( "America/Montreal" )
lubDateTimeZone.UTC
.DateTime
obiekt o milisekundy-od-epoki. Wymień.toDate().getTime()
się.getMillis()
.DateTimeZone.getDefault()
i przekazując wynik jako opcjonalny argument. (Nawiasem mówiąc, toLocale.getDefault()
samo dotyczy dwuznaczności opcjonalnych argumentów.)Bardziej ogólną odpowiedzią byłoby importowanie
java.util.Date
, a gdy chcesz ustawićtimestamp
datę równą bieżącej, po prostu ustaw ją na równąnew Date()
.źródło