• ベストアンサー

時間を表す文字列を時刻に変換

java eclipse3.5を使ってプログラミングを勉強しています. コンソール画面で入力した時間型文字列を時刻に変換するためにカレンダークラスを使っています. 入力のフォーマットは次のようにしたいです. ex. 2010:01:25:00:00:00 入力した文字列が正しくなければ、つまり月の入力ならば1~12、日ならば月に相当した数値、時間なら0~23、分なら0~59、秒なら0~59という ことを判定して、この条件を満たさないなら再入力をさせたいです. ちなみに2010:01:25:00:00:00を年,月,日などに分割するために, splitメソッドを使い':'で分割しています. String time = "2010:01:25:00:00:00"; String[] time_para = time.split(":"); とすればtime_para[0]が年,time_para[1]が月,…というようになります. Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(time_para[0], time_para[1] - 1, time_para[2], time_para[3], time_para[4], time_para[5]); Time = calendar.getTimeInMillis(); というようにして時間に変換しています. 正しく入力されたかどうかの確認をしたいのですが,月によって1ヶ月の日の数が異なるため、time_para[1]が0から30ならOKという条件には出来ません. どのようにすれば月によって変化する日数を区別して, 正しい入力かの判定が出きるのでしょうか? アドバイスを頂きたいです.よろしくお願いします.

  • Java
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
回答No.1

import java.util.*; import java.text.*; class hoge{ public static void main(String[] args){ String time = "2010:12:25:00:71:00"; String[] time_para = time.split(":"); Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set( Integer.parseInt(time_para[0]), Integer.parseInt(time_para[1]) - 1, Integer.parseInt(time_para[2]), Integer.parseInt(time_para[3]), Integer.parseInt(time_para[4]), Integer.parseInt(time_para[5]) ); SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); System.out.println(sdf.format(calendar.getTime()).equals(time)); } }

その他の回答 (2)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

No2さんの SimpleDataFormatを使っても 2010/2/29は例外が発生しないわ。 もう一手間必要よ。 setLenient(false) を使う必要があるわ。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

> 正しく入力されたかどうかの確認をしたいのですが String da = "2010/01/25 23:12:"; SimpleDateFormat df = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); Date d=null; try { d = df.parse(da); } catch (ParseException ex) { System.out.println("フォーマットエラーです。"); return; } System.out.println(d.toString()); 質問者さんのフォーマットでは、N01さんが書いているとおりです 例えば、今回のようにフォーマットが違う場合、 秒がかけたとき エラーが発生しますので try catchで、受け取って、処理も出来ます。 ちなみにの、独自のフォーマットも良いのですが。 一般的なフォーマットを利用すると、後々 便利なような気がします。

