Bagaimana cara mengubah TimeStamp menjadi Date di Java?

105

Bagaimana cara mengubah 'timeStamp' menjadi datesetelah 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: masukkan deskripsi gambar di sini

Di sini keluaran yang saya dapatkan adalah 2012-08-07 0, tetapi kueri yang setara mengembalikan 3. Mengapa saya mendapatkan 0?

Krishna Veni
sumber
Dapatkah Anda menunjukkan kepada kami contoh seperti apa data tabel itu?
oldrinb
tanggal (1344255451,1344255537,1344312502) dan status memiliki (Q, Q, Q)
Krishna Veni
Duplikat dari Pertanyaan ini, Bagaimana mengkonversi dari java.sql.Timestamp ke java.util.Date? .
Basil Bourque
Judul Pertanyaan ini adalah ikan haring . Masalah sebenarnya adalah penggunaan a yang PreparedStatementtidak tepat dengan sintaks yang salah. Anda tidak dapat menyematkan variabel Java dalam teks string SQL Anda. Sebagai gantinya, sematkan ?dalam string SQL, lalu panggil setmetode untuk meneruskan nilai ke PreparedStatement. Lihat Jawaban yang benar oleh Sujay dan Jawaban oleh tenorsax .
Basil Bourque

Jawaban:

188

Buat saja Dateobjek baru dengan nilai cap getTime()sebagai parameter.

Berikut adalah contohnya (Saya menggunakan contoh timestamp dari waktu saat ini):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
Alex Coleman
sumber
@ vs06 Apa yang membuat Anda berpikir bahwa ini sudah usang? Dokumen java 7 dan 8 terbaru menyatakan sebaliknya ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () dan docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman
4
Ini akan memberikan hasil yang salah jika zona waktu Stempel waktu dan zona waktu JVM berbeda.
Robert Mugattarov
Bagaimana cara membuat format ini menjadi 14.03.2014 misalnya?
shurrok
6
Saya benci ketika ppl menggunakan perpustakaan dalam jawaban mereka dan berharap semua orang tahu cara mengimpornya: /
Sodj
38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();
VincentLamoute
sumber
Mengapa Anda mengalikannya dengan 1000?
Sharpless512
3
Karena inisialisasi tanggal dalam milidetik dan stempel waktunya dalam detik! Pikiran yang sama untuk semua konversi lainnya! Ini baik ?
VincentLamoute
10

Hanya:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
Alberto Cerqueira
sumber
7

Saya sudah mencari ini sejak lama, ternyata konverter Eposh melakukannya dengan mudah:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

Atau sebaliknya:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));
Joker 00
sumber
6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

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 LocalDatekelas 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, seperti America/Montreal, Africa/Casablanca, atau Pacific/Auckland. Jangan pernah menggunakan singkatan 3-4 huruf seperti ESTatau ISTkarena itu bukan zona waktu yang sebenarnya, tidak standar, dan bahkan tidak unik (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Atau tentukan tanggal. Anda dapat mengatur bulan dengan angka, dengan penomoran 1-12 untuk Januari-Desember.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Atau, lebih baik, gunakan Monthobjek enum yang telah ditentukan sebelumnya, satu untuk setiap bulan dalam setahun. Tip: Gunakan Monthobjek 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 .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Dengan LocalDatetangan, 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 memberikan ZoneIdargumen LocalDate::atStartOfDayuntuk mencari anomali semacam itu. Hasilnya adalah a ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

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.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

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 placeddalam contoh ini.

Kode Anda harus menggunakan ?placeholder untuk menentukan momen kita.

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

Tapi kami memiliki ZonedDateTimeobjek di tangan, sementara database Anda tampaknya menyimpan bilangan bulat seperti yang dibahas di atas. Jika Anda telah mendefinisikan kolom Anda dengan benar, kami dapat meneruskan ZonedDateTimeobjek 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 ZonedDateTimekelas tersebut mampu menghasilkan resolusi nanodetik. Detik pecahan apa pun akan dipotong di baris berikut.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

Sekarang kami siap untuk meneruskan bilangan bulat tersebut ke kode SQL kami yang ditentukan di atas.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

Saat Anda mengambil nilai integer Anda dari ResultSet, Anda dapat mengubahnya menjadi Instantobjek (selalu dalam UTC), atau menjadi ZonedDateTimeobjek (dengan zona waktu yang ditetapkan).

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

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 .

Basil Bourque
sumber
4

Pertama-tama, Anda tidak memanfaatkan keuntungan menggunakan file PreparedStatement. Saya pertama kali menyarankan agar Anda memodifikasi PreparedStatementsebagai berikut:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

Anda kemudian dapat menggunakan statement.setXX(param_index, param_value)untuk mengatur nilai masing-masing. Untuk konversi ke timestamp, lihat javadocs berikut ini:

PreparedStatement.setTimeStamp ()
Timestamp

Semoga ini membantu!

Sujay
sumber
4

Di Android ini sangat Sederhana. Cukup gunakan kelas Calender untuk mendapatkan currentTimeMillis.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

Di Java, cukup Gunakan System.currentTimeMillis () untuk mendapatkan stempel waktu saat ini

Ashish Saini
sumber
3

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:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

EDIT: kolom cap waktu

Dalam kasus penggunaan stempel waktu java.sql.Timestampdan PreparedStatement.setTimestamp () , yaitu:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);
tenorsax
sumber
sekarang kondisi saya pilih * dari xcart_orders dimana status = 'Q' AND date = CURDATE (). sekarang juga ditampilkan nol saja
Krishna Veni
@krishnaveni rekaman apa yang Anda coba pilih?
tenorsax
tanggal (11111111,123456767,122333344) dan status = (Q, Q, Q) .. semua disimpan dalam database saya. sekarang saya ingin perlu memeriksa kueri dan mendapatkan nilai hitungan dan menampilkan di konsol saya (yaitu) berapa banyak Data dicocokkan setelah mengembalikan nilai hitungan
Krishna Veni
@krishnaveni Jika Anda ingin kumpulan hasil terikat dengan tanggal tertentu, gunakan tanggal tersebut dalam kueri, jika tidak, hapus kondisi tanggal.
tenorsax
dalam kode saya berfungsi dengan sukses ketika tanggal dalam format tttt-bb-hh disimpan dalam database saya. Tapi sekarang tanggal saya disimpan di stempel waktu dalam format 1343469690 ini. Bagaimana cara mendapatkan nilai hitungan? Bagaimana saya menulis kode di sini
Krishna Veni
3

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 memanggil Date.from(timestamp.toInstant()).

(Jangan mengandalkan fakta bahwa Timestampitu sendiri adalah contoh dari Date; lihat penjelasan di komentar jawaban lain .)

Garret Wilson
sumber
3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());
TUAN DAN
sumber
3

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:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

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 toDatepernyataan tersebut.

Robert Mugattarov
sumber
2

coba gunakan kode java ini:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);
Bantu pengembang
sumber
0

Dengan asumsi Anda memiliki yang sudah ada sebelumnya java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
Albizia
sumber
0

Anda dapat menggunakan metode ini untuk mendapatkan Tanggal dari Stempel Waktu dan Zona waktu area tertentu.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}
Manoj Patidar
sumber
-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;
pengguna1485365
sumber
-3
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp(); 
José Ángel Becerra Bernáldez
sumber