JavaでTimeStampをDateに変換する方法は?


105

dateJavaでカウントを取得した後、「timeStamp」をどのように変換しますか?

私の現在のコードは次のとおりです:

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

これは私のデータベースです: ここに画像の説明を入力してください

ここで取得した出力は2012-08-07 0でしたが、同等のクエリは3を返します。なぜ0になるのですか?



テーブルのデータの例を見せていただけますか?
oldrinb 2012

日付(1344255451,1344255537,1344312502)とステータスhave(Q、Q、Q)
クリシュナヴェニ


この質問のタイトルは赤いニシンです。本当の問題は、正しくPreparedStatementない構文でのの不適切な使用です。SQL文字列のテキストにJava変数を埋め込むことはできません。代わり?に、SQL文字列に埋め込み、setメソッドを呼び出して値をPreparedStatementに渡します。正しい参照Sujayで回答をしてtenorsaxで回答
バジル

回答:


188

DateスタンプのgetTime()値をパラメータとして新しいオブジェクトを作成するだけです。

次に例を示します(現在の時刻のタイムスタンプの例を使用しています)。

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

@ vs06非推奨だと思うのはなぜですか?最新のJava 7および8のドキュメントはどちらもそうではありません(docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime()およびdocs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime--
アレックス・コールマン

4
これにより、タイムスタンプのタイムゾーンとJVMのタイムゾーンが異なる場合、誤った結果が生成されます。
ロバートムガタロフ2016

これをたとえば14.03.2014にフォーマットするにはどうすればよいですか?
シュロック

6
私はpplがライブラリを回答に使用するのが嫌いで、誰もがそれらをインポートする方法を知っていることを期待します:/
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();

なぜ1000倍したのですか?
Sharpless512

3
日付の初期化はミリ秒単位であり、タイムスタンプは秒単位だからです!他のすべての変換についても同様です。それは良いです ?
VincentLamoute 2013


7

私はこれを長い間探していましたが、Eposhコンバーターが簡単に実行できることがわかりました

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

またはその逆:

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

現代のjava.timeに取って代わった、古いレガシーである厄介な古い日時クラスを使用しています。クラスにます。

どうやら、データベースのある整数型の列にモーメントを格納しているようです。それは残念です。代わりに、SQL-standardなどのタイプの列を使用する必要がありますTIMESTAMP WITH TIME ZONE。しかし、この回答では、私たちが持っているものを扱います。

レコードがミリ秒の分解能で瞬間を表し、1日全体のすべてのレコードが必要な場合は、時間範囲が必要です。私たちはスタートの瞬間とストップの瞬間を持っている必要があります。クエリには日付と時刻の条件が1つしかなく、ペアにする必要がありました。

LocalDateクラスは、時刻とタイムゾーンなしの日付のみの値を表します。

日付を決定するには、タイムゾーンが重要です。いつでも、日付は世界中でゾーンごとに異なります。たとえば、パリの真夜中から数分後のフランスは新しい日ですが、まだ「昨日」です。モントリオールケベックです。

タイムゾーンが指定されていない場合、JVMは暗黙的に現在のデフォルトのタイムゾーンを適用します。そのデフォルトはいつでも変更される可能性があるため、結果は異なる場合があります。引数として希望/予想タイムゾーンを明示的に指定することをお勧めします。

指定適切なタイムゾーン名をの形式でcontinent/region、のようなAmerica/MontrealAfrica/CasablancaまたはPacific/Auckland。決してなど3-4文字の略称を使用していないESTか、ISTそのままではない真の時間帯ではなく、標準化、さらには一意ではありません(!)。

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

JVMの現在のデフォルトのタイムゾーンを使用する場合は、それを要求し、引数として渡します。省略した場合、JVMの現在のデフォルトが暗黙的に適用されます。デフォルトは、JVM内の任意のアプリの任意のスレッド内の任意のコードによって実行時にいつでも変更される可能性があるため、明示的にすることをお勧めします。

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

または、日付を指定します。月は数字で設定できます。正月は1月から12月まで1〜12です。

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.

または、Month年の各月に1つずつ、事前定義された列挙オブジェクトを使用します。ヒント:Month単なる整数ではなく、コードベース全体でこれらのオブジェクトを使用して、コードをより自己文書化し、有効な値を確保し、タイプセーフを提供します。

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

LocalDate手に、私たちは、次の必要性は一瞬、一日の開始と停止のペアにそれを変換します。1日が00:00:00の時刻から始まると想定しないでください。夏時間(DST)などの異常のため、その日は01:00:00などの別の時間に始まる場合があります。したがって、java.timeにその日の最初の瞬間を決定させます。そのような異常を調べるためににZoneId引数を渡しますLocalDate::atStartOfDay。結果はZonedDateTimeです。

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

一般に、期間を定義する最良のアプローチは、開始が包括的で、終了が排他的であるハーフオープンアプローチです。つまり、1日は最初の瞬間から始まり、翌日の最初の瞬間までですが、それは含みません。

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

1日中のクエリでは、SQLコマンドを使用できませんBETWEEN。そのコマンドは完全に閉じた([])(最初と最後の両方が含まれます)であり、必要に応じて半分開いた([))です。私たちは、基準のペアを使用>=し、<

列の名前が不適切です。さまざまなデータベースで予約されている数千語を避けてください。placedこの例で使用してみましょう。

あなたのコードは?私たちの瞬間を指定するためにプレースホルダーを使用しているはずです。

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

しかしZonedDateTime、オブジェクトは手元にありますが、データベースは上記のように整数を格納しているようです。あなたがいる場合していたあなたのコラムを定義し、適切に我々は単に渡すことができますZonedDateTime JDBC 4.2以降をサポートする任意のJDBCドライバでオブジェクトを。

しかし、代わりに、秒単位でエポックからのカウントを取得する必要があります。私はあなたのエポック参照日がUTCで1970年の最初の瞬間であると仮定します。ZonedDateTimeクラスはナノ秒の分解能を備えているため、データ損失の可能性に注意してください。以下の行では、小数秒は切り捨てられます。

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

これで、これらの整数を上記で定義したSQLコードに渡す準備ができました。

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

から整数値を取得するとResultSetInstantオブジェクト(常にUTCで)またはZonedDateTimeオブジェクト(タイムゾーンが割り当てられている)に変換できます。

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

java.timeについて

java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。

java.timeクラスはどこで入手できますか?

  • Java SE 8 Java SE 9以降
    • 内蔵。
    • 実装がバンドルされた標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6および Java SE 7
    • java.time機能の多くはThreeTen-BackportでJava 6&7にバックポートされています。
  • アンドロイド
    • Androidの新しいバージョンには、java.timeクラスの実装がバンドルされています。
    • 以前のAndroidの場合、ThreeTenABPプロジェクトはThreeTen-Backport(上記)を採用しています。ThreeTenABPの使用方法…を参照してください。

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを


4

まず、を使用する利点を活用していませんPreparedStatement。まずPreparedStatement、次のように変更することをお勧めします。

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

次に、を使用statement.setXX(param_index, param_value)してそれぞれの値を設定できます。への変換についてtimestampは、次のjavadocsをご覧ください。

PreparedStatement.setTimeStamp()
タイムスタンプ

お役に立てれば!


4

Androidでは非常にシンプルです。Calenderクラスを使用してcurrentTimeMillisを取得します。

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

Javaでは、System.currentTimeMillis()を使用して現在のタイムスタンプを取得します


3

クエリで何を選択しようとしているのかはわかりませんUNIX_TIMESTAMP()が、引数を指定しないと現在の時刻が返されることに注意してください。引数として有効な時間を指定するか、条件を変更する必要があります。

編集:

これは、質問に基づく時間限定クエリの例です。

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

編集:タイムスタンプ列

タイムスタンプの使用java.sql.TimestampPreparedStatement.setTimestamp()の場合、すなわち:

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

今、私の状態は、ステータス=「Q」AND日付= CURDATE()xcart_orders SELECT * FROMで、今も唯一のゼロ表示。
クリシュナVeni

@krishnaveniどのレコードを選択しようとしていますか?
tenorsax 2012

date(11111111,123456767,122333344)とstatus =(Q、Q、Q).. allがデータベースに保存されます。クエリを確認してカウント値を取得し、コンソールに表示する必要があります(つまり)データは、カウント値を返した後に照合されます
クリシュナヴェニ

@krishnaveni結果セットを特定の日付でバインドする場合は、クエリでその日付を使用します。それ以外の場合は、日付条件を削除します。
tenorsax 2012

私のコードでは、日付がデータベースに保存されたyyyy-mm-dd形式の場合、正常に機能します。しかし、私の日付はこの1343469690形式でタイムスタンプに保存されます。カウント値を取得するにはどうすればいいですか?ここにコードを記述するにはどうすればよいですか
クリシュナヴェニ

3

new Date(timestamp.getTime())動作するはずですが、新しい洗練されたJava 8の方法(よりエレガントでタイプセーフであるだけでなく、新しい時間クラスを使用するのに役立つ)はを呼び出すことDate.from(timestamp.toInstant())です。

Timestampそれ自体がのインスタンスであるという事実に依存しないでください。別の回答のDateコメントの説明を参照してください。)


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

3

他の回答は実際のアプリケーションでは許されない時間帯にとらわれないように見えるので、私は対応する義務があります。タイムスタンプとJVMが異なるタイムゾーンを使用しているときにタイムスタンプから日付への変換を正しく行うには、次のようにJoda TimeのLocalDateTime(またはJava8ではLocalDateTime)を使用できます。

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

以下の例では、タイムスタンプがUTCであると想定しています(データベースの場合は通常そうです)。タイムスタンプが異なるタイムゾーンにある場合は、toDateステートメントのタイムゾーンパラメータを変更します。


2

このJavaコードを使用してみてください:

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

あなたが既存のものを持っていると仮定しますjava.util.Date date

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

0

このメソッドを使用して、特定のエリアのタイムスタンプとタイムゾーンから日付を取得できます。

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;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.