関連するQ&A

  • 日付、文字列変換に関して

    日付、文字列変換に関して 文字列の日付に対し、プラス1ヶ月した後、また文字列に戻すような 仕掛けを考えています。 そこで、以下のような記述をしましたが、どうも最後の文字列への変換が うまくいきません。 何が原因でしょうか。。。 DateTime A_time; DateTime B_time; string AFormat; AFormat = "yyyyMM"; A_time = DateTime.ParseExact("201012", AFormat, null); B_time = A_time.AddMonths(1); string C_time = B_time.ToString("YYYY/MM"); 初歩的な内容で申し訳ありませんが、よろしくお願いします。

  • 文字列を時刻に変換して合計する

    4桁で入力された文字列を時刻に変換して、最後に合計をしようと思います。 例)0820 → 08:00   1350 → 13:50 8時間と13時間50分を足して21時間50分で出したいのです。 文字列をA列とすると 文字列変換は =TEXT(A1,"00!:00!") は出来たのですが、SUMで合計すると0になってしまいます。 =--TEXT(A1,"00!:00!") と教えてくれる人もいましたが、これだと合計値は合うのですが、 これでいいのでしょうか? また、一体TEXTの前の”--”にはどんな意味があるのですか? ※見えづらいですがハイフンが2つです。

  • 文字列変換について

    質問させてください。 携帯のサイトで各種(Vodafone, au)携帯電話からBBSに感想を入力する画面を作成しました。 入力される文字列は文字、数字、絵文字があります。 入力されたデータはPostgreSQLのDBに格納しています。 その格納された文字列(絵文字含む)を各種携帯で 表示してみたところ、お互いの絵文字が問題に なったため、変換処理を追加しました。 ======================================== $msg = "********";(DBから取得した文字列(絵文字含む)) $emoji = file(emoji_file.txt); for($r=0;$r<count($emoji);$r++){ $string = chop($emoji[$r]); $emoji_data = split("===", $string); if(strstr($msg, $emoji_data[0])){ echo("HIT"); $msg = eregi_replace($emoji_data[0], $emoji_data[1], $msg); } } echo($msg); ====================================== emoji_file.txt $Fr===1 $G-===281 $G.===287 ====================================== 上記のプログラムで、 DBから取得した文字列内にemoji_file.txt にある絵文字データがあれば数値に変換したいと 考えていますが、"HIT"が表示されるにも かかわらず変換されずに表示されます。 これは、"$G."などVodafoneの絵文字が 普通の文字列と違うからでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • C# 文字列の分割

    VS2005を使用しているものです。 複数のURL(入力)を格納したString型の配列があるのですが、 この配列から各要素(URL)の最後尾にあるファイル名だけを 取り出して別のString型の配列に入れたいのですが Splitなどを駆使すればよいのでしょうか? 例 C:\○○○\▲▲▲\××.拡張子 (元の配列の要素の一例)   などから××.拡張子の文字列だけを取り出して   別の配列に格納する感じです。 splitを使う際は\などを区切りに考えています。 for文の中でsplitを駆使しようと考えたのですが、分割した文字列を別で配列に格納して、その最後尾の要素だけ取り出したいのですが、URLの長さは入力によってまちまちなのでどのようにして取り出せばよいか困っています。 勉強不足で恐れ入りますが、何かご教授願えれば幸いです。

  • GMT時刻を任意のタイムゾーン時刻への変換方法

    Date型のGMT時刻をOSで設定したタイムゾーンに応じたローカル時刻に変換してくれる ことを期待して下記サンプル(SimpleDateFormatにTimeZoneを設定)を作成しました。 しかし、変換前後で時刻は変わりませんでした。 GMT時刻=2010/06/13 09:15:30 を作成。OSのタイムゾーンを日本に設定し、変換。 変換後の時刻は9時間後の2010/06/13 18:15:30を期待したのですが変換前後で変化は ありませんでした。下記がそのサンプルなのですが何か問題がありますでしょうか。 また、サンプルではOSからタイムゾーンを取得しているのですがブラウザのタイムゾーンを 取得することはできるのでしょうか。HTTP request headersにはタイムゾーン情報は無く JavaScriptを経由してとらないといけないという記述をどこかで見たことはあるのですが・・・。 【サンプル】 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; public class TimeZoneTest { private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); public static void main(String[] args) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2010); cal.set(Calendar.MONTH, 5); cal.set(Calendar.DAY_OF_MONTH, 13); cal.set(Calendar.HOUR_OF_DAY, 9); cal.set(Calendar.MINUTE, 15); cal.set(Calendar.SECOND, 30); Date todayDate = cal.getTime(); System.out.println("GMT時刻=" + formatter.format(todayDate).toUpperCase()); // GMT時刻=2010/06/13 09:15:30 String convertDate =convertTime(todayDate); // OSのTimeZoneId=Asia/Tokyo にて変換 System.out.println("ローカル時刻=" + convertDate); // ローカル時刻=2010/06/13 09:15:30 何故??? } public static String convertTime(Date todayDate) { String timeZoneId = TimeZone.getDefault().getID(); System.out.println("OSのTimeZoneId=" + timeZoneId); // OSのTimeZoneId=Asia/Tokyo formatter.setTimeZone(TimeZone.getTimeZone(timeZoneId)); return formatter.format(todayDate).toUpperCase(); } }

    • ベストアンサー
    • Java
  • 小文字、大文字変換

    こんにちは。 javaの勉強をやっているのでですが 思うとおりに進みません。 一文字ずつ小文字なら大文字に大文字なら小文字に変換するといったものです。 途中経過です。 import java.io.*; class Ex60{ public static void main(String args[])throws IOException{ String str3 ="0"; String output = "0"; String s1 = new String("end"); while(str3.equals(s1) == false ){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(str3.equals(s1) == false ){ System.out.print(">"); str3 = br.readLine(); if(str3.equals(s1) == true) break; for(int i=0; i<str3.length(); i++){ char c = str3.charAt(i); if(Character.isLowerCase(c)) output = str3.toUpperCase(); else if(Character.isUpperCase(c)) output= str3.toLowerCase(); } System.out.println("入力された文字列は" + str3 + "です。"); System.out.println("大文字小文字を変換すると" + output + "です。"); } } } } /* 実行結果 >abc 入力された文字列はabcです。 大文字小文字を変換するとABCです。 >AbC 入力された文字列はAbCです。 大文字小文字を変換するとabcです。 >AAb 入力された文字列はAAbです。 大文字小文字を変換するとAABです。 */ 条件として一文字が大文字か小文字の判定にはCharacterクラスの isLowerCase()メソッド、isUpperCase()メソッド 一文字の変換はtoUpperCase()メソッド、toLowerCaseメソッドを使います。 どなたかよろしくおねがいします。

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

    こんにちは。お時間のある時にお願いします。 文字列表記された時刻を、ある特定のフォーマットに変換し、尚且つタイムゾーンの計算をして、ソートさせるプログラムを組んでいます。 時間の加減算には、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
  • ”123456”といった整数を文字列に変換、その後、文字列を1文字ごとに整数に変換 

    忙しい中失礼します。 http://oshiete1.goo.ne.jp/qa3424254.htmlでも質問させて頂いたものですが、 今、回答してくださった方の意見を参考に以下の過程をこなそうとしています。 1.整数入力 →scanf関数を使用し、"123456"と入力します。 2.整数を文字列に変換 → printf("Write the SIN: \n");   scanf("%d", &fnum);   printf("%c\n",fnum); で、"123456"と数値を入力しても”123456”という値が返されず、@となってしまいます。 どうすれば入力した数値が文字列として返ってくるのでしょうか? どんな文・関数を使用すれば数字を文字列として使用することが可能になるのでしょうか? 今のところ習っている文はif else, swith case, while for,do whileで、 getcharやstr?(string)という関数は習っていません。なので、どうプログラムを書けばいいのか??さっぱりなのです。 でもgetcharやstr?(string)という関数を使用するしか方法はないものなのでしょうか?  また、それから 3.文字列を1文字ごとに整数に変換  にする場合、どんな文・関数を使用すれば、1文字”ごと”に整数に変換できるのでしょうか? ごめんなさい、分からないのです。プログラム文、ヒントもしくは参考になるページ等があれば教えて下さい。 よろしくお願いします。 <使用環境:フリーソフト(Borland?)C ANSI C>

  • 転送用文字列を、ISO或いは、EIAに変換にする…

    転送用文字列を、ISO或いは、EIAに変換にするには? こんにちわ。 VB6.0で、NCへの転送プログラムを作成しております。 現在、NCへの転送文字列は String型の変数(strSendData)へ入力しておりますが それを、ISO或いは、EIAに変換する為には どうすれば宜しいでしょうか? 宜しくお願いします。

  • エクセル:漢字混じりの日時文字列を時間データに変換

    日・時・分が漢字で入力されたエクセルの文字列データを、時間データに変換したいです。 マクロでも関数でも、どちらでもよいです。 どのようにすればよいでしょうか? よろしくお願いします。 例) -- 2日8時間 → 56:00 2時間30分 → 2:30 5分 → 0:05 4時間 → 4:00