文字列から読み込んだ時刻の操作について

このQ&Aのポイント
  • 文字列表記された時刻を特定のフォーマットに変換・タイムゾーンの計算を行うプログラムの作成方法を教えてください。
  • CalenderクラスとSimpleDateFormatクラスを使用して、時間の加減算と文字列からDate型への変換を行います。
  • 出力結果の指定した形式にならない場合は、SimpleDateFormatクラスのapplyPatternメソッドの引数を修正することで指定した形式に変更できます。
回答を見る
  • ベストアンサー

文字列から読み込んだ時刻の操作について。

こんにちは。お時間のある時にお願いします。 文字列表記された時刻を、ある特定のフォーマットに変換し、尚且つタイムゾーンの計算をして、ソートさせるプログラムを組んでいます。 時間の加減算には、Calenderクラス、 String型からDate型に変換するには、SimpleDateFormatクラスが良さそうだ、と思って触っています。 ----- String strPreTime = "Sun, 11 Dec 2005 03:00:38 +0900"; //変換後時刻フォーマット -> 2005-12-11T03:00:38+0900 SimpleDateFormat sdf = new SimpleDateFormat(); sdf.setDateFormatSymbols(new DateFormatSymbols(Locale.US)); //日付の出力形式を設定 sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z"); Date dat = sdf.parse(strPreTime); System.out.println("test1: "+dat); sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ssZ"); String dat2 = sdf.format(dat); System.out.println("test2: " +dat2); ----- 出力結果: test1: Sun Dec 11 03:00:38 JST 2005 test2: 2005-12-11T03:00:38+0900 となりますが、test1の出力結果が、sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z");で指定した出力形式になっておらず、頭を悩ませています。 どこを直せば、指定した通りの出力形式になるのか、教えてください。 また、Date型の時にタイムゾーンだけを抽出する、というのはどうしたらいいでしょうか?

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>どこを直せば、指定した通りの出力形式になるのか、教えてください。 printlnしているdatは、生のDateですから System.out.println("test1:"+sdf.format(dat)); してやればいいことだと思います。 >Date型の時にタイムゾーンだけを抽出する もう一つ意味がよくわからないのですが、 getTimezoneOffset() するというような意味ですか? それか TimeZone.getDefault().getDisplayName(false,TimeZone.SHORT,Locale.US) または TimeZone.getDefault().getID() ?

kugayuyu
質問者

補足

