1ヶ月後の日付を出力したいのですが
$tomorrow = mktime (0,0,0,date("m")+1,date("d"),date("Y"));

phpマニュアルで上記のようなものを使って、
1970年1月1日からの通算秒を得ることが出来ましたが
それとlocationtimeを使ってどうにか1ヶ月後の年月日を出せるようなのですが…

やり方がどうしても分かりません。
いろいろ試したんですが、どつぼにハマって行くだけで…。


すみません、誰か助け舟を出して下さい

お願いします

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

A 回答 (2件)

LocationTimeという関数は知りませんがUNIXtimeまで取得できているんであれば後もう少しです。



UNIXtime形式から変換する関数は既に使われている関数であるdate()関数です。
マニュアル(参考URL)を良く読んでみてください。第2引数が省略可能であり、省略した場合は現在時刻が使用される、とありますがここにUNIXtimeを引数として与えるとUNIXTimeの時間を第一引数にしたがってフォーマットします。
つまり上で取得された$tomorrowを第2引数に与えてやれば良いのです。

$tomorrow = mktime (0,0,0,date("m")+1,date("d"),date("Y"));

を実行後

$next_month = date("Y-m-d", $tomorrow);

としてやれば$next_monthに"yyyy-m-dd"の書式で来月の日付が取得できる「かもしれません」

ここからが重要です。なぜ「かもしれない」のでしょうか?
重要なのは「一月後の日付」という言葉の定義です。
「次の月」というのは12月を除いて現在の月に1を足した月になります。
ですが「一月後」というのは次の月と同義ではありません。
考えてみてください。たとえば今日がx年1月30日だったとしましょう。
一月後の日というのはいつでしょう?月に1を足した日?
やってみましょう。X年2月30日・・・さてカレンダーを見てみましょう。どの年のカレンダーを見ても2月の30日という日は存在しませんよね?
要するにこういうことが起こってしまうわけです。
実際には2月30日をmktime関数に与えてやれば融通を利かせてくれるため閏年では3月1日、そうでなければ3月2日になると思います(実際に試してません。環境が手元に無いので・・・申し訳ない)
これは別に1月に限った話ではなくだいたいの奇数月では31日まであるため31日に実行されると次の月は30日までなため2月後の1日が「一月後の日付」として帰ってくる事になります。

要するに「一月後の日付」、という言葉の定義を厳密に定義してあげなければどこかで感覚的におかしい結果が返る事になります。というわけでまずは「一月後の日付」というものを明確に定義する事が必要でしょう。

参考URL:http://www.php.net/manual/ja/function.date.php
    • good
    • 0
この回答へのお礼

長文を書いて頂き本当にありがとうございました!!

ちゃんと隅から隅まで読ませてもらいました。

まずはじめにお詫びを…
Unixからの時間取得はlacationtimeではなくlacaltimeの間違いでした。

date関数でunixスタンプタイムをY-M-Dに変換できるんですね。
知りませんでした…f(^_^;)

>実際には2月30日をmktime関数に与えてやれば融通を利かせてくれるため閏年では3月1日、そうでなければ3月2日になると思います

はい、ご推測の通りの日付が返ってきました。
月の定義はすでに決まっているので、それを本文の方にしっかり書くべきでしたね
反省。。。

これでようやく前進できそうです。
ありがとうございました。

お礼日時:2001/11/12 09:56

目的がわからないので適しているかどうかわかりませんが、


3.0.12以降のPHPで利用できる関数に strtotime というのがあります。

% cat strtotime.php
#!/usr/bin/php -q
<?
echo date("Y-m-d", strtotime("+1 month"))."\n";
?>

% php strtotime.php
2001-12-10

こんな強力な関数が何の準備もせずに利用できるのには驚きですね。
来週の木曜日とかも可読性を保ったままで記述できるんですよね。
    • good
    • 0
この回答へのお礼

たったこれだけでも取得できるんですね。
なにやら頭の中がこんがらがっていたのにすっきりしてしまいました。

この方法は使えますね。。。
もし今回使わなくてもいずれ絶対に使う日がきます。

