マンガでよめる痔のこと・薬のこと

Java初心者(プログラム初心者)です。

if文やfor文の練習で、キーボードから西暦を入力すると和暦に変換してくれるプログラムを作成したいのですが、何か参考になるサイトや、例になるものはありますか?

また、調べてみるとこういったプログラムの多くは、『和暦クラスJapaneseImperialCalendar(?)』などを使用しているのですが、よく仕組みがわかりません…

使用しているバージョンは 1.8.0_74です。osはMac OSXです。
テキストエディットとターミナルで手打ちしています。

始めたばかりでよく理解できていないところがありますが、どなたか詳しい方教えてください。

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

A 回答 (2件)

以下の資料を基に、西暦から和暦への変換表を作ると良いでしょう。


飛鳥時代の元号空白期間と、南北朝時代の元号並存には気をつけてください。
https://ja.wikipedia.org/wiki/元号一覧_(日本)

以下の機能と if/for 構文を活用すれば、
入力値の西暦日付から和暦年号への変換表が
実装できると思いますので頑張ってください。

今日の西暦日付オブジェクトを得る
http://docs.oracle.com/javase/jp/8/docs/api/java …
指定日の西暦日付オブジェクトを得る
http://docs.oracle.com/javase/jp/8/docs/api/java …
http://docs.oracle.com/javase/jp/8/docs/api/java …
日付オブジェクト同士を比較する
http://docs.oracle.com/javase/jp/8/docs/api/java …
    • good
    • 1

えっと。

