任意の期間(自~至)を指定して、
その間の日付を1日単位で取得したいのですが
うまい方法が思いつきません。
こうすれば簡単だというアルゴリズムがあれば
教えてください。

例)
開始日 $start '2005/06/29'
終了日 $end '2005/07/02'
というデータがあれば
2005/06/29
2005/06/30
2005/07/01
2005/07/02
を取得したいのです。

A 回答 (2件)

#1の方のアルゴリズムで全く問題ないのですが、


strtotimeは日本人の私には扱いづらいので、
mktimeを良く使っています。

<?php
// 入力データ
$start = "2005/06/29";
$end = "2005/07/02";
// UNIXタイムスタンプ取得
list($sy,$sm,$sd) = explode("/",$start);
list($ey,$em,$ed) = explode("/",$end);
$su = mktime(0,0,0,$sm,$sd,$sy);
$eu = mktime(0,0,0,$em,$ed,$ey);
// 1日の秒数
$sec = 60 * 60 * 24;// 60秒 × 60分 × 24時間
// 日付取得
$key = 0;
for ( $i = $su;$i <= $eu;$i += $sec ) {
$dates[$key] = date("Y/m/d",$i);
$key ++;
}
// 表示
print_r($dates);
?>

以上、ご参考までに。
    • good
    • 0
この回答へのお礼

サンプルまで作成していただきありがとうございます。

こちらでは
mkdateを使用して通算秒数に変換しているという事
ですね。

ループが簡潔にできていてこんな事が出来るのかと
驚いています。

予想以上に簡単に出来ました。ありがとうございます。

お礼日時:2005/06/21 14:49

時間が無いので、方法論だけ書きます。



1)strtotime関数を使って、開始日の通算秒を取得します。

2)1日は86400秒ですから、取得した通算秒に86400を足していくと、1日ずつ日付がずれていきます。

3)86400足すたびに、date関数を使って、日付文字列を取得します。

4)通算秒が、終了日の数値に追いつくまで、この処理を繰り返します。

と、こんな感じではないでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

通算の秒数はdate関数で元の日付形式に
戻せるのですね。

簡単なロジックで実現できそうです。

お礼日時:2005/06/21 14:29

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

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

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

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

QjQueryのdatepickerの日付が選択できないバグについて

こんにちは。

jQuery初心者です。datepickerをスマホページに設置しているのですが、カレンダーボタンをクリックするとカレンダー自体は表示されるのですが、日付を選択することができません。
(日付をタップしても何も起こりません)
ただPCで同じスマホページを確認してみると、問題なく日付を選択することができます。
なぜスマホで見たときだけこのような現象が起こるのか全く分からず、困っています・・。

これだけの情報で大変恐縮なのですが、もし心当たりのある方がいらっしゃれば教えて頂けると本当に助かります。

よろしくお願いいたします。

Aベストアンサー

こんにちは

スマホに関してはさっぱりなので、ほとんどが推測になりますが・・・

PCとスマホではイベントが異なるために反応していない可能性があります。
また、iOSとandroidでも挙動が異なる部分があるようです。(少し古い情報ですが)
http://masawada.hatenablog.jp/entry/2015/05/13/224320

そんなことも併せて考えると、jQueryMobileに対応したライブラリを用いる方がOSやブラウザの差を吸収しやすいのではないかと想像します。
ちなみに、ANo1様がご提示のjQueryサイトのデモは、androidでは動作しますね。(iphoneは手元にないので不明です)

簡単に検索してみたら、datepickerに近いものでjQueryMobile対応のこんなのもあるようです。
まず、動作するかを見てみるのが宜しいかと。
http://d.hatena.ne.jp/Kimura/20120728/p1

Q$str=preg_replace('/\u3000/','  ',$str);

によってutf-8の空白文字をhtmlの空白文字に変換しようとしたのですがエラーになります
どうしたらいいのでしょうか?

Aベストアンサー

>そもそも?のところにコード表現で空白文字を入力する手段はないのでしょうか?
\xE3\x80\x80
で一応いいかと思いますが…

Q入力オートフォーマットで「日付」について

Word2000を使っています。
オートコレクト→入力オートフォーマットで「日付」のチェックを
オン、オフに切り換えた時の違いがよくわからないのですが。
調べてみると、「入力した日付に自動的に [日付] スタイルを設定する」
とありますが、この意味も私にはよくわかならくて…。
どなたかご存知の方、宜しくお願いします。

Aベストアンサー

ツールバーを右クリックして、「書式設定」ツールバーを表示させておきます。
オートフォーマットの日付チェックをオフにして、文書に適当な日付を入力してEnterし、オンにしてまた日付を入力してEnterしてみてください。見た目は変わらないかもしれませんが、それぞれをクリックすると、書式設定ツールバーの表示が「標準」と「日付」で違うと思います。これは「スタイル」というものです。
スタイルを使うと、段落や文字の書式をワンタッチであらかじめ決めておいた書式に変更できます。

