年月から、月間日数を取得する方法を教えて下さい。
例えば、「2003年7月」は、「31日間」あると思いますが、
その「31日間」を取得する方法を教えて下さい。
「2003年7月」を表すDate型オブジェクトを引数に
月間日数を取得したいです。

Javaで実現する方法をお願いします。

A 回答 (3件)

java.util.Calendar#getActualMaximum()


を使用して下さい。

http://www.okweb.ne.jp/kotaeru.php3?q=595271

上記の問題(解決されたのでしょうか?)もそうですが、
この手の日付の変更や情報の取得をするには、java.util.Calnedar を継承した java.util.GregorianCalendar クラスを用います。
API リファレンスをご覧になれば分かると思いますが、この手の問題を解決するメソッドが一通り揃っています。
    • good
    • 0

こんばんは



訂正です。


  return (year+year/4-year/100+year/400+(month*13+8)/5+1)%7 ;

  return (year+year/4-year/100+year/400+(month*13+8)/5+day)%7 ;
    • good
    • 0

こんばんは



曜日鑑別法というのをご存じでしょうか?

int weekDay(int year,int month,int day)
{
  if ( month < 3 ){
    year -- ;
    month += 12 ;
  }
  return (year+year/4-year/100+year/400+(month*13+8)/5+1)%7 ;
}

この関数に年、月、日を入れると、曜日に該当する数値を返します。
 0:日曜日
 1:月曜日
 2:火曜日
 3:水曜日
 4:木曜日
 5:金曜日
 6:土曜日

この関数を使って、今月の1日と次月の1日の差分を計算します。

i = weekDay(year,month,1);
if ( month < 12 ){
  month++ ;
} else {
  year++ ;
  month = 1 ;
}
j = weekDay(year,month,1);
if ( i <= j ){
  return 28+j-i ;
} else {
  return 35+j-i ;
}

当方Javaの環境が手元に無いので、デバッグしていません。
また、Data型からyearやmonthを取り出す方法は、お任せします。
    • good
    • 0

このQ&Aと関連する良く見られている質問

QXP対応の日数計算が出来るカレンダー

ウィンドウズXPホームエディションで動かす事の出来るカレンダーのフリーソフトを探しています。
条件は、日数計算が出来る事。何月何日の何日後は何月何日で何曜日だ…なんて事が分かるソフトがあるといいのですが……。

Aベストアンサー

このようなものはいかがですか?

私のウインドウズXPでも使えました。

参考URL:http://www.vector.co.jp/soft/win95/business/se084284.html

Q動的配列確保

JAVA初心者です。
VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか?
要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。
Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。
ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、
断念しました。教えてください。

Aベストアンサー

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や intValue() などのメソッドが各クラスに用意されているのでそれを使います。

もちろん、質問者さんが補足に書いたように、文字列に変換して ArrayList にいれる方法でもかまいません。ただし、Byte や Integer クラスのオブジェクトを使うと、
○「文字列⇔数値」の相互変換の必要が無いので、(一応)速い。
○元の数値が byte だったのか、int だったのか、short だったのか、…… が判別できる。
などの利点があります。

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や...続きを読む

Q英語ができる人はどうやってできるようになったんですか? どれくらいの日数がかかりましたか? どういう

英語ができる人はどうやってできるようになったんですか?
どれくらいの日数がかかりましたか?
どういう方法で習得しましたか?細かく教えてください。

Aベストアンサー

毎日問題を解き、会話を聞く。
英字新聞を読む。
留学1年する。
上記は大学入試センター試験で英語やフランス語が満点だった人の共通点です。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む

Q英語の月表示について

英語では月表示がそれぞれありますが、例えば日本では9月の6カ月前といえば3月というようにすぐ出てきますよね。
英語ではどう数えますか?
また、9.11テロはアメリカではなんと呼ぶのですか?
英語でも数字に置き換えるのでしょうか。

Aベストアンサー

興味深い質問だと思いネイティブスピーカーに聞いてみました。
すると、月表示を一度数字に置き換えて計算してるという答えでした。

とはいえ、それは人によると思います。
日本人だって、木曜日の3日前は?と聞かれれば
水、火、月と数えて辿る人もいれば、パッと月曜日と直ぐに答えが出る人もいると思います。(例えとして適切かどうかは微妙ですが、、、^^;)

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q英語の省略について。

英語の省略について。
 英語の授業で、「be busy (in)Ving のinは省略されて分詞に見えるけど、動名詞なんだぞ。」といわれたのですが、このような英語の省略ってよく聞くんですけど、この場合なんで省略できるんですか?

Aベストアンサー

 「busy in ...ing」や「spend in ...ing」は、1900年代前半までは実際に使われていた用法です。

 Mrs Joe was prodigiously busy in getting the house ready for the festivals of the day. (Dickens)

 I have spent my life in finding that out. (Galsworthy)

 そもそも「in」という前置詞の後で用いられていたわけですから、その当時は当然「動名詞」と考えられていたはずです。その意味では、先生の言われていることは全くの的外れでもないでしょう。

 確かに「動名詞」と「現在分詞」は区別が難しいのですが、英英辞典で「gerund」を調べると「a noun in the form of the present participle of a verb」とされていますので、native speakerにもそれなりの違いは認識されているのだと思われます。

 ただし、現代においては「in」が用いられることはほとんどなくなっていますので「in」を用いた場合には非常に古臭い印象を与えます。例えば、日本語で「私は忙しゅうございました。」という表現は理解できないわけではありませんが、わざわざそのような言い方をする人はほとんどいないでしょう。それと似た感じではないでしょうか。

 なお、今では「go ...ing」で定着している表現も、もとをたどれば「go for ...ing」の「for」が取れた形だと言われています。

 ご参考になれば・・・。

 「busy in ...ing」や「spend in ...ing」は、1900年代前半までは実際に使われていた用法です。

 Mrs Joe was prodigiously busy in getting the house ready for the festivals of the day. (Dickens)

 I have spent my life in finding that out. (Galsworthy)

 そもそも「in」という前置詞の後で用いられていたわけですから、その当時は当然「動名詞」と考えられていたはずです。その意味では、先生の言われていることは全くの的外れでもないでしょう。

 確かに「動名詞」と「現在分詞」は区別が...続きを読む

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

