Jak przekonwertować „znacznik czasu” na date
po otrzymaniu licznika w Javie?
Mój obecny kod wygląda następująco:
public class GetCurrentDateTime {
public int data() {
int count = 0;
java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
java.sql.Date date = new java.sql.Date(timeStamp.getTime());
System.out.println(date);
//count++;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");
PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
ResultSet result = statement.executeQuery();
while (result.next()) {
// Do something with the row returned.
count++; //if the first col is a count.
}
} catch (Exception exc) {
System.out.println(exc.getMessage());
}
return count;
}
}
To jest moja baza danych:
Tutaj otrzymałem wynik 2012-08-07 0, ale równoważne zapytanie zwraca 3. Dlaczego otrzymuję 0?
PreparedStatement
z nieprawidłową składnią. Nie można osadzać zmiennych Java w tekście łańcucha SQL. Zamiast tego osadzaj?
w ciągu SQL, a następnie wywołajset
metody, aby przekazać wartości do PreparedStatement. Zobacz poprawną odpowiedź Sujaya i odpowiedź przez tenorsax .Odpowiedzi:
Po prostu utwórz nowy
Date
obiekt z wartością stemplagetTime()
jako parametrem.Oto przykład (używam przykładowego znacznika czasu bieżącego czasu):
źródło
źródło
Właśnie:
źródło
Szukałem tego od dłuższego czasu, okazuje się, że konwerter Eposh robi to łatwo:
Lub odwrotnie:
źródło
tl; dr
…
…
…
java.time
Używasz kłopotliwych starych klas daty i czasu, które są teraz starsze, wyparte przez nowoczesne klasy java.time .
Najwyraźniej przechowujesz moment w swojej bazie danych w kolumnie pewnego typu całkowitego. To jest niefortunne. Zamiast tego powinieneś używać kolumny typu, takiego jak standard SQL
TIMESTAMP WITH TIME ZONE
. Ale w przypadku tej odpowiedzi będziemy pracować z tym, co mamy.Jeśli Twoje rekordy przedstawiają momenty z rozdzielczością milisekund i chcesz, aby wszystkie rekordy obejmowały cały dzień, potrzebujemy przedziału czasu. Musimy mieć moment rozpoczęcia i moment zakończenia. Twoje zapytanie ma tylko jedno kryterium daty i czasu, w którym powinno mieć parę.
LocalDate
Klasa reprezentuje wartość data-tylko bez time-of-day i bez strefy czasowej.Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W dowolnym momencie data różni się na całym świecie według strefy. Na przykład, kilka minut po północy w Paryżu Francja jest nowym dniem, podczas gdy w Montrealu Quebec wciąż trwa „wczoraj” .
Jeśli nie określono strefy czasowej, maszyna JVM niejawnie stosuje swoją bieżącą domyślną strefę czasową. To ustawienie domyślne może się zmienić w dowolnym momencie, więc wyniki mogą się różnić. Lepiej jest jawnie określić żądaną / oczekiwaną strefę czasową jako argument.
Określ prawidłową nazwę strefy czasowej w formacie
continent/region
, takie jakAmerica/Montreal
,Africa/Casablanca
lubPacific/Auckland
. Nigdy nie używaj 3-4-literowego skrótu, takiego jakEST
lub,IST
ponieważ nie są to prawdziwe strefy czasowe, nie znormalizowane, a nawet nie unikalne (!).Jeśli chcesz użyć bieżącej domyślnej strefy czasowej maszyny JVM, poproś o to i podaj jako argument. W przypadku pominięcia bieżąca wartość domyślna maszyny JVM jest stosowana niejawnie. Lepiej, aby było to jawne, ponieważ wartość domyślna może zostać zmieniona w dowolnym momencie podczas działania przez dowolny kod w dowolnym wątku dowolnej aplikacji w JVM.
Lub podaj datę. Możesz ustawić miesiąc za pomocą liczby, z rozsądną numeracją 1-12 dla stycznia-grudnia.
Lub, lepiej, użyj
Month
wstępnie zdefiniowanych obiektów wyliczeniowych, po jednym dla każdego miesiąca w roku. Porada: Użyj tychMonth
obiektów w całej bazie kodu, a nie zwykłej liczby całkowitej, aby kod był bardziej samodokumentujący, zapewniał prawidłowe wartości i zapewniał bezpieczeństwo typów .Mając
LocalDate
w ręku, musimy następnie przekształcić to w parę chwil, początek i koniec dnia. Nie zakładaj, że dzień zaczyna się o godzinie 00:00:00. Z powodu anomalii, takich jak czas letni (DST), dzień może rozpocząć się o innej godzinie, na przykład o godzinie 01:00:00. Niech java.time określi pierwszą porę dnia. PrzekazujemyZoneId
argumentLocalDate::atStartOfDay
do wyszukania takich anomalii. Wynik toZonedDateTime
.Ogólnie najlepszym podejściem do definiowania przedziału czasu jest podejście Half-Open, w którym początek jest włączający, a koniec wyłączny . Tak więc dzień zaczyna się od swojej pierwszej chwili i kończy się, ale nie wliczając, pierwszej chwili następnego dnia.
Nasze zapytanie przez cały dzień nie może korzystać z polecenia SQL
BETWEEN
. To polecenie to Fully-Closed ([]
) (zarówno początek, jak i koniec są włącznie), gdzie tak, jak chcemy, Half-Open ([)
). Używamy pary kryteriów>=
i<
.Twoja kolumna ma złą nazwę. Unikaj tysiąca słów zarezerwowanych przez różne bazy danych. Użyjmy
placed
w tym przykładzie.Twój kod powinien zawierać
?
symbole zastępcze, w których można określić nasze momenty.Ale mamy
ZonedDateTime
obiekty w ręku, podczas gdy twoja baza danych najwyraźniej przechowuje liczby całkowite, jak omówiono powyżej. Jeśli nie zdefiniowano swoją kolumnę właściwie moglibyśmy po prostu przekazaćZonedDateTime
obiektów z dowolnego sterownika JDBC nośnej JDBC 4.2 lub nowszej.Ale zamiast tego potrzebujemy odliczać od epoki w pełnych sekundach. Zakładam, że datą odniesienia dla twojej epoki jest pierwsza chwila roku 1970 UTC. Uważaj na możliwą utratę danych, ponieważ
ZonedDateTime
klasa ma rozdzielczość nanosekundową. Każda ułamkowa część sekundy zostanie obcięta w następnych wierszach.Teraz jesteśmy gotowi do przekazania tych liczb całkowitych do naszego kodu SQL zdefiniowanego powyżej.
Gdy pobierasz wartości całkowite z
ResultSet
, możesz przekształcić je wInstant
obiekty (zawsze w UTC) lub wZonedDateTime
obiekty (z przypisaną strefą czasową).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 .
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
Przede wszystkim nie wykorzystujesz zalet korzystania z domeny
PreparedStatement
. Najpierw zasugerowałbym zmodyfikowanie swojegoPreparedStatement
w następujący sposób:Następnie możesz użyć,
statement.setXX(param_index, param_value)
aby ustawić odpowiednie wartości. Aby dokonać konwersji natimestamp
, spójrz na następujące javadocs:PreparedStatement.setTimeStamp ()
Timestamp
Mam nadzieję że to pomoże!
źródło
W Androidzie jest to bardzo proste. Po prostu użyj klasy Calender, aby uzyskać currentTimeMillis.
W Javie po prostu użyj System.currentTimeMillis (), aby uzyskać aktualny znacznik czasu
źródło
Nie jestem pewien, co próbujesz wybrać w zapytaniu, ale pamiętaj, że
UNIX_TIMESTAMP()
bez argumentów zwraca teraz czas. Prawdopodobnie powinieneś podać prawidłowy czas jako argument lub zmienić warunek.EDYTOWAĆ:
Oto przykład zapytania związanego z czasem na podstawie pytania:
EDYCJA: kolumna sygnatura czasowa
W przypadku użycia timestamp
java.sql.Timestamp
i PreparedStatement.setTimestamp () , tj .:źródło
new Date(timestamp.getTime())
powinno działać, ale nowy, fantazyjny sposób w Javie 8 (który może być bardziej elegancki i bezpieczniejszy, a także pomóc w korzystaniu z nowych klas czasu) to wywołanieDate.from(timestamp.toInstant())
.(Nie polegaj na tym, że
Timestamp
sam w sobie jest przykłademDate
; zobacz wyjaśnienie w komentarzach do innej odpowiedzi ).źródło
źródło
Czuję się zobowiązany do odpowiedzi, ponieważ inne odpowiedzi wydają się być niezależne od strefy czasowej, na co aplikacja w świecie rzeczywistym nie może sobie pozwolić. Aby zapewnić poprawną konwersję datownika na datę, gdy znacznik czasu i maszyna JVM używają różnych stref czasowych, można użyć funkcji LocalDateTime firmy Joda Time (lub LocalDateTime w języku Java8) w następujący sposób:
Poniższy przykład zakłada, że znacznik czasu to UTC (jak to zwykle ma miejsce w przypadku baz danych). Jeśli twoje znaczniki czasu znajdują się w innej strefie czasowej, zmień parametr strefy czasowej w
toDate
instrukcji.źródło
spróbuj użyć tego kodu java:
źródło
Zakładając, że masz już istniejące
java.util.Date date
:źródło
Możesz użyć tej metody, aby uzyskać datę z sygnatury czasowej i strefy czasowej określonego obszaru.
źródło
źródło
źródło