。。(^^;
とりあえずGoogleで「Java 和暦」で検索してみてください。
検索結果一覧の上位にあるページを幾つか覗き、内容を理解できない部分があったら具体的に何処が分からないかを示してください。
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

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

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

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

Q西暦 -> 年号、年号 -> 西暦の変換をするには?

こんにちは!

Javaのクラスで”Calender”とか”DateFormat”というクラスで
西暦から和暦とかに変換しようとしてみたんですが、
うまくいきません。

使用方法が間違っているのか、使うクラスが違うのか、
もし知ってる方がいらっしゃいましたら、
教えてください。

Aベストアンサー

xinmanです。
稚拙なコードですがこんなクラスでいかがでしょうか?

import java.util.*;

public class Wareki {
/*明治*/
private static final int I_MEIJI= 1868;
private static final int I_MEIJI_M= 9;
private static final int I_MEIJI_D= 8;
/*大正*/
private static final int I_TAISHOU= 1912;
private static final int I_TAISHOU_M= 7;
private static final int I_TAISHOU_D= 30;
/*昭和*/
private static final int I_SHOUWA= 1926;
private static final int I_SHOUWA_M= 12;
private static final int I_SHOUWA_D= 25;
/*平成*/
private static final int I_HEISEI= 1989;
private static final int I_HEISEI_M= 1;
private static final int I_HEISEI_D= 8;

private String strGengou = null;
private Date date = null;

/*コンストラクタ*/
/*int iY西暦年*/
/*int iM月*/
/*int iD日*/
public Wareki(int iY,int iM,int iD){
setSeireki(iY,iM,iD);
}
/*コンストラクタ*/
/*int strG和暦元号*/
/*int iY和暦年*/
/*int iM月*/
/*int iD日*/
public Wareki(String strG,int iY,int iM,int iD){
setWareki(strG,iY,iM,iD);
}
/*西暦設定*/
/*int iY西暦年*/
/*int iM月*/
/*int iD日*/
public void setSeireki(int iY,int iM,int iD) {
strGengou = new String("明治以前");
if((iY>I_MEIJI)||(iY==I_MEIJI&&iM>I_MEIJI_M)||(iY==I_MEIJI&&iM==I_MEIJI_M&&iD>=I_MEIJI_D)){
strGengou = new String("明治");
}
if((iY>I_TAISHOU)||(iY==I_TAISHOU&&iM>I_TAISHOU_M)||(iY==I_TAISHOU&&iM==I_TAISHOU_M&&iD>=I_TAISHOU_D)){
strGengou = new String("大正");
}
if((iY>I_SHOUWA)||(iY==I_SHOUWA&&iM>I_SHOUWA_M)||(iY==I_SHOUWA&&iM==I_SHOUWA_M&&iD>=I_SHOUWA_D)){
strGengou = new String("昭和");
}
if((iY>I_HEISEI)||(iY==I_HEISEI&&iM>I_HEISEI_M)||(iY==I_HEISEI&&iM==I_HEISEI_M&&iD>=I_HEISEI_D)){
strGengou = new String("平成");
}
this.date = new Date(iY-1900,iM-1,iD);
}
/*和暦設定*/
/*int strG和暦元号*/
/*int iY和暦年*/
/*int iM月*/
/*int iD日*/
public void setWareki(String strG,int iY,int iM,int iD) {
if(strG.equals("明治")){
iY = iY + I_MEIJI - 1;
}else if(strG.equals("大正")){
iY = iY + I_TAISHOU - 1;
}else if(strG.equals("昭和")){
iY = iY + I_SHOUWA - 1;
}else if(strG.equals("平成")){
iY = iY + I_HEISEI - 1;
}
strGengou = new String("明治以前");
if((iY>I_MEIJI)||(iY==I_MEIJI&&iM>I_MEIJI_M)||(iY==I_MEIJI&&iM==I_MEIJI_M&&iD>=I_MEIJI_D)){
strGengou = new String("明治");
}
if((iY>I_TAISHOU)||(iY==I_TAISHOU&&iM>I_TAISHOU_M)||(iY==I_TAISHOU&&iM==I_TAISHOU_M&&iD>=I_TAISHOU_D)){
strGengou = new String("大正");
}
if((iY>I_SHOUWA)||(iY==I_SHOUWA&&iM>I_SHOUWA_M)||(iY==I_SHOUWA&&iM==I_SHOUWA_M&&iD>=I_SHOUWA_D)){
strGengou = new String("昭和");
}
if((iY>I_HEISEI)||(iY==I_HEISEI&&iM>I_HEISEI_M)||(iY==I_HEISEI&&iM==I_HEISEI_M&&iD>=I_HEISEI_D)){
strGengou = new String("平成");
}
this.date = new Date(iY-1900,iM-1,iD);
}
/*和暦元号取得*/
public String getStrGengou(){
return strGengou;
}
/*和暦年取得*/
public int getIWarekiYear(){
int iY = this.date.getYear() + 1900;
if(getStrGengou().equals("明治")){
iY = iY - I_MEIJI + 1;
}else if(getStrGengou().equals("大正")){
iY = iY - I_TAISHOU + 1;
}else if(getStrGengou().equals("昭和")){
iY = iY - I_SHOUWA + 1;
}else if(getStrGengou().equals("平成")){
iY = iY - I_HEISEI + 1;
}
return iY;
}
/*西暦年取得*/
public int getISeirekiYear(){
return this.date.getYear() + 1900;
}
/*月取得*/
public int getIMonth(){
return this.date.getMonth() + 1;
}
/*日取得*/
public int getIDate(){
return this.date.getDate();
}
}

xinmanです。
稚拙なコードですがこんなクラスでいかがでしょうか?

import java.util.*;

public class Wareki {
/*明治*/
private static final int I_MEIJI= 1868;
private static final int I_MEIJI_M= 9;
private static final int I_MEIJI_D= 8;
/*大正*/
private static final int I_TAISHOU= 1912;
private static final int I_TAISHOU_M= 7;
private static final int I_TAISHOU_D= 30;
/*昭和*/
private static final int I_SHOUWA= 1926;
private static final int I_SHOUWA_M= 12;
...続きを読む

Q和暦クラスについて

西暦から和暦に変換できるプログラムを勉強して開発したいのですが

例20120705 →  平成24年7月5日

javaでなにか良い和暦クラスがありますでしょうか??
サンプルコード等あれば助かります。
よろしくお願いします。

Aベストアンサー

http://ideone.com/BfabA

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

Q数字か文字列かを判定する関数

 JAVAの初心者です、宜しくお願いします。
  
 テキストボックスに入力された値を、数字か文字列かを判定する関数ってありますか、VBでは「isNumeric」とかがあるのですが、JAVAではヒットしませんでした。

 どこからどのように調べるのでしょうか。
 いいサイトがあれば教えて下さい。

Aベストアンサー

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parseInt(num);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
------------------------------------------------------------
結果
true
false
------------------------------------------------------------
実数の場合は、Double.parseDouble(String s)があります。
これも、例外(NumberFormatException)を発生します。

・ たとえば、整数か文字列かの場合、クラスIntegerのparseInt(String s)メソッドを使い、例外(NumberFormatException)が発生するかどうかで判断します。

以下のコードを参考にしてみてください。
------------------------------------------------------------
public class ParseIntSample {

public static void main(String[] args) {
System.out.println(isInteger("123"));
System.out.println(isInteger("123A"));
}

static boolean isInteger(String num) {
try {
int n = Integer.parse...続きを読む

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

Qjavascriptで入力フォームに日付(和暦)を入力して西暦表示にする方法と曜日を表示させる方法を教えて下さい。

凄く悩んでいるのですが、良かったら教えてください。
入力フォームに

日付 平成16年07月28日なら
『160728』 と入力し、そのすぐ横に
曜日を『(月)』と表示させたい
のですが、どうもうまくいきません。
教えてください。
以前教えていただいた西暦「20040728」
と入力したら、(水)と出たのですが、
和暦入力の場合でわからなくて、困っています。

テキストフォームに(月)と表示させたいのでは
なく、<span>タグを使用して作成したいのです。

また、和暦を『160728』入力したら、
表示先には、西暦「20040728」と表示させる
には、どうしたらいいでしょうか?

ご伝授お願いします。

Aベストアンサー

以前の回答のjavascriptを少し変更しただけですけど。#1の方がおっしゃる通り、1988をたしてみました。これだと平成しか対応してませんが。

<HTML><BODY>
<INPUT TYPE="TEXT" VALUE="" onKeyUp="if(this.value.length == 6) document.all['spnDay'].innerHTML = getDay(this.value);"><SPAN ID="spnDay"></SPAN>
<SCRIPT>
var STR_DAY = new Array("日", "月", "火", "水", "木", "金", "土");
var i;
function getDay( yymmdd ) {

var year = yymmdd.substring(0, 2) -(-1988);
var month = yymmdd.substring(2, 4) -1;
var date = yymmdd.substring(4, 6);

var month2 = yymmdd.substring(2,4);

var yyyymmdd = year + month2 + date;
var dateValue = new Date();
dateValue.setFullYear(year, month, date);

return STR_DAY[dateValue.getDay()]+yyyymmdd;

}
</SCRIPT>
</BODY></HTML>

以前の回答のjavascriptを少し変更しただけですけど。#1の方がおっしゃる通り、1988をたしてみました。これだと平成しか対応してませんが。

<HTML><BODY>
<INPUT TYPE="TEXT" VALUE="" onKeyUp="if(this.value.length == 6) document.all['spnDay'].innerHTML = getDay(this.value);"><SPAN ID="spnDay"></SPAN>
<SCRIPT>
var STR_DAY = new Array("日", "月", "火", "水", "木", "金", "土");
var i;
function getDay( yymmdd ) {

var year = yymmdd.substring(0, 2) -(-1988);
var month = yy...続きを読む

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は、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

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一定のスペースを空けて端を揃えて表示

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

Aベストアンサー

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-...続きを読む

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&Aランキング