03-日付を操ろう

日付を使ったプログラムを作ろうと思ったとき、
ややこしい!と思ったことはありませんか?
毎月31日までだったらよかったのに・・・とか、
せめてうるう年がなかったらよかったのに・・・とか。

まぁ組もうと思ったら組めますが、
最近の言語ではそんなもの自分で組む必要はありません。

以下にある日の○日後の日付を返すプログラムを示します。
なんかに使ってね♪

Java編

Javaでは日付を扱うのに、java.util.Calendarクラスを使います。
エラーチェックのためのcal.setLenient(false)がミソかも。
あ、あと月は1月が0、2月が1というふうになっているのでご注意を。
Javaドキュメント(Calendarクラス)

★ソース

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class CalendarTest{
	public static void main(String args[]){

		//表示用フォーマット
		SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日(E)");
		
		try{
			//パラメータ取得
			int year = Integer.parseInt(args[0]);
			int month = Integer.parseInt(args[1])-1;
			int day = Integer.parseInt(args[2]);
			int num = Integer.parseInt(args[3]);

			//カレンダーインスタンス作成
			Calendar cal = Calendar.getInstance();
			//こうすると変な日付を入れると例外を投げる
			cal.setLenient(false);

			//入力した日付を設定
			cal.set(year, month, day);
			System.out.println(df.format(cal.getTime()));

			System.out.println(num+"日後は・・・");

			//num日進める
			cal.add(Calendar.DATE, num);
			System.out.println(df.format(cal.getTime()));
		}
		//args[0],args[1]などから発生
		catch(ArrayIndexOutOfBoundsException e){
			System.out.println("引数が足りません。");
			System.out.println("java CalendarTest <年> <月> <日> <何日後?>");
		}
		//Integer.parseInt()から発生
		catch(NumberFormatException e){
			System.out.println("パラメータは数字を入力してください。");
			System.out.println("java CalendarTest <年> <月> <日> <何日後?>");
		}
		//Calendar.setから発生(たぶん)
		catch(IllegalArgumentException e){
			System.out.println("入力日付が正しくありません。");
		}
		//その他
		catch(Exception e){
			System.out.println("その他のエラー");
			e.printStackTrace();
		}
	}
}

★実行結果

E:\Java\test>java CalendarTest 2003 2 29 1
入力日付が正しくありません。

E:\Java\test>java CalendarTest 2003 2 28 1
2003年02月28日(金)
1日後は・・・
2003年03月01日(土)

PHP編

PHPはもっと簡単でmktimeにむりやりつっこんでやれば勝手に変換してくれます。
ので日付のチェックはcheckdateという別の関数を使います。
年月日の順番はJavaとは異なります。注意。(なんでなんやろ。)
PHPマニュアル(日付・時刻関数)

★ソース

<?php
function calendarTest($year, $month, $day, $num){
	//日付チェック
	if(!checkdate($month, $day, $year)){
		echo('日付が正しくありません。<br>');
		return;
	}
	//入力した日付作成
	$date = mktime(0, 0, 0, $month, $day, $year);
	echo(date('Y/m/d D', $date).'<br>');
	
	echo($num.'日後は・・・<br>');
	
	//num日進める
	$date = mktime(0, 0, 0, $month, $day+$num, $year);
	echo(date('Y/m/d D', $date).'<br>');
}

calendarTest(2003, 2, 29, 1);
echo('<br>');
calendarTest(2003, 2, 28, 1);
?>

★実行結果

日付が正しくありません。

2003/02/28 Fri
1日後は・・・
2003/03/01 Sat

ASP.NET編

とってもJavaっぽくなりました。
Javaとは違うものとして、TimeSpan?構造体と「+」演算子なんかを使うのもおもしろいかもしれません。
(Javaは演算子のオーバーロードができないからなぁ)
あと、AddDays辺りのメソッドは、自分自身は変更せず、変更した新しいDateTime?型を返します。
このあたりは「クラス」ではなく「構造体」であることに関係しているのかもしれません。
(詳しくは.NETをお勉強してね☆)
.NETFrameworkクラスライブラリ(DateTime構造体)
.NETFrameworkクラスライブラリ(TimeSpan構造体)

★ソース

<html>
<script language="C#" runat="server">

private void BtExe_Click(object sender, EventArgs e){
	try{
		int year = Int32.Parse(TbYear.Text);
		int month = Int32.Parse(TbMonth.Text);
		int day = Int32.Parse(TbDay.Text);
		int num = Int32.Parse(TbNum.Text);
		
		DateTime dt = new DateTime(year, month, day); 
		dt = dt.AddDays(num);

		//こんなんもアリですね。
		//TimeSpan ts = new TimeSpan(num, 0, 0, 0);
		//dt += ts;

		LbRes.Text = dt.ToString("yyyy年MM月dd日(ddd)");
	//Int32.Parseから発生
	}catch(FormatException ex){
		LbRes.Text = "数字を入力してください。";
	//new DateTimeから発生
	}catch(ArgumentOutOfRangeException ex){
		LbRes.Text = "入力日付が正しくありません。";
	}catch(Exception ex){
		LbRes.Text = "その他のエラー (" + ex.Message + ")";
	}
}
</script>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>日付フォーマット</title>
</head>
<body>
<form runat="server">
<asp:TextBox id="TbYear" runat="server" width="40" MaxLength="4" style="text-align:right"/>年
<asp:TextBox id="TbMonth" runat="server" width="20" MaxLength="2" style="text-align:right"/>月
<asp:TextBox id="TbDay" runat="server" width="20" MaxLength="2" style="text-align:right"/>日の
<asp:TextBox id="TbNum" runat="server" width="50" MaxLength="10" style="text-align:right"/>日後は・・・
<asp:Button id="BtExe" runat="server" text="計算" onClick="BtExe_Click"/>
<asp:Label id="LbRes" runat="server" />
</form>
</body>
</html>

★実行結果

[2003]年[ 3]月[29]日の[  1]日後・・・[計算] 入力日付が正しくありません。
[2003]年[ 3]月[28]日の[  1]日後・・・[計算] 2003年03月01日(土)

感想・質問等どうぞ


Tag: Tips Java PHP .NET


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-22 (土) 21:06:19 (731d)
.NET Ajax AmazonWebServices Android C# C++ CMS Cacoo DB Exam Generics Java JavaScript Local Oracle PHP Perl Photo Programming Pukiwiki Python Qt Review Ruby SQLServer Seasar Software Tips Tool VB WebService Windows WindowsMobile XHTML XML XMLMaster XSLT game pdf wkhtmltopdf