<?php
/*
@params $firstdate, $lastdate
@return array() of array(monday,sunday)
@description returns all the mondays and sundays of the given date range
*/
function get_week_intervals($fdate,$ldate)
{
list($year,$month,$day) = explode('-',$fdate);
$daynum = date('w',
mktime(date('H'),
date('i'),
date('s'),
$month,
$day,
$year)
);
$daynum = $daynum==0? 7 : $daynum;
$week=array();
//get the dayname of the first day
//if month = current month get the current date as the last day
if($month==date('m'))
{
$lastday = date('d');
}
else
{
$lastday = date('t', strtotime($fdate));
}
if((date('l',strtotime($fdate))) == 'Sunday')
{
$monday = $fdate;
$sunday = $fdate;
}
else
{
$monday = $fdate;
$sunday = date('Y-m-d',(mktime(date('H'),
date('i'),date('s'),$month,
$day,$year))-($daynum-7)*86400);
}
$week[] = array('monday'=>$monday,'sunday'=>$sunday);
$day = date('d',strtotime($sunday." +1 day"));
while($sunday < $ldate)
{
$monday = date('Y-m-d',strtotime($sunday." +1 day"));
list($year,$month,$day) = explode('-',$monday);
$daynum = date('w',
mktime(date('H'),
date('i'),
date('s'),
$month,
$day,
$year)
);
$daynum = $daynum==0? 7 : $daynum;
$sunday = date('Y-m-d',(mktime(date('H'),date('i'),
date('s'),$month,$day,$year))-($daynum-7)*86400);
if($sunday > $ldate)
{
$sunday = $ldate;
}
$week[] = array('monday'=>$monday,'sunday'=>$sunday);
}
return $week;
}
?>
date
(PHP 4, PHP 5)
date — ローカルの日付/時刻を書式化する
説明
指定された引数 timestamp を、与えられた フォーマット文字列によりフォーマットし、日付文字列を返します。 タイムスタンプが与えられない場合は、現在の時刻が使われます。 つまり timestamp はオプションであり そのデフォルト値は time() の値です。
パラメータ
- format
-
出力される日付文字列の書式。以下のオプションを参照ください。
以下の文字が format パラメータ文字列として認識されます format 文字 説明 戻り値の例 日 --- --- d 日。二桁の数字(先頭にゼロがつく場合も) 01 から 31 D 曜日。3文字のテキスト形式。 Mon から Sun j 日。先頭にゼロをつけない。 1 から 31 l (小文字の 'L') 曜日。フルスペル形式。 Sunday から Saturday N ISO-8601 形式の、曜日の数値表現 (PHP 5.1.0 で追加)。 1(月曜日)から 7(日曜日) S 英語形式の序数を表すサフィックス。2 文字。 st, nd, rd または th。 jと一緒に使用する ことができる。 w 曜日。数値。 0 (日曜)から 6 (土曜) z 年間の通算日。数字。(ゼロから開始) 0 から 365 週 --- --- W ISO-8601 月曜日に始まる年単位の週番号 (PHP 4.1.0 で追加) 例: 42 (年の第 42 週目) 月 --- --- F 月。フルスペルの文字。 January から December m 月。数字。先頭にゼロをつける。 01 から 12 M 月。3 文字形式。 Jan から Dec n 月。数字。先頭にゼロをつけない。 1 から 12 t 指定した月の日数。 28 から 31 年 --- --- L 閏年であるかどうか。 1なら閏年。0なら閏年ではない。 o ISO-8601 形式の年。これは Y ほぼ同じだが、ISO 週番号 (W)が前年あるいは翌年に属する場合がある点で 異なる(PHP 5.1.0 で追加)。 例: 1999 あるいは 2003 Y 年。4 桁の数字。 例: 1999または2003 y 年。2 桁の数字。 例: 99 または 03 時 --- --- a 午前または午後(小文字) am または pm A 午前または午後(大文字) AM または PM B Swatch インターネット時間 000 から 999 g 時。12時間単位。先頭にゼロを付けない。 1 から 12 G 時。24時間単位。先頭にゼロを付けない。 0 から 23 h 時。数字。12 時間単位。 01 から 12 H 時。数字。24 時間単位。 00 から 23 i 分。先頭にゼロをつける。 00 から 59 s 秒。先頭にゼロをつける。 00 から 59 u ミリ秒 (PHP 5.2.2 で追加)。 例: 54321 タイムゾーン --- --- e タイムゾーン識別子(PHP 5.1.0 で追加) 例: UTC, GMT, Atlantic/Azores I (大文字の i) サマータイム中か否か 1ならサマータイム中。 0ならそうではない。 O グリニッジ標準時 (GMT) との時差 例: +0200 P グリニッジ標準時 (GMT) との時差。時間と分をコロンで区切った形式 (PHP 5.1.3 で追加)。 例: +02:00 T タイムゾーンの略称 例: EST, MDT ... Z タイムゾーンのオフセット秒数。 UTC の西側のタイムゾーン用のオフセットは常に負です。そして、 UTC の東側のオフセットは常に正です。 -43200 から 50400 全ての日付/時刻 --- --- c ISO 8601 日付 (PHP 5 で追加されました) 2004-02-12T15:19:21+00:00 r » RFC 2822 フォーマットされた日付 例: Thu, 21 Dec 2000 16:01:07 +0200 U Unix Epoch (1970 年 1 月 1 日 0 時 0 分 0 秒) からの秒数 time() も参照 フォーマット文字列中の認識されない文字は、そのまま表示されます。 Z 形式は、 gmdate() で使用した場合、常に 0 を返します。
注意: この関数が受け付けるのは integer のタイムスタンプだけです。したがって、書式指定文字 u が有用となるのは date_create() で作成したタイムスタンプを用いて date_format() を使用した場合のみです。
- timestamp
-
オプションのパラメータ timestamp は、 integer 型の Unix タイムスタンプです。 timestamp が指定されなかった場合のデフォルト値は、 現在の時刻です。言い換えると、デフォルトは time() の返り値となります。
返り値
日付を表す文字列を返します。 timestamp に数字以外が使用された場合は FALSE が返され、E_WARNING レベルのエラーが発生します。
エラー / 例外
すべての日付/時刻関数は、 有効なタイムゾーンが設定されていない場合に E_NOTICE を発生させます。また、システム設定のタイムゾーンあるいは環境変数 TZ を使用した場合には E_STRICT を発生させます。 date_default_timezone_set() も参照ください。
変更履歴
| バージョン | 説明 |
|---|---|
| 5.1.0 | 有効なタイムスタンプの範囲は、通常 Fri, 13 Dec 1901 20:45:54 GMT から Tue, 19 Jan 2038 03:14:07 GMT までです (これらの日付は、32 ビット符号付き整数の最小および最大値に 対応します)。 しかし、PHP 5.1 より前のバージョンでは、システム環境によっては (例: Windows) この範囲が 1970 年 1 月 1 日から 2038 年 1 月 19 日 までに制限されます。 |
| 5.1.0 | タイムゾーンがおかしい場合に E_STRICT や E_NOTICE が発生するようになりました。 |
| 5.1.1 | PHP 5.1.1 以降、format パラメータで標準的な 日付/時刻フォーマットを指定する際に有用な 定数がいくつか追加されました。 |
例
例1 date() の例
<?php
// 使用するデフォルトのタイムゾーンを指定します。PHP 5.1 以降で使用可能です。
date_default_timezone_set('UTC');
// 結果は、たとえば Monday のようになります。
echo date("l");
// 結果は、たとえば Monday 8th of August 2005 03:12:46 PM のようになります。
echo date('l jS \of F Y h:i:s A');
// 結果は July 1, 2000 is on a Saturday となります。
echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
/* 書式指定パラメータに、定数を使用します。 */
// 結果は、たとえば Mon, 15 Aug 2005 15:12:46 UTC のようになります。
echo date(DATE_RFC822);
// 結果は、たとえば 2000-07-01T00:00:00+00:00 のようになります。
echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
?>
前にバックスラッシュを付けてエスケープすることにより、 フォーマット文字列として認識される文字が展開されることを防止することができます。 バックスラッシュ付きの文字は既に特別なシーケンスであり、 バックスラッシュもエスケープすることが必要となる可能性があります。
例2 date() の文字をエスケープする
<?php
// Wednesday the 15th のように出力
echo date("l \\t\h\e jS");
?>
date() と mktime() の両方を用いて、未来または過去の日付を知ることができます。
例3 date() と mktime() の例
<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
注意: サマータイムがあるため、日付や月の秒数を単純にタイムスタンプに 可減算するよりもより信頼性があります。
date() フォーマットのいくつかの例を示します。 現在の実装で特別な意味がある文字や今後の PHP のバージョンで意味が 割り付けられるであろう文字については、望ましくない結果を避けるために エスケープする必要があることに注意してください。エスケープを する際には、改行文字 \n のような文字を回避するために シングルクォートを使用してください。
例4 date() のフォーマット指定
<?php
// 今日は March 10th, 2001, 5:16:18 pm であるとします。
$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm
$today = date("m.d.y"); // 03.10.01
$today = date("j, n, Y"); // 10, 3, 2001
$today = date("Ymd"); // 20010310
$today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01
$today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day.
$today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001
$today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month
$today = date("H:i:s"); // 17:16:17
?>
他の言語で日付をフォーマットするためには、date() のかわりに setlocale() および strftime() 関数を使用する必要があります。
注意
注意: 日付の文字列表現からタイムスタンプを生成するには、 strtotime() が使用できるでしょう。 さらに、いくつかのデータベースは(MySQL の » UNIX_TIMESTAMP 関数の ような)日付フォーマットからタイムスタンプへの変換関数を有しています。
PHP 5.1 以降、$_SERVER['REQUEST_TIME'] によってリクエスト開始時のタイムスタンプが取得できるようになりました。
date
18-Jul-2008 04:41
18-Jul-2008 01:30
to get the date of the monday from a week these function is useful:
<?php
/* Get First Calendar Week of Year x*/
function firstkw($jahr)
{
$erster = mktime(0,0,0,1,1,$jahr);
$wtag = date('w',$erster);
if ($wtag <= 4) {
/**
* Donnerstag oder kleiner: auf den Montag zurückrechnen.
*/
$montag = mktime(0,0,0,1,1-($wtag-1),$jahr);
} else {
/**
* auf den Montag nach vorne rechnen.
*/
$montag = mktime(0,0,0,1,1+(7-$wtag+1),$jahr);
}
return $montag;
}
/*GET timestamp of monday of month x*/
function mondaykw($kwtime)
{
$firstmonday =$this->firstkw(date("Y", $kwtime));
$mon_monat = date('m',$firstmonday);
$mon_jahr = date('Y',$firstmonday);
$mon_tage = date('d',$firstmonday);
$tage = (date("W", $kwtime)-1)*7;
$mondaykw = mktime(0,0,0,$mon_monat,$mon_tage+$tage,$mon_jahr);
return $mondaykw;
}
echo mondaykw(time()); //1215986400
?>
15-Jul-2008 04:56
here is a function to split a number of seconds in hours, minutes and seconds
<?php
function split_seconds($seconds)
{
// get the minutes
$minutes = floor($seconds / 60) ;
$seconds_left = $seconds % 60 ;
// get the hours
$hours = floor($minutes / 60) ;
$minutes_left = $minutes % 60 ;
// (test) show the result
echo "$hours hours $minutes_left minutes and $seconds_left seconds" ;
}
split_seconds(68648) ;
?>
best regards
fernando gabrieli
14-Jul-2008 09:43
Assuming a week starts on Monday. To calculate the week number of the current date starting from a specified date, use this function:
<?php
function weekcounter($start_date)
{
$start_date = strtotime($start_date);
$today = strtotime(date('d-m-Y'));
$week = 1;
while($start_date < $today) {
$start_date = strtotime('next Monday', $start_date);
$week++;
}
return $week;
}
// Example:
//now = 14-07-2008
echo weekcounter('01-07-2008'); //prints 3
echo weekcounter('01-06-2008'); //prints 8 instead of 7; because 1st jun is a Sunday so it is week 1 and 2nd june is week 2. Feel free to tweak.
?>
11-Jul-2008 01:38
Quick function for returning the names of the next 7 days of the week starting with today.
Returns an array that can be formatted to your liking.
<?php
/**
* Returns array of next 7 days starting with today
*
*/
function next_7_days() {
// create array of day names. You can change these to whatever you want
$days = array(
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday');
$today = date('N');
for ($i=1;$i<$today;$i++) {
// take the first element off the array
$shift = array_shift($days);
// ... and add it to the end of the array
array_push($days,$shift);
}
// returns the sorted array
return $days;
}
?>
It basically takes an array starting with Monday and shifts each day to the end of the array until the first element in the array is today.
10-Jul-2008 12:46
Doing $w-- for months ending on Sat won't hurt (i.e. if you're counting weeks as is the case below), but halocastle's code is perfectly fine as is and quite fast. He/she uses $w as a key for the $weeks array. "Halo" does this BEFORE $w++, so $w-- is superfluous as the loop has already ended. For May, 2008, I get 5 weeks as expected...
Array
(
[1] => Array
(
[4] => 1
[5] => 2
[6] => 3
)
[2] => Array
(
[0] => 4
[1] => 5
------------OMITTED-----------------
[4] => 22
[5] => 23
[6] => 24
)
[5] => Array
(
[0] => 25
[1] => 26
[2] => 27
[3] => 28
[4] => 29
[5] => 30
[6] => 31
)
)
I guess the one pit-fall of the code is if you overlap months, say the following year, then $m-- makes perfect since...I think (haven't gotten that far...yet).
I modified "Halo's" code to include months, too (this is from a snippet that produces a three month calendar, hence the outer $months loop, omitted here).
<?php
$m = date('m');
$Y = date('Y');
// for() {months loop omitted
$var_date = mktime(0, 0, 0, $m, 1, $Y);
$month_name = date('F', $var_date);
$months[$month_name]['DAYS'] = date('t', $var_date);
$months[$month_name]['FIRST_DAY'] = date('w', $var_date);
//}
foreach($months as $month => $key) {
$weeks = array();
for($i = 1, $j = $key['FIRST_DAY'], $w = 1;$i <= $key['DAYS'];$i++) {
$weeks[$w][$j] = $i;
$j++;
if($j == 7) {
$j = 0;
$w++;
}
}
$months[$month]['WEEKS'] = $weeks;
}
?>
Enjoy!
03-Jul-2008 11:44
Slight amendment to halocastle at yahoo dot com 's code as it doesn't take into account when a month finishes on a Saturday (eg May 2008).
<?php
$start_date = mktime(0, 0, 0,$start_month, 1, $start_year);
$days_in_month = date('t', $start_date);
$month_first_day = date('w', $start_date);
$j = $month_first_day;
$num_weeks = 1;
for($i = 1; $i <= $days_in_month; $i++) {
$j++;
if($j == 7) {
$j = 0;
$num_weeks++;
}
}
// if the last day of the month happens to be a Saturday,
// take one off the number of weeks
// because it was being added inside the for loop.
if ($j == 0) {
$num_weeks--;
}
?>
01-Jul-2008 01:20
Weeks and days for any month/year combo:
<?php
$m = 2; // February
$Y = 2008;
// constants used here for legibility, use $vars for dynamicon...
define('MONTH_DAYS',date('t', strtotime(date($m . '/01/' . $Y))));
// w:0->6 = Sun->Sat
define('MONTH_FIRST_DAY',date('w', strtotime(date($m . '/01/' . $Y))));
for($i = 1, $j = MONTH_FIRST_DAY, $w = 1;$i <= MONTH_DAYS;$i++) {
$week[$w][$j] = $i;
$j++;
if($j == 7) {
$j = 0;
$w++;
}
}
?>
print_r($week):
-----------------------
Array
(
[1] => Array
(
[5] => 1
[6] => 2
)
[2] => Array
(
[0] => 3
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
[6] => 9
)
[3] => Array
(
[0] => 10
[1] => 11
[2] => 12
[3] => 13
[4] => 14
[5] => 15
[6] => 16
)
[4] => Array
(
[0] => 17
[1] => 18
[2] => 19
[3] => 20
[4] => 21
[5] => 22
[6] => 23
)
[5] => Array
(
[0] => 24
[1] => 25
[2] => 26
[3] => 27
[4] => 28
[5] => 29
)
)
30-Jun-2008 11:18
I wrote the following function to show a series of drop down boxes to select the date. When provided with a timestamp, that date is selected by default, when none is provided, the current date is selected.
<?php
function chooseDate($timestamp = ""){
if($timestamp == ""){
$timestamp = time();
}
$months = array(null, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
unset($months[0]);
print_r($months);
$out = '<select name="month">';
foreach($months as $key => $month){
if($month == date('M', $timestamp)){
$out .= '<option value="'.$key.'" selected="selected">'.$month.'</option>';
}else{
$out .= '<option value="'.$key.'">'.$month.'</option>';
}
}
$out .= '</select><select name="days">';
for($i = 1; $i <= 32; $i++){
if($i == date('j', $timestamp)){
$out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>';
}else{
$out .= '<option value="'.$i.'">'.$i.'</option>';
}
}
$out .= "</select><select name='year'>";
for($i = date('Y'); $i >= 1970; $i--){
if($i == date('Y', $timestamp)){
$out .= '<option value="'.$i.'" selected="selected">'.$i.'</option>';
}else{
$out .= '<option value="'.$i.'">'.$i.'</option>';
}
}
$out .= "</select>";
return $out;
}
?>
Usage is simple:
<?php
echo chooseDate(); // Will select current date
echo chooseDate(1149566400); // Will select June 6th, 2006
?>
26-Jun-2008 05:12
@anonymous (12-Jun-2008 08:45):
date("t") returns the last day of the month, not the last working day of the month.
A cleaner example would be as follows:
<?php
function lastworkingday($date)
{
for($lastday=mktime(0,0,0,date("m",$date),
date("t",$date),date("Y",$date));
date("w",$lastday)==0 || date("w",$lastday)==6;
$lastday-=60*60*24);
return date("j",$lastday);
}
?>
18-Jun-2008 07:29
to get the week of the month simply use:
ceil( date("j") / 7 );
10-Jun-2008 08:27
I made a small code to get the last working day of the month:
<?php
$times = strtotime(date("Y")."-".date("m")."-".date("t"));
for ($lastworkingday=0;$lastworkingday==0;$times-=86400)
if (date("w",$times)!=0 && date("w",$times)!=6) $lastworkingday = date("j",$times);
print $lastworkingday;
?>
26-May-2008 02:37
Found this helpful when converting unix dates for use with the ical file format.
<?php
// Converts a unix timestamp to iCal format (UTC) - if no timezone is
// specified then it presumes the uStamp is already in UTC format.
// tzone must be in decimal such as 1hr 45mins would be 1.75, behind
// times should be represented as negative decimals 10hours behind
// would be -10
function unixToiCal($uStamp = 0, $tzone = 0.0) {
$uStampUTC = $uStamp + ($tzone * 3600);
$stamp = date("Ymd\THis\Z", $uStampUTC);
return $stamp;
}
?>
23-May-2008 10:54
<?php
/**
* Checks wether a date is between an interval
*
* Usage:
*
* // check if today is older than 2008/12/31
* var_dump(currentDayIsInInterval('2008/12/31'));
* // check if today is younger than 2008/12/31
* var_dump(currentDayIsInInterval(null,'2008/12/31'));
* // check if today is between 2008/12/01 and 2008/12/31
* var_dump(currentDayIsInInterval('2008/12/01','2008/12/31'));
*
* Will trigger errors if date is in wrong format, notices if $begin > $end
*
* @param string $begin Date string as YYYY/mm/dd
* @param string $end Date string as YYYY/mm/dd
* @return bool
*/
function currentDayIsInInterval($begin = '',$end = '')
{
$preg_exp = '"[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]"';
$preg_error = 'Wrong parameter passed to function '.__FUNCTION__.' : Invalide date
format. Please use YYYY/mm/dd.';
$interval_error = 'First parameter in '.__FUNCTION__.' should be smaller than
second.';
if(empty($begin))
{
$begin = 0;
}
else
{
if(preg_match($preg_exp,$begin))
{
$begin = (int)str_replace('/','',$begin);
}
else
{
trigger_error($preg_error,E_USER_ERROR);
}
}
if(empty($end))
{
$end = 99999999;
}
else
{
if(preg_match($preg_exp,$end))
{
$end = (int)str_replace('/','',$end);
}
else
{
trigger_error($preg_error,E_USER_ERROR);
}
}
if($end < $begin)
{
trigger_error($interval_error,E_USER_WARNING);
}
$time = time();
$now = (int)(date('Y',$time).date('m',$time).date('j',$time));
if($now > $end or $now < $begin)
{
return false;
}
return true;
}
?>
22-May-2008 12:37
The function below extracts any date time value basead in the string format.
Returns an associative array with day,month,year,hour,min and seg separated.
<?php
function ExtractDateTimeByFormat($strDateTime, $strFormat="dmYHis")
{
//extract the format
$i = 0;
$aFieldOrder = array();
$nFields = 0;
$strExtraction = "";
while(isset($strFormat[$i]))
{
$strField = $strFormat[$i];
switch ( strtolower($strField) )
{
case "D";
case "d";
$aFieldOrder[$nFields] = "d";
$nFields++;
$strExtraction .= "%d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
case "M";
case "m";
$aFieldOrder[$nFields] = "m";
$nFields++;
$strExtraction .= "%d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
case "y";
case "Y";
$aFieldOrder[$nFields] = "y";
$nFields++;
$strExtraction .= "%4d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
case "h";
case "H";
$aFieldOrder[$nFields] = "h";
$nFields++;
$strExtraction .= "%d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
case "i";
$aFieldOrder[$nFields] = "i";
$nFields++;
$strExtraction .= "%d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
case "S";
case "s";
$aFieldOrder[$nFields] = "s";
$nFields++;
$strExtraction .= "%d";
if(isset($strFormat[$i+1]))
{
$strExtraction .= "%*1c";
}
break;
}
$i++;
}
$aValues = array();
$aValues = sscanf($strDateTime,$strExtraction);
return array_combine($aFieldOrder,$aValues);
}
?>
21-May-2008 05:00
For output formatting of a SAMP based seminar announcement system, i had to fetch the date of every friday of a given month in a given year. Here's what i did:
<?php
$givenYear = $_GET["givenYear"]; # assume "2006"
$givenMonth = $_GET["givenMonth"]; # assume "12"
if ($givenMonth != '12') {
$nextGivenMonth = "1";
$nextGivenYear = $givenYear + 1;}
else {
$nextGivenMonth = $givenMonth + 1;
$nextGivenYear = $givenYe