Q惑星直列 2009年2月14日

2月14に惑星が直列すると人から聞いたのですが、
どの惑星が直列するのでしょうか?

Aベストアンサー

こちらで確認してみてください。
http://www.heavens-above.com/planets.aspx?lat=35.700&lng=139.767&loc=Tokyo&alt=20&tz=JapST
#並んでいるようには見えないですが・・・

Q入力した年月日が過去か現在か未来かを表示するプログラム その2

実は、
http://oshiete1.goo.ne.jp/qa4722681.html
これは添削問題だったんですね。
まず自分がある一部分しかソースコードを記述しなかったのがいけなかったのかもしれませんが、添削問題の解答は以下のようなものでした。

//「SimpleDateFormat」クラスを活用できていませんよ。
//上記ままだと、処理のタイミングによっては現在日付を入力しても
//違う日付と判断されてしまいますよ。(秒まで管理しているものが比較対照のため)
//以下のよう少しシンプルに記述することが出来ますよ。

で、問題のところですね。

//フォーマット形式を設定します。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//Dateクラスに変換したコンソール日付を年月日形式に整形します。
String result1 =sdf.format(myCal.getTime());
Calendar myToday = Calendar.getInstance();
//Dateクラスに変換した現在日付を年月日形式に整形します。
String result2 =sdf.format(myToday.getTime());
if (result1.compareTo(result2)== 0) {
System.out.println("現在日付と同じ日付です。");
}else if (result1.compareTo(result2)> 0){
System.out.println("現在日付よりも後の日付です。");
}else if (result1.compareTo(result2)< 0){
System.out.println("現在日付よりも前の日付です。");

やはり<>=のような比較演算子を使うみたいです。
でも、compareTo()メソッドは初めて知りました。
後、どういう計算で0より大きいのか、小さいのかを表すのかは、未だに分かりません。
before()メソッドとafter()メソッドを使うよりいいんですかね。
分かる方がいましたら、教えて頂けると大変有り難いです。
どうぞ宜しくお願い致します。
後、ソースコードとかで足りない部分がありましたら言って下さい。
その部分は補足のところに書かせてもらいます。

実は、
http://oshiete1.goo.ne.jp/qa4722681.html
これは添削問題だったんですね。
まず自分がある一部分しかソースコードを記述しなかったのがいけなかったのかもしれませんが、添削問題の解答は以下のようなものでした。

//「SimpleDateFormat」クラスを活用できていませんよ。
//上記ままだと、処理のタイミングによっては現在日付を入力しても
//違う日付と判断されてしまいますよ。(秒まで管理しているものが比較対照のため)
//以下のよう少しシンプルに記述することが出来ますよ。

で、問題...続きを読む

Aベストアンサー

この問題は「SimpleDateFormat」を勉強した後に
「SimpleDateFormat」を使って解けという問題なのかな?

次のような回答でOKかな?

compareToを使っているif文において
20090101よりも20090201の方が未来である
という判定は
文字列の並び順で
20090101よりも20090201の方が後に来るという
性質を利用して判定しているのだ。
年月日を表している文字列が
あくまで同じ桁数だから、
というのが前提条件だけど。
--ここまで--ここからちょっと愚痴--

勉強としては、正直あまりお勧めできない実装。
まったくオブジェクト指向的じゃないし。
オブジェクト指向的に解決するなら
beforやafterを使うべき。
正直なとこ、こんな問題初心者にやらせるなよと言いたい。

ただ、ひとつの判定の手段として
日付を文字列に置き換えて
文字列の順序の前後の判定を利用する方法もある
と覚えておけばいいよ。
実際良く使われるけどね。
前述したけど、年月日を表している文字列が
同じ桁数だから、というのが前提条件。



で、compareToというメソッドは
オブジェクトに順序を決定づけるための
Comparableインターフェースの持つメソッドだよ。

s1.compareTo(s2) の結果は
0より大きい、0、0より小さいのいずれかで
0より大きい場合、s1はs2より後ろにあるという意味。
0より小さければ、s1はs2より前にあるという意味。
0ならばs1とs2は同じ位置にあるという意味。

Comparableはそのうち勉強するといいよ。


ちなみにbefore,afterはCalendarだけじゃなくDateでもできる。
もちろんDateでcompareToもあるよ。
日付の比較なんだから、こっちがいいね。
まあ、設問じゃ仕方ないけど。

この問題は「SimpleDateFormat」を勉強した後に
「SimpleDateFormat」を使って解けという問題なのかな?

次のような回答でOKかな?

compareToを使っているif文において
20090101よりも20090201の方が未来である
という判定は
文字列の並び順で
20090101よりも20090201の方が後に来るという
性質を利用して判定しているのだ。
年月日を表している文字列が
あくまで同じ桁数だから、
というのが前提条件だけど。
--ここまで--ここからちょっと愚痴--

勉強としては、正直あまりお勧めできない実...続きを読む

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング