質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

6877閲覧

サーブレットとJSPを用いてデータベースからタイムスタンプの値を取得したい

Sfidante

総合スコア90

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2015/05/18 03:09

編集2015/05/18 08:56

現在、プログラミング初心者でWebアプリケーションを作っているのですが、
時間の取得でつまづいてしまったので、
質問をさせて頂きます。

行いたいことは、
ある2つの値から
データベース上でそれらの値による検索を行い、
特定のタイムスタンプを取得してくるというものです。

更に、その時間に72時間追加して、
その追加した時間と今の時間を比較します。
その時間が0以下になった時に
テーブルの該当する行を削除します。

説明が下手ですみません。
実際に書いているコードがこちらです。
まだまだ、完成には至っていないので、
考え方等を含めご教授願います。

下記がサーブレットです。

lang

1 protected void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 //エンコード設定 4 request.setCharacterEncoding("utf8"); 5 //sessionスコープの準備 6 HttpSession ses = request.getSession(true); 7 OfferDao dao = new OfferDao(); 8 try{ 9 dao.connect(); 10 //OfferBeans beans = new OfferBeans(); 11 //test用にgetParameter 12 //仮に設定した値の2つです。 13 String myPairID = String.valueOf(request.getParameter("mypairid")); 14 String yourPairID = "5000000060000000"; 15 ses.setAttribute("mypairid", myPairID); 16 ses.setAttribute("yourpairid", yourPairID); 17 String mypairid = (String)ses.getAttribute("mypairid"); 18 String yourpairid = (String)ses.getAttribute("yourpairid"); 19 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss"); 20 Date date = sdf.parse(dao.selectTime(mypairid, yourpairid).toString()); 21 long baseTime = date.getTime() + 259200000; 22 Timestamp timeStamp = new Timestamp(System.currentTimeMillis()); 23 long timeNow = timeStamp.getDateTime(); 24 long timeMilliSec = (baseTime - timeNow); 25 long hour = timeMilliSec / 3600000; 26 long min = (timeMilliSec / 60000) % 60; 27 long sec = (timeMilliSec / 1000) % 60; 28 String remainingTime = hour + "時間" + min + "分" + sec + "秒"; 29 request.setAttribute("NowTime", remainingTime); 30 }catch(Exception e){ 31 e.printStackTrace(); 32 throw new ServletException(); 33 }

上記のサーブレット内でのDaoのselectTime()の記載のあるDaoがこちらです。

lang

1/**更新時間の為のタイムスタンプのセレクト*/ 2 public OfferBeans selectTime(String myPairID , String yourPairID)throws Exception{ 3//取得した2つの値に該当する行のdatetime型のtimeを照会します。 4 String sql = "SELECT time FROM offer " 5 + "WHERE (offer_sendID = ? AND offer_recID = ?)OR (offer_sendID = ? AND offer_recID = ?)"; 6 PreparedStatement ps = connect.prepareStatement(sql); 7 ps.setString(1, myPairID); 8 ps.setString(2, yourPairID); 9 ps.setString(3, yourPairID); 10 ps.setString(4, myPairID); 11 ResultSet rs = ps.executeQuery(); 12 OfferBeans beans = new OfferBeans(); 13 rs.next(); 14 return beans; 15 }

上記の状態で実行したときのエラーがこちらです。

lang

1java.text.ParseException: Unparseable date: "beans.OfferBeans@49ae1e38"

単純にbeansで取得したデータをSimpleDateFormataの型に入れられていないのでしょうか?

色々調べたりしているのですが、
いまいち本質が掴めません。
何卒、ご教授の程よろしく御願い致します。

↓ここからが変更後のサーブレットです。

lang

1dao.connect(); 2 //test用にgetParameter 3 String myPairID = String.valueOf(request.getParameter("mypairid")); 4 String yourPairID = "3000000040000000"; 5 ses.setAttribute("mypairid", myPairID); 6 ses.setAttribute("yourpairid", yourPairID); 7 String mypairid = (String)ses.getAttribute("mypairid"); 8 String yourpairid = (String)ses.getAttribute("yourpairid"); 9 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss"); 10 Date date = sdf.parse(dao.selectTime(mypairid, yourpairid).getTime().toString()); 11 long baseTime = date.getTime() + 259200000; 12 Timestamp timeStamp = new Timestamp(System.currentTimeMillis()); 13 long timeNow = timeStamp.getDateTime(); 14 long timeMilliSec = (baseTime - timeNow); 15 long hour = timeMilliSec / 3600000; 16 long min = (timeMilliSec / 60000) % 60; 17 long sec = (timeMilliSec / 1000) % 60; 18 String remainingTime = hour + "時間" + min + "分" + sec + "秒"; 19 request.setAttribute("NowTime", remainingTime);

何卒よろしく御願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

selectTimeの最後の箇所は、selectしたtimeを格納する処理を書く必要があります。

もしDBのtimeがTimestamp型ならば、下記のようにすればパース処理は不要です。

lang

1if (rs.next()) { 2 beans.setTime(rs.getTimestamp(1)); 3}

投稿2015/05/18 05:27

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sfidante

2015/05/18 05:52

ご返信ありがとうございます。 確かにbean.setTime();を行っておらず、 何も返していませんでした。 しかし、エラーに関しましては、 変わりません。 mysqlのdetatime型からサーブレットのtimestamp型への変換がおかしいのでしょうか?
argius

2015/05/18 05:58

selectTimeをtoStringで返還すると、beans.OfferBeans@49ae1e38のような文字列が得られます。ご質問のコードでは、この文字列をパースしようとしているためにエラーになっています。 sdf.parse(dao.selectTime(mypairid, yourpairid).getTime());のようにすればできると思います。
argius

2015/05/18 05:59

↑文の先頭を訂正 selectTimeの結果(のOfferBeans)をtoStringで文字列に変換すると...
Sfidante

2015/05/18 08:53

ご回答ありがとうございます。 一応、データベースから時刻は取得できたのですが、 なぜか、今年の1月の日付を取得しました。 Sun Jan 18 07:21:16 JST 2015 変更後のコードは上記に追記致しますので、 何が原因なのか教えて頂いてもよろしいでしょうか? Date型だからというわけではありませんですよね?
argius

2015/05/18 10:31

手元にMySQL環境が無いので確認していませんが、datetimeをTimestampで取得すれば直接Timestampが得られているはずで、SimpleDateFormatのparseは不要になると思います。
Sfidante

2015/05/18 13:16

色々ご教授いただきありがとうございました。 最後の疑問に関しては、 とても初歩的なミスでした。 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");の "yyyy-MM-DD HH:mm:ss"の部分のDDが小文字(dd)でなければならなかったようです。 お手数御かけしました。
argius

2015/05/18 13:47

なるほど、そこは見逃していました。 ただ、しつこいようですが、今回のケースはTimestamp⇒文字列⇒Timestampをするのは無駄があると思いますので、今後は直接Timestampで取得することもご検討ください。
Sfidante

2015/05/18 14:00

かしこまりました。 今後はそちらの方法も勉強してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問