2021.05.28

時計の短針と長針の角度

角度の計算方法

ここでは、アナログ時計の短針長針の間の角度を計算する方法を説明します。

時間を0以上の整数、分を0~59の整数で与えて角度を計算します。

計算する角度は、短針を時計周り(右周り)に回していき、長針に追いつく角度です。例えば9:00場合は90度、3:00の場合は270度となります。

短針長針の間の角度は、長針短針角度をそれぞれ求めて、その2つの角度の差から計算します。針の角度は0:00を基準とし、時計回り(右回り)をプラスとします。

それでは、短針長針のそれぞれの角度の計算方法を解説していきます。

短針は、時の単位を表す針で0時(12時)~11時を表します。この針は、12時間で1回転(360度)するので、1時間では30度回転します(360/12=30)。1分間では0.5度回転します(30/60=0.5)。

長針は、分の単位を表す針で0~59分を表します。1時間(60分)で1回転(360度)するので、1分間では6度回転します(360/60=6)。

上記の内容をまとめると以下の計算式になります。

短針角度の計算式

	短針の角度=(360÷12)×時+ (360÷12÷60)×分

長針角度の計算式

	長針の角度=(360÷60)×分

短針長針との間の角度は、

	短針と長針との間の角度=長針の角度-短針の角度

で計算します。この値がマイナスになった場合、360を足します。

Javaソースコード

以下は、上記の計算を行うJavaソースコードです。時間と分はそれぞれキーボードで入力します。

ClockHandtoDegree.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
import java.util.Scanner;

public class ClockHandtoDegree {
	// 短針(the hour-hand)の角度を時と分から計算
	// 角度は0時を0度として時計回りにプラス
	// 計測不能時は、-1.0を戻す
	static double getHourHandDeg( int hour, int minute )
	{
		// 時が0未満の場合-1.0を戻す(エラー)
		if ( 0 > hour ) return -1.0;

		// 分が0未満の場合-1.0を戻す(エラー)
		if ( 0 > minute ) return -1.0;

		// 分が59を超える場合-1.0を戻す(エラー)
		if ( 59 < minute ) return -1.0;

		// 時間を0~12に変換
		hour = hour % 12;

		// 時から計算した短針の角度
		double hh_deg;
		hh_deg = ( 360.0 / 12.0 ) *  (double)hour;

		// 分から計算した長針の角度
		double mh_deg;
		mh_deg = ( 360.0 / 12.0 / 60.0 ) *  (double)minute;

		// 結果を戻す
		return hh_deg + mh_deg;
	}


	// 長針(the minute-hand)の角度を分から計算
	// 角度は0分を0度として時計回りにプラス
	// 計測不能時は、-1.0を戻す
	static double getMinuteHandDeg( int minute )
	{
		// 分が0未満の場合-1.0を戻す(エラー)
		if ( 0 > minute ) return -1.0;

		// 分が59を超える場合-1.0を戻す(エラー)
		if ( 59 < minute ) return -1.0;

		// 結果を戻す
		return ( 360.0 / 60.0 ) *  (double)minute;
	}


	// 短針→長針の時計周りの角度を計算
	// 計測不能時は、-1.0を戻す
	static double getClockHandDeg( int hour, int minute )
	{
		// 短針の角度
		double hh_deg = getHourHandDeg( hour, minute );
		if ( 0.0 > hh_deg ) return -1.0;

		// 長針の角度
		double mh_deg = getMinuteHandDeg( minute );
		if ( 0.0 > mh_deg ) return -1.0;

		// 短針→長針の角度
		double clock_deg = mh_deg - hh_deg;

		// 計算結果がマイナスの場合、360を足してプラスにする
		if ( 0.0 > clock_deg )
			clock_deg += 360.0;
			
		return clock_deg;
	}


	// メイン
	public static void main( String[] args ) {
		// 整数の値をキーボードから入力
		Scanner scanner = new Scanner( System.in );

		// 時間の入力
		System.out.print( "時間を整数で入力してください:" );
    		String h = scanner.next();
		int hour = Integer.parseInt( h );

		// 分の入力
		System.out.print( "分を整数で入力してください:" );
    		String m = scanner.next();
		int minute = Integer.parseInt( m );
		
		// 短針→長針の角度を計算
		double clock_deg = getClockHandDeg( hour, minute );

		// 結果出力
		System.out.println( "時刻: " + hour + ":" + minute );
		System.out.println( "角度: " + clock_deg );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis ClockHandtoDegree.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac ClockHandtoDegree.java

実行

C:\talavax\javasample>java ClockHandtoDegree

実行結果

時間を整数で入力してください: 10
分を整数で入力してください: 10
時刻 10:10
角度 115.0

10時10分の短針長針との間の角度115.0が出力されています。

Javaソースコードの解説

ここからは、このソースコードを上から順番に解説していきます。

001
import java.util.Scanner;

Javaクラスライブラリの中から「java.util.Scanner」というパッケージにあるクラスを使うために記述しています。

003
public class ClockHandtoDegree {

クラス名を、ClockHandtoDegreeとしています。

004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
	// 短針(the hour-hand)の角度を時と分から計算
	// 角度は0時を0度として時計回りにプラス
	// 計測不能時は、-1.0を戻す
	static double getHourHandDeg( int hour, int minute )
	{
		// 時が0未満の場合-1.0を戻す(エラー)
		if ( 0 > hour ) return -1.0;

		// 分が0未満の場合-1.0を戻す(エラー)
		if ( 0 > minute ) return -1.0;

		// 分が59を超える場合-1.0を戻す(エラー)
		if ( 59 < minute ) return -1.0;

		// 時間を0~12に変換
		hour = hour % 12;

		// 時から計算した短針の角度
		double hh_deg;
		hh_deg = ( 360.0 / 12.0 ) *  (double)hour;

		// 分から計算した長針の角度
		double mh_deg;
		mh_deg = ( 360.0 / 12.0 / 60.0 ) *  (double)minute;

		// 結果を戻す
		return hh_deg + mh_deg;
	}

短針角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。

引数hourは、hour = hour % 12;によって0~11の値に変換しています。例えばhour=23の場合、23 % 12 = 11となります。

034
035
036
037
038
039
040
041
042
043
044
045
046
047
	// 長針(the minute-hand)の角度を分から計算
	// 角度は0分を0度として時計回りにプラス
	// 計測不能時は、-1.0を戻す
	static double getMinuteHandDeg( int minute )
	{
		// 分が0未満の場合-1.0を戻す(エラー)
		if ( 0 > minute ) return -1.0;

		// 分が59を超える場合-1.0を戻す(エラー)
		if ( 59 < minute ) return -1.0;

		// 結果を戻す
		return ( 360.0 / 60.0 ) *  (double)minute;
	}

長針角度を計算するメソッドです。引数に分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。

050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
	// 短針→長針の時計周りの角度を計算
	// 計測不能時は、-1.0を戻す
	static double getClockHandDeg( int hour, int minute )
	{
		// 短針の角度
		double hh_deg = getHourHandDeg( hour, minute );
		if ( 0.0 > hh_deg ) return -1.0;

		// 長針の角度
		double mh_deg = getMinuteHandDeg( minute );
		if ( 0.0 > mh_deg ) return -1.0;

		// 短針→長針の角度
		double clock_deg = mh_deg - hh_deg;

		// 計算結果がマイナスの場合、360を足してプラスにする
		if ( 0.0 > clock_deg )
			clock_deg += 360.0;
			
		return clock_deg;
	}

短針長針の間の角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し角度を求めます。

短針角度を求めるメソッドgetHourHandDegと、長針角度を求めるメソッドgetMinuteHandDegから戻された角度の差を計算し、その値がマイナスの場合に360を足してプラスにしています。

073
074
	// メイン
	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

075
076
		// 整数の値をキーボードから入力
		Scanner scanner = new Scanner( System.in );

標準入力System.inを使って、Scannerクラスのscanを初期化しています。

078
079
080
081
		// 時間の入力
		System.out.print( "時間を整数で入力してください:" );
    		String h = scanner.next();
		int hour = Integer.parseInt( h );

printメソッドで、"時間を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。

nextLineメソッドで、キーボードから入力された1行を読み取り、String型のhに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。

IntegerクラスのparseIntメソッドで、文字列hを整数hourに変換しています。

083
084
085
086
		// 分の入力
		System.out.print( "分を整数で入力してください:" );
    		String m = scanner.next();
		int minute = Integer.parseInt( m );

printメソッドで、"分を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。

nextLineメソッドで、キーボードから入力された1行を読み取り、String型のmに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。

IntegerクラスのparseIntメソッドで、文字列mを整数minuteに変換しています。

088
089
		// 短針→長針の角度を計算
		double clock_deg = getClockHandDeg( hour, minute );

短針長針の間の角度を計算するメソッドを呼び出しています。計算結果は、double型変数clock_degに代入されます。

091
092
093
		// 結果出力
		System.out.println( "時刻: " + hour + ":" + minute );
		System.out.println( "角度: " + clock_deg );

結果をコンソール出力しています。

以上です。

関連コンテンツ

与えられた任意の角度を0°から360°に収めるメソッドの作り方を説明します。

2016.02.21

キーボードを使って値を入力する方法を解説しています。ソースコード付きです。

2020.08.19

メソッドの定義方法を詳しく解説しています。Javaのサンプルソースコードを使った説明もあります。

2020.03.23

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

条件式を判断して処理を分岐する方法を詳しく説明しています。

2023.03.20

割り算で割り切れずに残った端数を剰余(余り)といいます。この剰余の計算をJavaのソースコードを使って解説しています。

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

国際単位系における角度の単位のラジアンについて説明しています。興味のある方は、記事をご覧ください。

2016.01.26

自然数と整数って何が違う?

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

キーボードから文字列を入力する方法を詳しく説明しています。

2015.11.03

Integerクラスについて、ソースコードを使って詳しく説明しています。

2020.03.23

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告