Bagaimana cara mengubah 'timeStamp' menjadi date
setelah saya menghitung di java?
Kode saya saat ini adalah sebagai berikut:
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;
}
}
Ini database saya:
Di sini keluaran yang saya dapatkan adalah 2012-08-07 0, tetapi kueri yang setara mengembalikan 3. Mengapa saya mendapatkan 0?
PreparedStatement
tidak tepat dengan sintaks yang salah. Anda tidak dapat menyematkan variabel Java dalam teks string SQL Anda. Sebagai gantinya, sematkan?
dalam string SQL, lalu panggilset
metode untuk meneruskan nilai ke PreparedStatement. Lihat Jawaban yang benar oleh Sujay dan Jawaban oleh tenorsax .Jawaban:
Buat saja
Date
objek baru dengan nilai capgetTime()
sebagai parameter.Berikut adalah contohnya (Saya menggunakan contoh timestamp dari waktu saat ini):
sumber
sumber
Hanya:
sumber
Saya sudah mencari ini sejak lama, ternyata konverter Eposh melakukannya dengan mudah:
Atau sebaliknya:
sumber
tl; dr
…
…
…
java.time
Anda menggunakan kelas tanggal-waktu lama yang merepotkan yang sekarang sudah lama, digantikan oleh kelas java.time modern .
Rupanya Anda menyimpan momen di database Anda dalam kolom jenis integer. Itu sangat disayangkan. Sebagai gantinya, Anda harus menggunakan kolom dengan tipe seperti standar SQL
TIMESTAMP WITH TIME ZONE
. Tetapi, untuk Jawaban ini, kami akan bekerja dengan apa yang kami miliki.Jika catatan Anda mewakili momen dengan resolusi milidetik, dan Anda menginginkan semua catatan untuk satu hari penuh, maka kami memerlukan rentang waktu. Kita harus memiliki momen awal dan momen berhenti. Kueri Anda hanya memiliki satu kriteria tanggal-waktu yang seharusnya memiliki pasangan.
The
LocalDate
kelas mewakili nilai tanggal-hanya tanpa waktu-of-hari dan tanpa zona waktu.Zona waktu sangat penting dalam menentukan tanggal. Untuk saat tertentu, tanggal bervariasi di seluruh dunia menurut zona. Misalnya, beberapa menit setelah tengah malam di Paris Prancis adalah hari baru sementara masih "kemarin" di Montréal Québec .
Jika tidak ada zona waktu yang ditentukan, JVM secara implisit menerapkan zona waktu default saat ini. Default itu dapat berubah setiap saat, jadi hasil Anda mungkin berbeda. Lebih baik menentukan zona waktu yang Anda inginkan / diharapkan secara eksplisit sebagai argumen.
Tentukan nama zona waktu yang tepat dalam format
continent/region
, sepertiAmerica/Montreal
,Africa/Casablanca
, atauPacific/Auckland
. Jangan pernah menggunakan singkatan 3-4 huruf sepertiEST
atauIST
karena itu bukan zona waktu yang sebenarnya, tidak standar, dan bahkan tidak unik (!).Jika Anda ingin menggunakan zona waktu default JVM saat ini, tanyakan dan berikan sebagai argumen. Jika dihilangkan, default JVM saat ini diterapkan secara implisit. Lebih baik eksplisit, karena default dapat diubah kapan saja selama runtime oleh kode apa pun di thread mana pun dari aplikasi apa pun dalam JVM.
Atau tentukan tanggal. Anda dapat mengatur bulan dengan angka, dengan penomoran 1-12 untuk Januari-Desember.
Atau, lebih baik, gunakan
Month
objek enum yang telah ditentukan sebelumnya, satu untuk setiap bulan dalam setahun. Tip: GunakanMonth
objek ini di seluruh basis kode Anda, bukan hanya bilangan bulat untuk membuat kode Anda lebih terdokumentasi sendiri, memastikan nilai yang valid, dan memberikan keamanan jenis .Dengan
LocalDate
tangan, selanjutnya kita perlu mengubahnya menjadi momen, awal dan akhir hari. Jangan berasumsi bahwa hari dimulai pada pukul 00:00:00 waktu hari. Karena anomali seperti Daylight Saving Time (DST), hari tersebut dapat dimulai pada waktu lain seperti 01:00:00. Jadi biarkan java.time menentukan momen pertama hari itu. Kami memberikanZoneId
argumenLocalDate::atStartOfDay
untuk mencari anomali semacam itu. Hasilnya adalah aZonedDateTime
.Umumnya pendekatan terbaik untuk menentukan rentang waktu adalah pendekatan Setengah-Terbuka di mana permulaannya inklusif sedangkan akhir bersifat eksklusif . Jadi suatu hari dimulai dengan momen pertamanya dan berjalan hingga, tetapi tidak termasuk, momen pertama di hari berikutnya.
Kueri kami sepanjang hari tidak dapat menggunakan perintah SQL
BETWEEN
. Perintah itu Sepenuhnya-Tertutup ([]
) (baik awal dan akhir inklusif) di mana seperti yang kita inginkan Setengah-Terbuka ([)
). Kami menggunakan sepasang kriteria>=
dan<
.Kolom Anda dinamai dengan buruk. Hindari salah satu dari seribu kata yang dicadangkan oleh berbagai database. Mari kita gunakan
placed
dalam contoh ini.Kode Anda harus menggunakan
?
placeholder untuk menentukan momen kita.Tapi kami memiliki
ZonedDateTime
objek di tangan, sementara database Anda tampaknya menyimpan bilangan bulat seperti yang dibahas di atas. Jika Anda telah mendefinisikan kolom Anda dengan benar, kami dapat meneruskanZonedDateTime
objek dengan driver JDBC yang mendukung JDBC 4.2 atau yang lebih baru.Tapi sebaliknya kita perlu menghitung waktu dari waktu ke waktu dalam hitungan detik. Saya akan menganggap tanggal referensi zaman Anda adalah saat pertama tahun 1970 di UTC. Waspadai kemungkinan kehilangan data, karena
ZonedDateTime
kelas tersebut mampu menghasilkan resolusi nanodetik. Detik pecahan apa pun akan dipotong di baris berikut.Sekarang kami siap untuk meneruskan bilangan bulat tersebut ke kode SQL kami yang ditentukan di atas.
Saat Anda mengambil nilai integer Anda dari
ResultSet
, Anda dapat mengubahnya menjadiInstant
objek (selalu dalam UTC), atau menjadiZonedDateTime
objek (dengan zona waktu yang ditetapkan).Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Dimana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti
Interval
,YearWeek
,YearQuarter
, dan lebih .sumber
Pertama-tama, Anda tidak memanfaatkan keuntungan menggunakan file
PreparedStatement
. Saya pertama kali menyarankan agar Anda memodifikasiPreparedStatement
sebagai berikut:Anda kemudian dapat menggunakan
statement.setXX(param_index, param_value)
untuk mengatur nilai masing-masing. Untuk konversi ketimestamp
, lihat javadocs berikut ini:PreparedStatement.setTimeStamp ()
Timestamp
Semoga ini membantu!
sumber
Di Android ini sangat Sederhana. Cukup gunakan kelas Calender untuk mendapatkan currentTimeMillis.
Di Java, cukup Gunakan System.currentTimeMillis () untuk mendapatkan stempel waktu saat ini
sumber
Tidak yakin apa yang Anda coba pilih dalam kueri, tetapi perlu diingat bahwa
UNIX_TIMESTAMP()
tanpa argumen mengembalikan waktu sekarang. Anda mungkin harus memberikan waktu yang valid sebagai argumen, atau mengubah kondisi.EDIT:
Berikut adalah contoh kueri terikat waktu berdasarkan pertanyaan:
EDIT: kolom cap waktu
Dalam kasus penggunaan stempel waktu
java.sql.Timestamp
dan PreparedStatement.setTimestamp () , yaitu:sumber
new Date(timestamp.getTime())
seharusnya berfungsi, tetapi cara baru Java 8 yang mewah (yang mungkin lebih elegan dan tipe lebih aman, serta membantu mengarahkan Anda untuk menggunakan kelas waktu baru) adalah dengan memanggilDate.from(timestamp.toInstant())
.(Jangan mengandalkan fakta bahwa
Timestamp
itu sendiri adalah contoh dariDate
; lihat penjelasan di komentar jawaban lain .)sumber
sumber
Saya merasa berkewajiban untuk menanggapi karena jawaban lain tampaknya agnostik zona waktu yang tidak dapat dilakukan oleh aplikasi dunia nyata. Untuk membuat konversi timestamp-to-date benar ketika timestamp dan JVM menggunakan zona waktu yang berbeda, Anda dapat menggunakan LocalDateTime Joda Time (atau LocalDateTime di Java8) seperti ini:
Contoh di bawah mengasumsikan bahwa stempel waktunya adalah UTC (seperti yang biasanya terjadi pada database). Jika stempel waktu Anda berada di zona waktu yang berbeda, ubah parameter zona waktu
toDate
pernyataan tersebut.sumber
coba gunakan kode java ini:
sumber
Dengan asumsi Anda memiliki yang sudah ada sebelumnya
java.util.Date date
:sumber
Anda dapat menggunakan metode ini untuk mendapatkan Tanggal dari Stempel Waktu dan Zona waktu area tertentu.
sumber
sumber
sumber