ご教授ありがとうございます。 >>どこを直せば、指定した通りの出力形式になるのか、教えてください。 >printlnしているdatは、生のDateですから >System.out.println("test1:"+sdf.format(dat)); >してやればいいことだと思います。 上記部分に訂正した所、上手くいきました。 >>Date型の時にタイムゾーンだけを抽出する もう一つ意味がよくわからないのですが、 >getTimezoneOffset() >するというような意味ですか? >それか >TimeZone.getDefault().getDisplayName(false,TimeZone.SHORT,Locale.US) >またはTimeZone.getDefault().getID()? 質問が悪く申し訳ございません。 getTimezoneOffset()する事ですね。此方の方も参考になりました。ありがとうございます。 ところで、、、 2005-12-09T23:59:19+09:00 の、 "+09:00"は時刻の文字列パターンはあるのでしょうか?(+0900 なら、'Z'という風な。) 検索し、APIなどで調べてるのですが見当たりません。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/text/SimpleDateFormat.html もう地道にString型で弄っていった方がいいでしょうか。。。(^^;

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>"+09:00"は時刻の文字列パターンはあるのでしょうか?(+0900 なら、'Z'という風な。) ? どういう意味でしょう? ごめんなさい、よくわからないです。 できたら、これにこういうメソッドを適用するとこういうものが取り出せるみたいな目的を教えて貰えませんか? sdf.applyPattern("Z"); System.out.println(sdf.format(dat)); すればいいような気もしますが、そういう意味じゃないんですよね?

kugayuyu
質問者

お礼

結局、それらしい文字コードが見当たりませんでしたので、自分なりに地道に文字列操作で解決させました。 お忙しい中、ご教授頂きありがとうございました。

kugayuyu
質問者

補足

混乱させてしまい、申し訳ございません(汗) >これにこういうメソッドを適用するとこういうものが取り出せるみたいな目的を教えて貰えませんか? String strPreTime2 = "2005-12-09T23:59:19+0900"; SimpleDateFormat sdf2 = new SimpleDateFormat(); sdf2.setDateFormatSymbols(new DateFormatSymbols(Locale.US)); sdf2.applyPattern("yyyy-MM-dd'T'HH:mm:ssZ"); Date dat2 = sdf2.parse(strPreTime2); "2005-12-09T23:59:19+0900"をDate型に変換したdat2に.getTimezoneOffset()メソッドをかけると、int型で、"-540"と出ます。時差+9時間を分に直して修正したものです。 ただ、"2005-12-09T23:59:19+09:00"をDate型"yyyy-MM-dd'T'HH:mm:ssZ"に変換しようと思っても、"+09:00"に対応する時刻文字列が"Z"ではないのか、エラーで弾かれてしまいます。 対応する文字コードがあるのか、知ってたら教えてください。 というのが、質問の趣旨でした。 APIを見てもそれらしい記述がありませんでした。 未対応という結論であるのなら、地道に文字列操作で頑張ろう、と思います。 本当に、混乱させて申し訳ございませんでした。

関連するQ&A

  • 日付フォーマットの変換についての質問。

    こんにちは。宜しくお願いします。 現在、String型で受け取った日付の文字列をData型にして、さらに違う日付フォーマットにするプログラミングを書いています。 具体的には、 String型の"Wed, 07 Dec 2005 00:00:00 +0900"を、 Date型の"Wed, 07 Dec 2005 00:00:00 +0900"に変更して、 同じくDate型の、"2005-12-07T00:00:00+09:00"にしたいのです。 今躓いてる点は、String型の日付をDate型に変換する所で、エラーメッセージが、” Unparseable date: "Wed, 07 Dec 2005 00:00:00 +0900"”となっており、コード修正しても上手くいきません。 現時点でのコードを記述しますので、お時間があるときにご教授お願いします。 ---- import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 時間のフォーマット変換テスト。 * */ public class testConvertTime { public static void main(String[] args) throws ParseException { String strPreTime = "Wed, 07 Dec 2005 00:00:00 +0900"; //2005-12-07T03:00:12+09:00 SimpleDateFormat sdf = new SimpleDateFormat(); //日付の出力形式を設定 sdf.applyPattern( "EEE, dd MMM yyyy HH:mm:ss Z" ); //指定したフォーマットで日付が返される Date dat = sdf.parse(strPreTime); //java.util.Date dat = sdf.parse(strPreTime); } }

    • ベストアンサー
    • Java
  • Date型

    下記のコード内で、「20060618」設定して、出力を「2006年6月18日」としたいのですが、やり方がわかりません。わかる人がいましたらよろしくお願いいたします。また、Date型というのはどのような型のことを言うのでしょうか?初心者的な質問だと思いますがよろしくお願いいたします。 import java.util.*; import java.text.*; class Test { public static void main(String[] args) { Date date1 = new Date(); // Date date1 = format.parse("20011010"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'"); System.out.println(sdf1.format(date1)); } }

    • ベストアンサー
    • Java
  • 文字列のDateFormatへのパース

    とても単純なことを私が誤解しているのだと思うのですが、 文字列のDateFormatへのパースに関して、  DateFormat f = new SimpleDateFormat( "yyyy.MM.dd 'at' HH:mm:ss" );  try {   f.parse( "2001.07.04 at 12:08:56" );  } catch (ParseException e) {   e.printStackTrace();  } この形式だと正しくパースできるのですが、アルファベットの月や曜日が 含まれた下のような形式では、  java.text.ParseException: Unparseable date: "Wed, Jul 4, '01" 例外が発生してしまいます。  DateFormat f = new SimpleDateFormat( "EEE, MMM d, ''yy" );  try {   f.parse( "Wed, Jul 4, '01" );  } catch (ParseException e) {   e.printStackTrace();  } この下のデータサンプルはJavadocに掲載されている基本的な例ですので、 エラーになるはずはないのですが、ご助言頂ければ幸いです。

    • ベストアンサー
    • Java
  • 日付や時刻の"01"を" 1"に変換したいです。

    下記のような問題で悩んでいます。何かよいアイディアがありましたら教えて下さい。 【要件】 ・SimpleDateFormatで指定された書式の文字列にした後、年月日時分秒ミリ秒の"01"~"09"を" 1"~" 9"のように前0を半角スペースに一括変換したい(年は書式がyy形式の場合のみ)。 ・SimpleDateFormatへの書式はエラーが起きない限りどんなものでも受け入れる(通常、書くわけがない書式についても)。 例) "yyyy/MM/dd HH:mm:ss:SSS" "'yyyy/MM/dd HH:mm:ss:SSS形式:'yyyy/MM/dd HH:mm:ss:SSS"  ※''の中にあるMMはテキストなので英字のまま。 "yyyy/MMMMMMMMMMMMMMMMMMMM/dd HH:mm:ss:SSS"  ※Mの数は不明 "yyyy/MM/dd MM MM HH:mm:ss:SSS"  ※月の表示指定が複数 引数 :日付(yyyyMMddHHmmssSSS形式), SimpleDateFormatへの書式 戻り値:SimpleDateFormatで変換後に"01"~"09"を" 1"~" 9"にした文字列 自分なりの検討案としては下記になります。 a.引数の書式をそのままSimpleDateFormatに引き渡ずに、一部修正してから呼び出す。 例)"yyyy/MM/dd HH:mm:ss:SSS"→yyyy/_M/_d _H:_m:_s:__S" ※"_"は半角スペースです。 実際はMやdなどが2桁になる場合は変換しません。 かなりごりごり200行ぐらい試しに書いたのですが、対応できないケースが出てきてその都度エンドレス状態です。 ちょっとこのまま実装するわけにいきません。いつバグがでるか・・・。 b.SimpleDateFormatで変換後に年月日時分秒ミリ秒に該当する箇所に"01"~"09"があったら置換する。  引数の書式からMMやddのindexを保持して、SimpleDateFormatで変換後の該当indexに置換。 例) 書式:"yyyy/MM/dd_HH:mm:ss:SSS" 日付:"20090101010101001" "2009/01/01_01:01:01:001"→"2009/_1/_1__1:_1:_1:__1" ※"_"は半角スペースです。 但し前提として、書式とSimpleDateFormatで変換後の文字列が1対1になっている必要があります。 単純な例ですと 書式:"yyyy/MMMM/dd HH:mm:ss:SSS" 書式のddは11~12桁目ですが、SimpleDateFormatで変換後は下記のようにインデックスがずれます。 "2009/1月/01 01:01:01:001" "2009/12月/01 01:01:01:001" もしかしたら下記のような感じで吸収できるのかもしれませんが、ちょっと個人的に出来そうに思えませんでした。 月が1桁 かつ 書式が"M"の場合 月が1桁 かつ 書式が"MM"の場合 月が1桁 かつ 書式が"MMM"の場合 月が1桁 かつ 書式が"MMMM"の場合 月が1桁 かつ 書式が"Mxn"の場合 月が2桁 かつ 書式が"M"の場合 月が2桁 かつ 書式が"MM"の場合 月が2桁 かつ 書式が"MMM"の場合 月が2桁 かつ 書式が"MMMM"の場合 月が2桁 かつ 書式が"Mxn"の場合 ここ1,2週間ほど煮詰まっています。どなたかアドバイス頂けると助かります。 自分的なネックは書式が限りなくフリー形式なところです。

    • ベストアンサー
    • Java
  • 【PL/SQL】DATE型の時刻の表示と非表示

    PL/SQLでのDATE型の取扱いについて教えてください。 初期化パラメータNLS_DATE_FORMATが'YY-MM-DD'で、 ある列を'YYYY/MM/DD HH24:MI:SS'形式でDBにINSERTしたい場合、 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); としてINSERTにdtWorkEndDateを用いると、 YY-MM-DD形式でDBに登録されてしまいます。 (dtWorkEndDateはDATE型。) ORACLEの設定かPL/SQLの問題なのかわからないのですが、 なにかアドバイスを頂けないでしょうか。 よろしくお願いします。

  • javaの掲示板について

    投稿日時の取得部分の抜粋なのですが、全てのnew SimpleDateFormatの部分でシンボルが見つからないと言われます。 調べて出てくるところと同じに書いているので、エラーが出てくる原因がわかりません。 変更したり、付け加える点を教えてください。 よろしくお願いします。 import java.sql.*; import java.sql.Timestamp.*; import java.io.*; import java.util.Date.*; import java.text.DateFormat.*; import java.text.SimpleDateFormat.*; import java.util.Vector; public class MessageDao { private static final String DATE_PATTERN = "yyyy.MM.dd HH:mm:ss"; private String date2string(Timestamp timestamp){ SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); return sdf.format(timestamp); } 投稿メッセージの一覧を取得します public Vector getMessageList() throws Exception { Vector messageList = new Vector(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = this.getConnection(); String sql = "SELECT * FROM MESSAGE_TABLE ORDER BY ID DESC"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); while(rs.next()) { Message message = new Message(); Timestamp timestamp = rs.getTimestamp("DATE"); String strDate = new SimpleDateFormat(DATE_PATTERN).format(timestamp); message.setDate(strDate);

    • ベストアンサー
    • Java
  • JavaのDateクラスについて教えてください.

    下のプログラムを実行すると, Date : Mon Jan 30 15:30:00 JST 2006 となります. 私としては,Apr となることを期待するのですが, おかしいでしょうか? Javaの環境は,jdk1.5.0_05 です. // ここから import java.text.SimpleDateFormat; import java.util.Date; public class DateTest { public static void main(String[] args) throws Exception { String dateStr = "2006/04/30 15:30"; Date date = new SimpleDateFormat("yyyy/MM/DD HH:mm").parse(dateStr); System.err.println("Date : " + date); } }

  • ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています

    <エラーメッセージの内容> ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています 開発言語は、java,oracle10g express editionです スケジュールを登録する画面のところの日付のインサートで失敗します。「→」の部分です。 <以下のSQLをSQL/PLUSで実行するとうまくいきます> insert into schedule values(1, 1, '予定1', '予定1です', TO_DATE('2009-06-01 10:00','YYYY/MM/DD HH24:MI:SS') , TO_DATE('2009-06-01 12:00','YYYY/MM/DD HH24:MI:SS'), 'A社', '予定1のコメントです。',1); <問題のソースコード> * スケジュール情報をデータベースに新規保存する public void create(Schedule schedule) { String sql = "insert into " + SCHEDULE_TABLE_NAME + " (id, user_id,subject,content, start_time, end_time, place, comment1, is_publish) values(?,?,?,?,?,?,?,?,?)"; Connection con = null; try { con = createConnection(); con.setAutoCommit(false); int id = getNextId(con, SCHEDULE_TABLE_NAME); PreparedStatement stmt = con.prepareStatement(sql); →stmt.setString(5,toString(schedule.getStartTime())); →stmt.setString(6, toString(schedule.getEndTime())); * 日付を文字列表現(yyyy-MM-dd HH:mm)に変換する private String toString(java.util.Date date) { SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm"); →return "TO_DATE('"+"'"+sd.format(date)+"'"+",'YYYY/MM/DD HH24:MI:SS'"+")"; } ネット、本などでいろいろ調べましたが、わからなかったので、ヒントになることでもいいので、ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • 和暦変換フォーマット用メソッドについて

    private void 生年月日編集(String 生年月日, PrintWriter out) { SimpleDateFormat sdf1 = new SimpleDateFormat(生年月日); sdf1.setLenient(false); Date d = sdf1.parse("20120705", new ParsePosition(0)); SimpleDateFormat sdf2 = new SimpleDateFormat("GGGGyyyy年M月d日", new Locale("ja", "JP", "JP")); System.out.println(sdf2.format(d)); 上記の和暦変換プログラムを フォーマット用メソッドとして和暦変換プログラムを呼び だすようにしたいのですが うまくいきません。 アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 日付型→文字列

    SQLServer2005の環境にて、 日付型の項目(YYYY/MM/DD HH:MM:SS)から日付のみを抽出したい場合、 現在SUBSTRING(CONVERT(VARCHAR,AA),1,10) と変換を行っているのですが、結果が「MM DD YYYY」となってしまいます。 「YYYY/MM/DD」の形式で取得するにはどのようなSQL文にすればよろしいのでしょうか。