2つの日付間の年月日を表示するプログラムを作成しているのですが上手くいきません
例えば2000/1/1から2000/12/31の経過期間を出した場合、本来なら1年丁度にしたいのですが、1年と1日になってしまいます
ですがこれが2000/1/1から2003/12/31だと丁度4年となったりしてしまい、上手くいく場合と上手くいかない場合がまちまちで困っています
以下はプログラムからprint関連を抜いたものです
<?php
$date = "2000/1/1";
$date2 = "2003/12/31";
//対象日と今日の日付をそれぞれ配列に格納
$Sday = split("/", $date);
$Lday = split("/", $date2);
//日付を計算用にタイムスタンプ(ミリ秒)へ変換
$SdayTime = mktime(0,0,0,$Sday[1] , $Sday[2] , $Sday[0]);
$LdayTime = mktime(0,0,0,$Lday[1] , $Lday[2] , $Lday[0]);
//2つの日付間の差(ミリ秒)を計算
$diffTime = $LdayTime - $SdayTime ;
//○年○ヶ月○日と表示したい場合
$diffYMD = (date("Y",$diffTime ) - 1970) . "year" . (date("m",$diffTime ) - 1) . "month" . (date("d",$diffTime )) . "day";
//print $diffYMD . "\n";
$diffY = (date("Y",$diffTime ) - 1970);//期間・年
$diffM = (date("m",$diffTime ) - 1);//期間・月
$diffD = (date("d",$diffTime ));//期間・日
if ($diffD < "10"){
$diffD = ltrim($diffD,"0");
}
if ($diffD == "31" && $diffM == "11"){
$diffD = 0;
$diffM = 0;
$diffY = $diffY + 1;
}
if ($diffM == 0 && $diffD == 0){
$diffYY = $diffY;
} else {
$diffYY = $diffY + 1;
}
?>
No.4ベストアンサー
- 回答日時:
カレンダー関数の cal_to_jd を使い、下記のようにしてみました。
うるう年の有無にかかわらず経過期間計算ができるはずです。ご確認ください。
----------------------------
<?php
$date = "2000/1/1";
$date2 = "2000/12/31";
//対象日と今日の日付をそれぞれ配列に格納
$Sday = split("/", $date);
$Lday = split("/", $date2);
//ユリウス通日を求める
$jd0 = cal_to_jd(CAL_GREGORIAN, $Sday[1] , $Sday[2] , $Sday[0]);
$jd1 = cal_to_jd(CAL_GREGORIAN, $Lday[1] , $Lday[2] , $Lday[0]);
$dd = $jd1 - $jd0 + 1;
$yy = 365.25;//1年の平均日数
$mm = 365.25 / 12;//1月の平均日数
//経過年・月・日
$diffY = (int)($dd / $yy);
$diffM = (int)(($dd - ($year2 * $yy)) / $mm);
$diffD = (int)($dd - ($year2 * $yy) - ($month2 * $mm));
?>
No.2
- 回答日時:
ANo.1で確認を求めた者です。
連投で申し訳ありませんが、もう1つ確認させてください。
たとえば2007年3月1日~2008年2月28日は365日ですが、~2008年2月29日は366日になります。どちらを1年としますか?
<?php
echo 'ccc ';
if (function_exists(cal_to_jd)) echo 'abc ';
else echo 'def';
?>
日本語の部分を書き換えたのですが、 ccc abc と表示されました
両方1年丁度としたいのですが無理でしょうか?
閏年だけ366日で1年、それ以外は365日で1年で換算するようにしたいのです。
No.1
- 回答日時:
原因はうるう年の計算をしていないことです。
まず、ご利用のPHP処理系がカレンダー関数をサポートしているかどうか、下記のスクリプトで確認をしてください。カレンダー関数が有無によって、書くべきスクリプトの量が大幅に変わりますので。
---------------------------
<?php
echo 'カレンダー関数';
if (function_exists(cal_to_jd)) echo 'あり';
else echo 'なし';
?>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Excel(エクセル) エクセルの数式で教えてください。 3 2022/12/22 17:29
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Visual Basic(VBA) swiftで年号を 1 2023/02/05 06:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
昨日の日付を取得するVBscript
-
開始と終了を指定して、その間...
-
Accessコンボボックス
-
改行されないカレンダー(PHP)
-
経過期間計算がうまくいかない
-
PHPでn日後を計算したい
-
プルダウンメニューの値をDBに...
-
差分の月数を算出する方法
-
今日の日付から1週間のリスト
-
MySQLのdate型をphpで○年○月○日...
-
現在時刻をyyyymmddhhmmss形式...
-
date関数で、曜日を日本語表示...
-
MYSQLの日付から現在までの年数...
-
ESXiのdateコマンドについて
-
ファイル名に日付の挿入
-
アップロードしたファイル名に...
-
C言語でシステム日付との差を...
-
DBから昨日以前の日付のデータ...
-
md5について
-
Dosブロンプトでtabを出力したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
開始と終了を指定して、その間...
-
ファイル名に日付の挿入
-
昨日の日付を取得するVBscript
-
PHPで以下のような占いプログラ...
-
C言語を使って、ある特定の日の...
-
substrの使い方について教えて...
-
一週間の表示の仕方と文字表示
-
アップロードしたファイル名に...
-
第何週かを取得したい
-
プルダウンメニューの値をDBに...
-
PHPでカレンダーを作る(縦書き)
-
日付によって画像を変える
-
差分の月数を算出する方法
-
SQL:TIMESTAMPの期間検索を指...
-
C言語でシステム日付との差を...
-
PHP 指定した期間だけ表示した...
-
プルダウンで今日以降の日付を...
-
Accessコンボボックス
-
MovableTypeで、ある日付を過ぎ...
-
Java Scriptで、ある日付に加算...
おすすめ情報