本当に助かりました♪
ありがとうございました。

あと、自宅PCが壊れているために返事が遅れたことをお二方に
お詫び申し上げます。


またなにかありましたら宜しくお願いします!

お礼日時:2001/11/12 10:00

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

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

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

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

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

QEXCELにて、同一日付であれば空白にしたい

EXCELにて、同一日付であれば空白にしたい
EXCELにて、同一日付であれば空白にしたいのですが、できればVBAを使用せず実現したい。
ヒントをお願いします

Aベストアンサー

回答No2です。ダブった日付を白文字にするときにページが変わったところで空白になるのは避けたいとのことでしたらページの区切りを求める関数はありませんので、例えば1ページが49行で50行のところが次のページになるなどのことが判っていればA2セルから下方を選択してからの条件付き書式の設定で入力する式は次のようにすることでよいでしょう。

=AND(MOD(ROW(),50)<>0,A2=A1)

Qdateやmktimeやgetdateなどでエラー

<?php
print "a";
echo rand(1,10);
?>
とかはちゃんと表示されるのですが、
dateやmktimeやgetdateなどを使うとエラーが出てしまいます。
サンプルコードは参考書通りなので間違っていないと思うのですが、
サーバー側の問題なのでしょうか。サーバーはapache2.4でローカルで使っています。

<?php
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>