参考URL:http://support.microsoft.com/default.aspx?scid=/directory/worldwide/ja/kblight/T010/2/64.asp

Q'2/1'を'02/01'に変換

するため

<?php
$x=preg_replace("|(\d\d)/(\d\d)|",sprintf("%02d/%02d",$1,$2),'2/1');
echo"$x<br>";
?>

としましたがエラーになりうまくいきません
どうしたらうまくいくでしょうか?

Aベストアンサー

直接は、うまくいかないみたいです。
<?php
preg_match("|(\d\d?)/(\d\d?)|",'2/1',$matches);
$x=sprintf("%02d/%02d",$matches[1],$matches[2]);
echo "$x<br>";
?>
ではどうでしょう?

QExcelの同一フォーマットのシートを別シート(日付順)にまとめたいんです。

支店ごとの販売状況の日報をまとめたいのですが、私ごときのExcel初
心者では理解不能です。ご指導のほどよろしくお願いします。
できればExcelの機能で出来ればと思っています。
accessの方がよいのであればそちらでもかまいません。

○同一Book内でSheetが4つあります。
Sheet2(西東京市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
  1/3│11:02│大分類│中分類│小分類│・・・・│・・・・
Sheet3(小金井市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
  1/2│08:02│大分類│中分類│小分類│・・・・│・・・・
Sheet4(武蔵野市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
  1/5│14:54│大分類│中分類│小分類│・・・・│・・・・
Sheet5(三鷹市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
  1/4│12:33│大分類│中分類│小分類│・・・・│・・・・
であるとき
Sheet1(支店合計)には4つの支店の日付・時間順
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
   1/2│08:02│大分類│中分類│小分類│・・・・│・・・・
1/3│11:02│大分類│中分類│小分類│・・・・│・・・・
1/4│12:33│大分類│中分類│小分類│・・・・│・・・・
   1/5│14:54│大分類│中分類│小分類│・・・・│・・・・
と並べ替えた結果が欲しいのです。
よろしくお願いします。

支店ごとの販売状況の日報をまとめたいのですが、私ごときのExcel初
心者では理解不能です。ご指導のほどよろしくお願いします。
できればExcelの機能で出来ればと思っています。
accessの方がよいのであればそちらでもかまいません。

○同一Book内でSheetが4つあります。
Sheet2(西東京市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・・・・│・・・・
  1/3│11:02│大分類│中分類│小分類│・・・・│・・・・
Sheet3(小金井市)のフォーマットが
  日付│時間│大分類│中分類│小分類│・...続きを読む

Aベストアンサー

エクセルで自動的に、指定したシートに累積してくれる操作はないと思います。
#1のご回答のように、今まで累積した最終行次の行を人間が判断して、貼り付けることになります。
初心者ということで、ふさわしくないかも知れませんが、
上記をプログラム(エクセルVBA)にやらせると、下記のようになります。
Sub test07()
m = 2 '見出しの行数
For i = 2 To Worksheets.Count 'シート枚数だけ繰り返し
MsgBox Worksheets(i).Name
Worksheets(i).Activate 'i 番目のシートを選択
Range("A1").CurrentRegion.Select 'データ領域を選択
Selection.Offset(m).Resize(Selection.Rows.Count - m).Select '見出しを除いて
Selection.Copy ' コピー
Worksheets(1).Activate '一番左のシートに
Worksheets(1).Range("A65536").End(xlUp).Offset(1, 0).Select '最終行の次行を選択
ActiveSheet.PasteSpecial '貼り付け
Next i '繰り返し
End Sub
興味があればやってみてください。
累積するシート(内容は見出しだけのシート)を挿入-ワークシートで挿入し、そのシートタブを一番左に持ってくること。
ツール-マクロ-VBEの画面で、挿入-標準モジュールで出る画面に
上記コード部分を貼り付け。F5キーを押して実行。
あとソートは人手の操作でしてください。VBAでもできますが略。
各シートの見出しを2行に仮定してますが、コードの中のm=2の部分を
実情に合わせて、m=1やm=3などに変えてください。

エクセルで自動的に、指定したシートに累積してくれる操作はないと思います。
#1のご回答のように、今まで累積した最終行次の行を人間が判断して、貼り付けることになります。
初心者ということで、ふさわしくないかも知れませんが、
上記をプログラム(エクセルVBA)にやらせると、下記のようになります。
Sub test07()
m = 2 '見出しの行数
For i = 2 To Worksheets.Count 'シート枚数だけ繰り返し
MsgBox Worksheets(i).Name
Worksheets(i).Activate 'i 番目のシートを選択
Range("A1").CurrentReg...続きを読む

Qpreg_match( '/^(\D+)(\d*)$/' , $変数 , $regs )

if( ! preg_match( '/^(\D+)(\d*)$/' , $変数1 , $regs ) )
{echo ( 'invalid dirname: ' . htmlspecialchars( $変数1 ) );}
$変数2 = $regs[2] === '' ? '' : intval( $regs[2] ) ;

正規表現だと思うのですが、どういう意味か教えてください。

□分からないなりに考えてみました…
▽1行目
$変数の内容が、'/^(\D+)(\d*)$/'にマッチしなければ、$regs へ代入。
▽2行目
マッチしていた場合は、htmlspecialchars関数を実行した後、'invalid dirname: '+その結果を表示する。
▽3行目
$regs配列変数の1番目を、何かして、$変数2 へ代入する。

……誰か教えてください…。

Aベストアンサー

>どこら辺に問題ありそうでしょうか?

まずpreg_matchで$regsを生成していますが、マッチしないケース
すなわち「数字からはじまる文字列」の場合、$regsが未設定になります。
したがって$regs[2] === ''で評価すると$regsが未設定エラーになります。
またエラーレベルを下げた場合でも、$regs[2] === ''はfalseなので
数字ではない文字列をintvalで評価するため$変数2には0が代入されます。

やはりif分岐である程度場合分けをしっかりしてやらないといけないでしょう。
総じて$変数1に代入される文字列の想定を広げて、チェックしてやる必要があります。

また、仮にデータがきちんと通ったとして、$変数2は空文字か数字という
データ型が確定しないフローになっています
たしかにPHPは変数定義がいい加減ではありますが、あまりなんでも
かんでも入れればいいというものではありませんので、ある程度
変数の型が一律になるような工夫が必要だとおもいます。

Q日付フォーマット

テーブルから日付データを取得してフォーマットしたいのですがうまくいきません。
DATETIME型の項目に入っている日時(Y-m-d H:i:s)を取得してY/m/dにフォーマットしようと
$result = date("Y/m/d", $getdata);
としたところ、結果が
1970/01/01
となってしまいました。
$getdataには存在する日時(Y-m-d H:i:s)が入っている事を確認しています
正しくフォーマットするにはどうしたら良いのでしょうか?

Aベストアンサー

strtotime()で日付型に変換すれば大丈夫です

<?PHP
$getdata="2006-12-19 15:18:11";
$result = date("Y/m/d", strtotime($getdata));
print $result;
?>

Q日付をすべて2桁(07/02、 06/30)にしたい

a.html内にある日付のデーターを取ってきて日付をすべて2桁(もし 7/2 ならば 07/02 、6/30 ならば 06/30)にしたいのですが、なかなかうまくいきません。

自分で作ったプログラムa.phpでは最初の日付しか2桁になりませんでした。
-------------a.html---------------
<>06/25、7/2<>13:00~13:55<>あああああ<>
<>06/25、8/2<>19:00~20:00<>いいいいい<>
<>6/27<>19:00~21:48<>ううううううう<>
<>06/27、7/3、7/4、7/12<>19:58~20:54<>ええええええええ<>
<>7/1<>13:54~17:00<>おおおおおおお<>

--------------a.php----------------
<?
$filename = "a.html";
$filedata = @file($filename);
$filedata = @join("",$filedata);

preg_match_all('/(<>(.*?)<>.*<>.*<>)/',$filedata, $match);

for($i=0;$i<count($match[0]);$i++){
$match[2][$i] = explode("、", $match[2][$i]);
//////////この辺がうまくできない///////
for($m=0;$m<count($match[2][$i]);$m++){
$match[2][$i][$m] = explode("/", $match[2][$i][$m]);
$match[2][$i][$m][0] = sprintf("%02d", $match[2][$i][$m][0]);
$match[2][$i][$m][1] = sprintf("%02d", $match[2][$i][$m][1]);

$match[2][$i][$m] = $match[2][$i][$m][0]."/".$match[2][$i][$m][1];
$match[2][$i] = join("、",$match[2][$i]);
}
print $match[2][$i]."<br>";//←最後はこの形で表示できるようにしてもらいたいです//
}
?>
どなたか教えてください。m(_ _)m
よろしくお願いします。

a.html内にある日付のデーターを取ってきて日付をすべて2桁(もし 7/2 ならば 07/02 、6/30 ならば 06/30)にしたいのですが、なかなかうまくいきません。

自分で作ったプログラムa.phpでは最初の日付しか2桁になりませんでした。
-------------a.html---------------
<>06/25、7/2<>13:00~13:55<>あああああ<>
<>06/25、8/2<>19:00~20:00<>いいいいい<>
<>6/27<>19:00~21:48<>ううううううう<>
<>06/27、7/3、7/4、7/12<>19:58~20:54<>ええええええええ<>
<>7/1<>13:54~17:00<>おおおおおおお<>

...続きを読む

Aベストアンサー

まず、変数(配列)を使いまわし過ぎです。
初めのうちは、今回のようなバグを避けるためにも変数の使いまわしは避けたほうがよいでしょう。


何が悪いかというと、第2for文の$m==0のときのループで、

$match[2][$i] = join("、",$match[2][$i]);

の部分にて、$match[2][$i][1以降] がつぶれてしまっています。以下のように書き直すとよいでしょう。

<?
$filename = "a.html";
$lines = @file($filename);

foreach ($lines as $line) {
 $items = explode("<>", $line);
 $dates = explode("、", $items[1]);
 for($i=0; $i<count($dates); $i++) {
  list($mon, $day) = explode("/", $dates[$i]);
  $dates[$i] = sprintf("%02d/%02d", $mon, $day);
 }
 print join("、", $dates) ."<br>";

 // ※どうしてもmatchsで表示したいなら↑消してこっち↓
 // $match[2][$i] = join("、", $dates);
 // print $match[2][$i]."<br>";

}

?>

インデントに全角スペースを使っているのでコピペの際は注意してください。

まず、変数(配列)を使いまわし過ぎです。
初めのうちは、今回のようなバグを避けるためにも変数の使いまわしは避けたほうがよいでしょう。


何が悪いかというと、第2for文の$m==0のときのループで、

$match[2][$i] = join("、",$match[2][$i]);

の部分にて、$match[2][$i][1以降] がつぶれてしまっています。以下のように書き直すとよいでしょう。

<?
$filename = "a.html";
$lines = @file($filename);

foreach ($lines as $line) {
 $items = explode("<>", $line);
 $dates = explod...続きを読む

Qjquery.datetimepicker.jsの日付範囲について

jquery.datetimepicker.jsについて質問せて下さい。

お店の予約受付で使用しているのですが、当日の予約は受け付けないようにしたいのですが
オプション指定していても当日の予約が出来てしまう状態です。

色々検索してみたんですが、書いてある通りに記載してもうまくいきません。
知っている方、詳しい方がいらっしゃったら助けて頂けないでしょうか?

ソースはこちら http://xdsoft.net/jqplugins/datetimepicker/

jQuery(function() {
$('#datetimepicker').datetimepicker({

// minTime 時間フォーマット
// --------------------------------------------
minTime : '10:00', //受付開始時間
maxTime : '19:00', //終了時間

// language カレンダーの表示言語
// --------------------------------------------
// (デフォルト) 英語
lang:'ja', // カレンダー日本語化

// minDate 選択可能開始日
// --------------------------------------------
minDate: '+1d' //翌日から
});
});

上記は私が書いたオプションです。
よろしくお願いいたします。

jquery.datetimepicker.jsについて質問せて下さい。

お店の予約受付で使用しているのですが、当日の予約は受け付けないようにしたいのですが
オプション指定していても当日の予約が出来てしまう状態です。

色々検索してみたんですが、書いてある通りに記載してもうまくいきません。
知っている方、詳しい方がいらっしゃったら助けて頂けないでしょうか?

ソースはこちら http://xdsoft.net/jqplugins/datetimepicker/

jQuery(function() {
$('#datetimepicker').datetimepicker({

// minTime...続きを読む

Aベストアンサー

こんにちは
試してはいませんので、違っている可能性もありますが…

ご提示のページを見るとminDate:の設定書式には'+1d'のようなものは見当たらないようですけれど、この書式はどこから持ってきたのでしょうか?

正面からやるなら、今日の日付から明日を求めて、yyyy/mm/dd形式でオプション設定すれば良さそうですが、ご提示のサイトの例示を見ると
 '-1970/01/02'  // yesterday
 '+1970/01/02'  // tomorrow
のような表記があるので、こちらでいけるのではないでしょうか?
(Dateの上では -1(日)、 +1(日)のような感じになるので)

Q'2/1'を'02/01'に変換 (修正版)

keyguy するため

<?php
$x=preg_replace("|(\d+)/(\d+)|",sprintf("%02d/%02d",$1,$2),'2/1');
echo"$x<br>";
?>

としましたがエラーになりうまくいきません
どうしたらうまくいくでしょうか?

Aベストアンサー

2/2が02/02で表示さえすればよいのであれば

list ($month, $day) = split("/", "2/2");
$x = sprintf("%02s",$month) ."/". sprintf("%02s",$day);
echo $x;

こんな感じの やっつけ仕事で可能


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング