プロが教えるわが家の防犯対策術!

Javaで“前月”の年月(YYYYMM形式)を取得するロジックを組んだのですが、
以下のコードを実行すると、前月の月が1桁の場合に、「YYYYM」(5桁)の形式になってしまいます。
(元がintなので当然かも知れませんが。)

Calendar calendar = Calendar.getInstance();
String yearMonth =
String.valueOf(calendar.get(Calendar.YEAR)) + String.valueOf(calendar.get(Calendar.MONTH) - 2);

こちら、解決する方法はありますでしょうか?
※他に気掛かりな点としては、2012年の1月に実行した時に、正しく「201112」を返してくれるか、というのもあります。

また、別の実装方法として、以下の場合は「YYYYMM形式」で取得出来るのですが、
“前月”に変換する方法が分かりませんでした。。。

Calendar calendar = Calendar.getInstance();
String yearMonth2 =
new SimpleDateFormat("yyyyMM").format(calendar.getTime());


ロジックはシンプルである方が助かります。
分かる方、教えて下さい!

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Calendar calendar = Calendar.getInstance();


calendar.add( Calendar.MONTH, -1 );
String lastMonth = new SimpleDateFormat( "yyyyMM" ).format( calendar.getTime() );

Javaの開発をするなら、Javadoc くらい読めるようになりましょうね。
    • good
    • 2
この回答へのお礼

ありがとうございます!
Javadoc、慣れないんすよねぇ。。

お礼日時:2011/10/13 12:57

2番目の方法で9分9厘出来てます。

後は、文字列にする前に Calendar オブジェクトの状態を Calendar.add を使って一月分前にするだけです。
http://java.sun.com/javase/ja/6/docs/ja/api/java …
http://www.techscore.com/tech/Java/JavaSE/Utilit …

この回答への補足

ご回答ありがとうございます!

ただ、試してみたのですがどのようにaddメソッドをいれたらいいのか分からず。。

補足日時:2011/10/13 10:47
    • good
    • 0

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

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

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

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

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...続きを読む

QString型の日付(2005/11/25)の比較

Java初心者です。String型で2005/11/25 のように2つString型で日付を取得したときに、大小の比較をしたいのです。どういう方法が考えられますか?よろしくお願いします。

Aベストアンサー

書式がyyyy/mm/ddで決め打ちならば他の方が書かれているとおりString#compareTo()で充分でしょう。
yyyy/m/dなど書式が不定の場合には、java.text.DateFormatを利用してjava.util.Dateに変換して比較するか、/で文字列を分解し、年・月・日を抽出してそれぞれを比較するなどが考えられます。

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文字取り出せばできると思いますが。

QDate型オブジェクトから日付のみ取得し、Integer型にしたい

Date型のオブジェクトから日付(ddの部分)を取得し、
その取得した日付をInteger型に変換して、Integerオブジェクトに入れたいのですが・・
うまく説明できないですが、例えば
「2002/8/12」の値を持つDate型オブジェクトから、
日付の「12」を取得し、Integer型オブジェクトに入れる→new Integer(12);
という事をしたいんです。

Date型オブジェクトから日付のみ取得する方法を
ご存知の方、教えて下さい。

Aベストアンサー

No1の回答に対してレスします。

その方法は、やるべきではありません。
現在はそのやり方で問題ないかもしれませんが、toString()型は今後のJDKバージョンアップで同じ値が返される保証がありません。

詳しくはJAVADOC Calendar型

Qある年月の前月(月の開始日)を取得する方法を教えて下さい。

ある年月から、その前月(月の開始日)を取得する方法を教えて下さい。
例えば、「2003年7月」の前月は、「2003年6月」ですが、
その月の開始日「2003年6月1日」を取得する方法を教えて下さい。
「2003年7月」を表すDate型オブジェクトを引数にして、
「2003年6月1日」を取得したいです。
言語はJavaです。
よろしくお願いします。

Aベストアンサー

奇遇ですね。
私もちょうどそういう処理をやったんですよ。
最適な方法かわかりませんが、

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateTest {

public static void main(String[] args) {
System.out.println(getDate().toString());
}

public static Date getDate(){
Calendar cal = GregorianCalendar.getInstance();
cal.setTime(new Date());
cal.set(2003,cal.get(Calendar.MONTH)-1,cal.getActualMinimum(Calendar.DATE));
return cal.getTime();
}
}

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

Q文字列を日付に変換でParseException

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(8,10);
sgndate = DateFormat.getDateInstance().parse(lstdaysgn); ・・・・・・・・・ここでエラー発生
}

どこが悪いのか解りません。
よろしくご教授ください。

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(...続きを読む

Aベストアンサー

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろん後続のルーチンでnullチェックは要るようになる。
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
// ↓これもしない。
// lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
//                              lstdaysgn.substring(8,10);
sgndate = new SimpleDateFormat("yyyyMMdd").parse(lstdaysgn); // スラッシュつけずに8桁のyyyyMMddでそのままDateにする。
}

以上の手直しにより、このルーチンを通る際にDate 1つとString 7つ、インスタンスの生成を回避する事ができる。これがループで処理されるならなおさら。
仮に、「new SimpleDateFormat("yyyyMMdd")だとパースのたびにSimpleDateFormatのインスタンスが作られちゃうジャン!」と思うならルーチン化していいと思うけど、その場合はスレッドセーフなルーチンにしないといけないのでそこらへん注意の事。

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろ...続きを読む

QStringBufferからStringへキャストする

StringBufferからStringへキャストする方法としてどちらを用いるのが一般的なのでしょうか
StringBuffer sb
として
public String ***(***)メソッドの最後に

1. return sb.toString()とする
2. return new String(sb)とする

私は1を使っていたのですが、
Javaの規約だか処理能力が良い方法だかに
厳しい人が2を使っていたので少し戸惑う程度ですが…
回答よろしくお願いします。

Aベストアンサー

toString()メソッドは全てのClassのスーパクラスであるObjectクラスのメソッドです。
その他のクラスのtoString()メソッドは、これをオーバライドしたに過ぎません。
toString()メソッドの用途はそのオブジェクトを視覚的にあらわすときに利用します。オブジェクトのダンプイメージです。
今回はStringBufferクラスのtoString()メソッドのためダンプイメージがStringそのもののため問題ありませんが、
「Stringにキャストする」と明示的に処理するには2を使用するのが正解と思います。
格クラスのtoString()メソッドはDEBUGで画面やファイルに出力するときに使用すると考えたほうが賢明と思います。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


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

人気Q&Aランキング