Warning: mktime() [function.mktime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\apache\htdocs\a.php on line 4

Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\apache\htdocs\a.php on line 4
2006-04-05T01:02:03+09:00


<?php
$today = getdate();
print_r($today);
?>

Warning: getdate() [function.getdate]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for '9.0/no DST' instead in C:\apache\htdocs\a.php on line 2
Array ( [seconds] => 6 [minutes] => 44 [hours] => 23 [mday] => 11 [wday] => 6 [mon] => 2 [year] => 2012 [yday] => 41 [weekday] => Saturday [month] => February [0] => 1328971446 )

<?php
print "a";
echo rand(1,10);
?>
とかはちゃんと表示されるのですが、
dateやmktimeやgetdateなどを使うとエラーが出てしまいます。
サンプルコードは参考書通りなので間違っていないと思うのですが、
サーバー側の問題なのでしょうか。サーバーはapache2.4でローカルで使っています。

<?php
echo date('c', mktime(1, 2, 3, 4, 5, 2006));
?>

Warning: mktime() [function.mktime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or...続きを読む

Aベストアンサー

正確にはエラーじゃなく「警告(warning)」です。
で、メッセージは読みました?
「It is not safe to rely on the system's timezone settings」で検索したら、原因と対処がいくらでも見つかりますよ。

最近追加されたようなので、古い参考書には載っていないのかもしれません。

QWORD差し込み印刷:日付の処理 - EXCELが空欄だと今日の日付が差し込まれてしまう

WORDの差し込み印刷について質問させてください。

EXCELのデータで日付を入れている列があります。この列に空欄がある(つまり日付が入力されていない)と、差し込み先のWORDのほうで、今日の日付が出てしまいます。

EXCELのデータが空欄の場合には、WORDの方に今日の日付を出さない(空欄のままにしておく)方法はありますか?

OSはWinXP, WORDとEXCELは2003を使っています。

よろしくお願いします。

Aベストアンサー

Word2002で確認したところ、質問と同じようになりました。
フィールドコードについては詳しくありませんが、消すことができました。
日付が空欄のところの差し込みフィールドでマウス右クリックしてフィールドコードの表示/非表示をクリックして表示させると
{MERGEFIELD"フィールド名"}となっていると思います。
1方法はココの”フィールド名"を削除すれば日付は表示されません。
もう一つの方法はフィールドを右クリックしてフィールドの編集を選択します。「フィールド」ダイアログボックスが現れます。
フィールドの種類から「差し込み印刷」を選択し、フィールドの名前から「If」を選択して条件式を入力する。
フィールドコードは
「If 式1 演算子 式2 Trueの場合の文字列 Falseの場合の文字列」
ここに
「If 日付のフィールド名<>"" "yyyy/mm/dd" ""」
というのを入力したところ表示されないようになりました。
日付のフィールドがブランクでない場合はyyyy/mm/dd、そうでなければブランクという条件式です
差し込みの1枚目のフィールドで条件式を入れておけば、日付空欄のところはすべて空欄にできると思います。
試しにチャレンジしてみて下さい。

Word2002で確認したところ、質問と同じようになりました。
フィールドコードについては詳しくありませんが、消すことができました。
日付が空欄のところの差し込みフィールドでマウス右クリックしてフィールドコードの表示/非表示をクリックして表示させると
{MERGEFIELD"フィールド名"}となっていると思います。
1方法はココの”フィールド名"を削除すれば日付は表示されません。
もう一つの方法はフィールドを右クリックしてフィールドの編集を選択します。「フィールド」ダイアログボックスが現れます。
...続きを読む

Q$test = array(80,60,22,50,75);を(22,60,80,50,75);変更

https://oshiete.goo.ne.jp/qa/9231613.html から
 $test = array(0=>80,1=>60,2=>22,3=>50,4=>75); のご回答をもとに
$test = array(80,60,22,50,75);を$test = array(22,60,80,50,75);に変更しました。
 結果が”最高得点22です。”と予想しておりました・・しかし、変わらずに
 ”最高得点は80です。”のままでした!?この場合ですが、考え方はとしまして、
 $test = array(2=>22,1=>60,0=>80,3=>50,4=>75);となったので、以上の結果となっ
との考えで間違いないでしょうか?
 よろしくお願いいたします。

Aベストアンサー

表現は未熟ではありませんが、Campus2さんがどのような思考をしているのかという意味で
国語の問題に近いと言っただけですのでご了承を〜

ちなみに今回のはキーに関しては何でもいいのです。
以下のコードでも最高点は80と出力されます。

<?php
//$test = array(80,60,22,50,75);
$test = array("apple"=>80,"tomato"=>60,"banana"=>22,"milk"=>50,"cake"=>75);

$max = 0;

foreach($test as $id => $value){
if($max < $value) $max = $value;
}

print "<p>最高得点{$max}です。</p>";
?>

また$id => $valueも関係性を示しているだけなので、
foreach文は以下のようにも記述できます(紛らわしいのでこんな書き方しませんが)。

foreach($test as $aaa => $bbb){
if($max < $bbb) $max = $bbb;
}

///////////////////////////////////////////

過去の質問
https://oshiete.goo.ne.jp/qa/9200257.html
でも答えましたが、

例えば配列
array("22","80", "75","60","50")
はキーを何も指定しない場合以下と同じになります。
array('0' =>"22",'1' =>"80", '2' =>"75",'3' =>"60",'4' =>"50");

array("50","80", "75","60","22")
と並び変えても
array('0' =>"50",'1' =>"80", '2' =>"75",'3' =>"60",'4' =>"22");
のままです。

表現は未熟ではありませんが、Campus2さんがどのような思考をしているのかという意味で
国語の問題に近いと言っただけですのでご了承を〜

ちなみに今回のはキーに関しては何でもいいのです。
以下のコードでも最高点は80と出力されます。

<?php
//$test = array(80,60,22,50,75);
$test = array("apple"=>80,"tomato"=>60,"banana"=>22,"milk"=>50,"cake"=>75);

$max = 0;

foreach($test as $id => $value){
if($max < $value) $max = $value;
}

print "<p>最高得点{$max}です。</p>";
?>

また$id => $value...続きを読む

QExcelで日付を入力したら締日を表示させる

Excelで経費の支払いの表を作ろうとしています。

A列のセルに日付を入力し、
A列に入力した日付が1日~15日までなら
B列のセルにその月の最終日の日付を
16日~31日までなら
B列に翌月の15日と自動で表示されるようにするには
どうすればいいのでしょうか?


詳しい方、教えてください。
ちなみに使用しているExcel2010です。

Aベストアンサー

ごめ。よく読んだら半月ずれてましたな。

=IF(DAY(A1)<15,DATE(YEAR(A1),MONTH(A1)+1,1)-1,DATE(YEAR(A1),MONTH(A1)+1,15))

MONTH(A1)+1で「13月」とか出てきちゃいそうですが、Excelはちゃんと「翌年1月」と計算しなおしてくれますから大丈夫です。

Q[0];[1];ですが、配列の要素か添え字に該当する部分の[0]と[1]ですが

以下のプログラムで教えていただけないでしょうか
<!DOCTYPE html>
<html><head>
<title>P222 Sample7-7 小計を求める関数</title>
</head><body><?php
$product = array(array(100,5),array(20,16),array(25,40));
?>
<table border="2">
<tr bgcolor="#AAAAAA">
<th>単価</th>
<th>個数</th>
<th>小計</th>
</tr>
<?php
for($i=0; $i<3; $i++){
$p = $product[$i][0];
$n = $product[$i][1];
$t = total($p, $n);
print "<tr><td>{$p}円</td><td>{$n}個</td><td>{$t}円</td></tr>\n";
}
function total($pr,$n)
{
return $pr*$n;
}
?>
</table></body></html>
-------------------------------------------------------------------------------------------
以上ですが、
for($i=0; $i<3; $i++){
$p = $product[$i][0];
$n = $product[$i][1];
 の部分の[0];[1];ですが、配列の”要素”か”添え字”に該当する部分の[0]と[1]ですが
 どんな働きがあるのでしょうか?
 以上よろしくお願いいたします。

以下のプログラムで教えていただけないでしょうか
<!DOCTYPE html>
<html><head>
<title>P222 Sample7-7 小計を求める関数</title>
</head><body><?php
$product = array(array(100,5),array(20,16),array(25,40));
?>
<table border="2">
<tr bgcolor="#AAAAAA">
<th>単価</th>
<th>個数</th>
<th>小計</th>
</tr>
<?php
for($i=0; $i<3; $i++){
$p = $product[$i][0];
$n = $product[$i][1];
$t = total($p, $n);
print "<tr><td>{$p}円</td><td>{$n}個</td><td>{$t}円</td></tr>\n";
}
...続きを読む

Aベストアンサー

> $product = array(array(100,5),array(20,16),array(25,40));
これは、視覚的に表すと、以下のようなことです。

$product
 [0]
  [0] ⇒ 100
  [1] ⇒ 5
 [1]
  [0] ⇒ 20
  [1] ⇒ 16
 [2]
  [0] ⇒ 25
  [1] ⇒ 40

二次元配列なので、添字は2つ指定して、初めて目的の値を得ることができます。
[0]、[1]という指定は、おまじないでもなんでもなく、目的の値を得るための添字になります。

つまり、
$product[0][0]は100
$product[0][1]は5
$product[1][0]は20
$product[1][1]は16
$product[2][0]は25
$product[2][1]は40
ということになります。

QEXCELの日付データの比較

EXCELの日付データについての質問です。

たとえば、あるテキストデータでH20.7.19とあったとします。
それとEXCELの日付データにもH20.7.19があったとします。

テキストデータのH20.7.19をEXCEL側に貼り付け、EXCELの日付データH20.7.19と比較させ、答え0(誤差0)を返してもらう方法はありますでしょうか?

宜しくお願いいたします。

Aベストアンサー

こんにちは
DAYS360(開始日,終了日,方式)という関数で日数の差異を
求められます。

A1にテキストデータ H20.7.19
A2にエクセルデータ H20.7.19

があったとします。
=DAYS360(A1,A2)
で差異が0で返ってきます。 0じゃ無かったら別のものですね。

方式はヨーロッパ方式(TRUE)、アメリカNASD方式(FALSE)とか
書いてありましたが、違いはようわかりませんww
付けなくてもいいかとw

適当ですが、ご参考まで^^;

Qmktimeについて教えてください

今、日付の差を出すプログラムを作っているのですが

mktime()関数では
1970年~2038年までしか
対応していないことがわかりました

mktime()以外で
日付を Unix のタイムスタンプとして取得する
関数ってありますか?

Aベストアンサー

>mktime()関数では
>1970年~2038年までしか
>対応していないことがわかりました

これは、mktime関数の問題というよりは、UNIXTIMEを32bit符号付整数であらわす際には常に生じる制約です。
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C

日付の差を求めるには、GregorianToJDという関数が使えます。
http://jp.php.net/manual/ja/function.gregoriantojd.php
これを使えば、BC4714年~AD9999年まで扱えます。

Qexcel,word 印刷した日の日付

excel,word文書を印刷したとき、その印刷日の日付を印字させるためにはexcel,word各々
どのようなことをすればよかったでしょうか。

Aベストアンサー

<Excelでの編集方法>
 メニューの「ファイル」-「ページ設定」で
 「ヘッダー/フッター」タブを選択。
 上に表示したい場合は「ヘッダーの編集」ボタン。

 編集画面の上に「日付の挿入」ボタン(カレンダーみたいなボタン)があるので
 それを押せば日付入力できます

<Wordでの編集方法>
 メニューの「表示」-「ヘッダー/フッター」を選択すると
 ヘッダーとフッターが点線で囲まれます。
 お好きなほうを選択し「日付の挿入」ボタンを押せば表示されるようになりますよ。

Q日付の計算をmktimeの仕様にしたい

こんにちは。下のような実行ソースプログラムを作ったのですが、

<?php
  echo("2005/1/29の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,29,2005) )."<BR>" );
  echo("2005/1/30の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,30,2005) )."<BR>" );
  echo("2005/1/31の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,31,2005) )."<BR>" );
?>

実行結果において
> 2004/1/30の1ヶ月後:20040301
> 2005/1/29の1ヶ月後:20050301
> 2005/1/30の1ヶ月後:20050302
のような不具合が出てしまいます。どう直してよいものか行き詰ってしまっているので、どなたかアドバイスを宜しくお願いします。

基本形はfunction_exという関数を作って↓
function mktime_ex(...) {

  例外処理
  必要に応じて return

 // その他は、標準機能に任せる
 return mktime( sec, min, hour, ... );
}
という形にしたいと思っています。
宜しくお願いします。

こんにちは。下のような実行ソースプログラムを作ったのですが、

<?php
  echo("2005/1/29の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,29,2005) )."<BR>" );
  echo("2005/1/30の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,30,2005) )."<BR>" );
  echo("2005/1/31の1ヶ月後:". date( "Ymd",
mktime(0,0,0,1+1,31,2005) )."<BR>" );
?>

実行結果において
> 2004/1/30の1ヶ月後:20040301
> 2005/1/29の1ヶ月後:20050301
> 2005/1/30の1ヶ月後:20050302
のような不具合が出てし...続きを読む

Aベストアンサー

#1補足>ようは、月末の日の数を超えた場合は、月末の日の数にするということみたいなので、以下の様にすればいいかと思います。
※mktimeは、本来引数を省略できるので、本当は、引数を省略した場合の処理をしないといけないですが、サンプルでは、そのような処理はしていません。
function mktime_ex($hour,$minute,$second,$month,$day,$year){
$monthDay = array(31,28,31,30,31,30,31,31,30,31,30,31);
if(($year % 400 == 0) || (($year % 4 == 0) && ($year % 100 != 0))){
$monthDay[1]=29; //閏年
}
if($day>$monthDay[$month-1]){//指定された月の日の数より大きい時
$day=$monthDay[$month-1];//その月末の日の数にする
}
return mktime( $hour,$minute,$second,$month,$day,$year);
}

#1補足>ようは、月末の日の数を超えた場合は、月末の日の数にするということみたいなので、以下の様にすればいいかと思います。
※mktimeは、本来引数を省略できるので、本当は、引数を省略した場合の処理をしないといけないですが、サンプルでは、そのような処理はしていません。
function mktime_ex($hour,$minute,$second,$month,$day,$year){
$monthDay = array(31,28,31,30,31,30,31,31,30,31,30,31);
if(($year % 400 == 0) || (($year % 4 == 0) && ($year % 100 != 0))){
$monthDay[1]=29; //閏年
...続きを読む


人気Q&Aランキング

おすすめ情報