Java'da TimeStamp'ı Date'e dönüştürmek nasıl?


105

Java'da datesayımı aldıktan sonra 'timeStamp'ı nasıl dönüştürürüm ?

Mevcut kodum aşağıdaki gibidir:

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;
    }
}

Bu benim veritabanım: görüntü açıklamasını buraya girin

Burada aldığım çıktı 2012-08-07 0 idi, ancak eşdeğer sorgu 3'ü döndürüyor. Neden 0 alıyorum?



Tablo verilerinin neye benzediğine dair örnekler gösterebilir misiniz?
oldrinb

tarihi (1344255451,1344255537,1344312502) ve durum var (Q, Q, Q)
Krishna Veni


Bu Sorunun başlığı kırmızı ringa balığıdır . Asıl sorun, PreparedStatementyanlış sözdizimi ile a'nın yanlış kullanılmasıdır . Java değişkenlerini SQL dizenizin metnine gömemezsiniz. Bunun yerine, ?SQL dizesine gömün , ardından setdeğerleri PreparedStatement'a geçirmek için yöntemleri çağırın . Doğru Bkz SUJAY tarafından cevap ve tenorsax tarafından cevap .
Basil Bourque

Yanıtlar:


188

Parametre olarak Datedamga getTime()değeriyle yeni bir nesne oluşturun .

İşte bir örnek (şimdiki zamana ait örnek bir zaman damgası kullanıyorum):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 Kullanımdan kaldırıldığını düşündüren nedir? En son java 7 ve 8 belgelerinin ikisi de aksini söylüyor ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () ve docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman

4
Zaman Damgası saat dilimi ve JVM saat dilimi farklıysa bu yanlış bir sonuç üretecektir.
Robert Mugattarov

Bu, örneğin 14.03.2014'e nasıl biçimlendirilir?
shurrok

6

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();

Neden 1000 ile çarptınız?
Sharpless512

3
Tarihin başlatılması milisaniye cinsinden ve zaman damgası saniye cinsinden olduğundan! Diğer tüm dönüşümler için aynı düşünce! Bu iyi ?
VincentLamoute

10

Sadece:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());

7

Bunu uzun zamandır arıyordum, Eposh dönüştürücünün bunu kolayca yaptığı ortaya çıktı :

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

Veya tam tersi:

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

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

Modern java.time sınıfları tarafından değiştirilen, artık eski olan zahmetli eski tarih-saat sınıflarını kullanıyorsunuz .

Görünüşe göre veritabanınızda bir anı tam sayı türünde bir sütunda depoluyorsunuz. Bu talihsiz bir durum. Bunun yerine, SQL standardı gibi bir sütun türü kullanmalısınız TIMESTAMP WITH TIME ZONE. Ama bu Cevap için elimizdekiyle çalışacağız.

Kayıtlarınız milisaniye çözünürlüklü anları temsil ediyorsa ve tüm kayıtları tüm gün için istiyorsanız, o zaman bir zaman aralığına ihtiyacımız var. Bir başlangıç ​​anımız ve bir durma anımız olmalı. Sorgunuzda bir çifti olması gereken tek bir tarih-saat kriteri vardır.

LocalDateSınıf zaman günün-ve saat dilimi bulunmayan olmadan tarih salt değerini temsil eder.

Tarih belirlemede saat dilimi çok önemlidir. Herhangi bir an için tarih, dünya genelinde bölgeye göre değişir. Örneğin, Paris'te gece yarısından birkaç dakika sonra Fransa , Montréal Québec'te hala "dün" iken yeni bir gündür .

Saat dilimi belirtilmezse, JVM, geçerli varsayılan saat dilimini örtük olarak uygular. Bu varsayılan her an değişebilir, bu nedenle sonuçlarınız değişebilir. İstediğiniz / beklenen saat dilimini açıkça bir bağımsız değişken olarak belirtmek daha iyidir.

Bir belirtme uygun bir zaman dilimi adı biçiminde continent/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland. Hiçbir zaman gibi 3-4 harfli bir kısaltma kullanın ESTveya ISToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).

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

JVM'nin mevcut varsayılan saat dilimini kullanmak istiyorsanız, bunu sorun ve bağımsız değişken olarak iletin. Atlanırsa, JVM'nin mevcut varsayılanı örtük olarak uygulanır. Açıkça belirtmek daha iyidir, çünkü varsayılan, çalışma süresi sırasında herhangi bir anda JVM içindeki herhangi bir uygulamanın herhangi bir iş parçacığındaki herhangi bir kodla değiştirilebilir .

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

Veya bir tarih belirtin. Ayı, Ocak-Aralık için 1-12 arası mantıklı bir sayı ile ayarlayabilirsiniz.

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.

Veya daha iyisi, Monthyılın her ayı için önceden tanımlanmış enum nesnelerini kullanın . İpucu: MonthKodunuzu daha fazla kendi kendini belgelendirmek, geçerli değerleri garantilemek ve tür güvenliği sağlamak için kod tabanınızda salt bir sayı yerine bu nesneleri kullanın .

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

Bir LocalDateelimizdeyken, bunu bir çift ana, günün başlangıcı ve bitişi haline dönüştürmeliyiz. Günün 00: 00: 00'da başladığını varsaymayın. Yaz Saati Uygulaması (DST) gibi anormallikler nedeniyle gün 01:00:00 gibi başka bir saatte başlayabilir. Öyleyse java.time günün ilk anını belirlesin. Bu tür anormallikleri aramak için bir ZoneIdargüman LocalDate::atStartOfDayiletiriz. Sonuç bir ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Genel olarak, bir zaman aralığını tanımlamaya yönelik en iyi yaklaşım, başlangıcın kapsayıcı , bitişin özel olduğu Yarı Açık yaklaşımdır . Yani bir gün ilk anıyla başlar ve ertesi günün ilk anına kadar devam eder, ancak buna dahil olmaz.

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

Bütün gün sorgumuz SQL komutunu kullanamaz BETWEEN. Bu komut Tam Kapalı ( []) (hem başlangıç ​​hem de son kapsayıcıdır) ve Yarı Açık ( [)) istediğimiz yerde . Bir çift kriter kullanıyoruz >=ve <.

Sütununuzun adı kötü. Çeşitli veritabanları tarafından ayrılmış bin kelimeden herhangi birinden kaçının. placedBu örnekte kullanalım .

Kodunuz, ?anlarımızı belirtmek için yer tutucular kullanmalıdır.

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

Ancak elimizde ZonedDateTimenesneler var , veritabanınız görünüşe göre yukarıda tartışıldığı gibi tamsayılar saklıyor. Eğer varsa etmişti sütununuzu tanımlı düzgün biz sadece geçebileceği ZonedDateTimesonra JDBC 4.2 veya destekleyen herhangi bir JDBC sürücüsü ile nesneleri.

Ancak bunun yerine, tam saniyeler içinde bir çağın sayımına ihtiyacımız var. Dönem referans tarihinizin UTC'deki 1970'in ilk anı olduğunu varsayacağım. ZonedDateTimeSınıf nanosaniye çözünürlük yeteneğine sahip olduğundan , olası veri kaybına dikkat edin . Herhangi bir kesirli saniye aşağıdaki satırlarda kesilecektir.

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

Artık bu tam sayıları yukarıda tanımlanan SQL kodumuza geçirmeye hazırız.

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

Tamsayı değerlerinizi öğesinden aldığınızda ResultSet, Instantnesnelere (her zaman UTC'de) veya ZonedDateTimenesnelere (atanmış bir saat dilimiyle) dönüştürebilirsiniz.

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

Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time sınıflarını nereden edinebilirim?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


4

Her şeyden önce, bir PreparedStatement. İlk önce PreparedStatementaşağıdaki gibi değiştirmenizi öneririm :

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

Daha sonra statement.setXX(param_index, param_value)ilgili değerleri ayarlamak için kullanabilirsiniz . 'A dönüştürmek için timestampaşağıdaki javadoc'lara bir göz atın:

PreparedStatement.setTimeStamp ()
Zaman Damgası

Bu yardımcı olur umarım!


4

Android'de çok basittir. CurrentTimeMillis'i almak için Calender sınıfını kullanmanız yeterlidir.

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

Java'da geçerli zaman damgasını almak için System.currentTimeMillis () kullanın


3

Değil emin ne sorguda seçin ama akılda tutmak için çalışıyoruz UNIX_TIMESTAMP()argümanları olmadan artık zamanı döndürür. Muhtemelen argüman olarak geçerli bir zaman sağlamalı veya koşulu değiştirmelisiniz.

DÜZENLE:

Soruya dayalı olarak zamana bağlı bir sorgu örneği:

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: zaman damgası sütunu

Zaman damgası java.sql.Timestampve PreparedStatement.setTimestamp () kullanılması durumunda , yani:

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);

şimdi durumum xcart_orders'dan * seçiliyor, burada durum = 'Q' VE tarih = CURDATE (). artık sadece sıfır gösteriliyor
Krishna Veni

@krishnaveni hangi kayıtları seçmeye çalışıyorsunuz?
tenorsax

tarih (11111111,123456767,122333344) ve status = (Q, Q, Q) .. hepsi veritabanıma kaydedildi. şimdi sorguyu kontrol etmek ve sayma değerini almak ve konsolumda görüntülemek istiyorum (yani) kaç tane veriler, sayı değerini döndürdükten sonra eşleştirilir
Krishna Veni

@krishnaveni Sonuç kümesinin belirli bir tarihe bağlı olmasını istiyorsanız, sorguda o tarihi kullanın, aksi takdirde tarih koşulunu kaldırın.
tenorsax

benim kodumda, veri veritabanıma kaydedilen tarih yyyy-aa-gg biçiminde olduğunda başarıyla çalışıyor. Ama şimdi tarihim bu 1343469690 biçiminde bir zaman damgasına kaydedildi. Sayım değeri nasıl alınır? Buraya kodu nasıl yazdım
Krishna Veni

3

new Date(timestamp.getTime())Çalışması gerekir, ancak yeni fantezi Java 8 yolu (daha zarif ve daha güvenli olabilir, ayrıca yeni zaman sınıflarını kullanmanıza yardımcı olur) aramaktır Date.from(timestamp.toInstant()).

( TimestampKendisinin bir örneği olduğu gerçeğine güvenmeyin Date; başka bir cevabın yorumlarındaki açıklamaya bakın .)


3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());

3

Diğer yanıtlar zaman dilimi agnostiği gibi göründüğü için, gerçek dünya uygulamasının sahip olamayacağı şekilde yanıt vermek zorunda olduğumu hissediyorum. Zaman damgası ve JVM farklı saat dilimlerini kullandığında zaman damgasından bugüne dönüştürmeyi doğru yapmak için Joda Time'ın LocalDateTime (veya Java8'de LocalDateTime) şu şekilde kullanabilirsiniz:

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

Aşağıdaki örnek, zaman damgasının UTC olduğunu varsayar (genellikle veritabanlarında olduğu gibi). Zaman damgalarınızın farklı saat diliminde olması durumunda, toDateifadenin saat dilimi parametresini değiştirin .


2

bu java kodunu kullanmayı deneyin:

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);

0

Önceden bir varlığınız olduğunu varsayarsak java.util.Date date:

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

0

Bu yöntemi, belirli bir alanın Zaman Damgasından ve Saat diliminden Tarih almak için kullanabilirsiniz.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

-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;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.