Reverse of getWorkingDays() function.
<?php
function getTargetWorkingDate($startDate, $days, $holidays = null) {
$the_first_day_of_week = date("N",strtotime($startDate));
if($the_first_day_of_week == 6) $b_extra+=2;
if($the_first_day_of_week == 7) $b_extra++;
$startDate = getdate((($b_extra) * 86400) + strtotime($startDate));
$startDate = $startDate['year'] . "-" . $startDate['mon'] . "-" . $startDate['mday'];
$no_weeks = floor($days / 5);
$extra_days = $no_weeks * 2;
$endDate = getdate((($days+$extra_days) * 86400) + strtotime($startDate));
$endDate = $endDate['year'] . "-" . $endDate['mon'] . "-" . $endDate['mday'];
if($holidays) {
foreach($holidays as $holiday){
$time_stamp = strtotime($holiday);
if (strtotime($startDate) <= $time_stamp && $time_stamp <= strtotime($endDate) && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
$extra_days++;
}
}
$endDate = getdate((($days+$extra_days) * 86400) + strtotime($startDate));
$endDate = $endDate['year'] . "-" . $endDate['mon'] . "-" . $endDate['mday'];
$the_last_day_of_week = date("N",strtotime($endDate));
if($the_last_day_of_week == 6) $e_extra+=2;
if($the_last_day_of_week == 7) $e_extra++;
$endDate = getdate((($e_extra) * 86400) + strtotime($endDate));
$endDate = $endDate['year'] . "-" . $endDate['mon'] . "-" . $endDate['mday'];
return $endDate;
}
?>
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
27-Nov-2008 10:59
18-Nov-2008 08:33
Just in case anyone else is looking for an easy-to-find equivalent for W3C Datetime or date("c") in a previous version of php, here's one I did. Hope it helps someone.
<?php
function w3cDate($time=NULL)
{
if (empty($time))
$time = time();
$offset = date("O",$time);
return date("Y-m-d\TH:i:s",$time).substr($offset,0,3).":".substr($offset,-2);
}
?>
Examples:
echo w3cDate(); //2008-11-18T12:15:18-07:00
echo w3cDate(mktime(2,3,4,5,6,2007)); //2007-05-06T02:03:04-06:00
14-Nov-2008 09:43
<?php
/*
Find out start and end date of current week.
I am assuming that week starts at sunday and ends at saturday.
so a typical week will look like this: sun,mon,tue,wed,thu,fri,sat
if you find any bug/error, please email me.
*/
//sunday = start of week
$sat = 6; //saturday = end of week
$current_day=date('w');
$days_remaining_until_sat = $sat - $current_day;
$ts_start = strtotime("-$current_day days");
$ts_end = strtotime("+$days_remaining_until_sat days");
echo date('m-d-Y',$ts_start); //start date
echo '<br>';
echo date('m-d-Y',$ts_end); //end date
/*
OUTPUT (m-d-y):
11-09-2008
11-15-2008
*/
?>
10-Nov-2008 07:26
<?php
// Function used to take two date strings, and returns an associative array
// with different formats for the difference between the dates.
// --------------------
// Variables:
// StartDateString (String - MM/DD/YYYY)
// EndDateString (String - MM/DD/YYYY)
// --------------------
// Example: $DateDiffAry = GetDateDifference('01/09/2008', '02/11/2009');
// print_r($DateDiffAry);
// --------------------
// Returns Something Like:
/*
Array
(
[YearsSince] => 1.0931506849315
[MonthsSince] => 13.117808219178
[DaysSince] => 399
[HoursSince] => 9576
[MinutesSince] => 574560
[SecondsSince] => 34473600
[NiceString] => 1 year, 1 month, and 2 days
[NiceString2] => Years: 1, Months: 1, Days: 2
)
*/
function GetDateDifference($StartDateString=NULL, $EndDateString=NULL) {
$ReturnArray = array();
$SDSplit = explode('/',$StartDateString);
$StartDate = mktime(0,0,0,$SDSplit[0],$SDSplit[1],$SDSplit[2]);
$EDSplit = explode('/',$EndDateString);
$EndDate = mktime(0,0,0,$EDSplit[0],$EDSplit[1],$EDSplit[2]);
$DateDifference = $EndDate-$StartDate;
$ReturnArray['YearsSince'] = $DateDifference/60/60/24/365;
$ReturnArray['MonthsSince'] = $DateDifference/60/60/24/365*12;
$ReturnArray['DaysSince'] = $DateDifference/60/60/24;
$ReturnArray['HoursSince'] = $DateDifference/60/60;
$ReturnArray['MinutesSince'] = $DateDifference/60;
$ReturnArray['SecondsSince'] = $DateDifference;
$y1 = date("Y", $StartDate);
$m1 = date("m", $StartDate);
$d1 = date("d", $StartDate);
$y2 = date("Y", $EndDate);
$m2 = date("m", $EndDate);
$d2 = date("d", $EndDate);
$diff = '';
$diff2 = '';
if (($EndDate - $StartDate)<=0) {
// Start date is before or equal to end date!
$diff = "0 days";
$diff2 = "Days: 0";
} else {
$y = $y2 - $y1;
$m = $m2 - $m1;
$d = $d2 - $d1;
$daysInMonth = date("t",$StartDate);
if ($d<0) {$m--;$d=$daysInMonth+$d;}
if ($m<0) {$y--;$m=12+$m;}
$daysInMonth = date("t",$m2);
// Nicestring ("1 year, 1 month, and 5 days")
if ($y>0) $diff .= $y==1 ? "1 year" : "$y years";
if ($y>0 && $m>0) $diff .= ", ";
if ($m>0) $diff .= $m==1? "1 month" : "$m months";
if (($m>0||$y>0) && $d>0) $diff .= ", and ";
if ($d>0) $diff .= $d==1 ? "1 day" : "$d days";
// Nicestring 2 ("Years: 1, Months: 1, Days: 1")
if ($y>0) $diff2 .= $y==1 ? "Years: 1" : "Years: $y";
if ($y>0 && $m>0) $diff2 .= ", ";
if ($m>0) $diff2 .= $m==1? "Months: 1" : "Months: $m";
if (($m>0||$y>0) && $d>0) $diff2 .= ", ";
if ($d>0) $diff2 .= $d==1 ? "Days: 1" : "Days: $d";
}
$ReturnArray['NiceString'] = $diff;
$ReturnArray['NiceString2'] = $diff2;
return $ReturnArray;
}
// Example:
$DateDiffAry = GetDateDifference('01/09/2008', '02/11/2009');
print_r($DateDiffAry);
?>
03-Nov-2008 12:38
Here's a small function which returns TRUE if European Summer Time is used (now or at a given date) :
<?php
if(!function_exists('estdst'))
{
function estdst($ts=false)
{
$ts = $ts?$ts:time();
$year = gmdate('Y', $ts);
$end = gmmktime(1, 0, 0, 3, 31 - ((5 * $year) / 4 + 4)%7, $year);
$start = gmmktime(1, 0, 0, 10, 31 - ((5 * $year) / 4 + 1)%7, $year);
return $ts < $end || $ts > $start;
}
}
?>
Calculation formula taken from here : http://en.wikipedia.org/wiki/European_Summer_Time
31-Oct-2008 09:46
I need to display graphic-A during hours 1-9 and graphic-B during hours 10-24. Anybody know of a simple way to do this? Better yet, if we can select times based upon the day of the week, it would be even better!
I tried searching, but didn't inf anything resembling this. The coding will be added to a product description in osCommerce, which accepts html coding easily but other scripting types may or may not work. I want an OPEN graphic to display during normal business hours, and CLOSED when outside these hours.
Thanks in advance!
22-Oct-2008 03:41
i figured i would post this, it's only useful for systems dealing with UTC and EST, but could easily be modified to support multiple timezones. this function will tell you whether it's daylight saving time for the eastern timezone using UTC localtime:
<?php
//checks whether DST in EST using UTC
//can pass $time in unix timestamp, otherwise uses time()
function est_isdst($time=NULL){
if(!$time) { $now = time(); }else { $now = $time; }
if (
$now > strtotime(date('Y-m-d 6:59:59', strtotime('next Sunday', strtotime(date('Y', $now).'-3-7')))) &&
$now < strtotime(date('Y-m-d 6:00', strtotime('first Sunday', strtotime(date('Y', $now).'-11-0'))))
) { return true; }else { return false; }
}
?>
USAGE:
<?php
if(est_isdst()) { echo 'Its DST in EST Timezone!'; }
?>
07-Oct-2008 11:56
Aditya Bhatt (adityabhai [at] gmail [dot] com):
I have one date, and i want the next day of that date:
<?php
echo date("D F d Y",strtotime("+1 days")); // Same applies for months e.g. "+1 months"
?>
I have one date, and i want the previous day of that date:
<?php
echo date("D F d Y",strtotime("-1 days")); // Same applies for months e.g. "-1 months"
?>
03-Oct-2008 12:52
date(DATE_RFC822) and date(DATE_RFC2822) both work. note that RFC 822 is obsoleted by RFC 2822. The main difference is the year being 08 in RFC 822 and is 2008 in RFC 2822.
To use date(DATE_RFC2822), a short form is date('r').
25-Sep-2008 05:48
RE: wulf dot kaiser at mpimf-heidelberg dot mpg dot de code to work out fridays in a month. I noticed one small error. It looks like the
<?php
if ($givenMonth != '12') {
$nextGivenMonth = "1";
$nextGivenYear = $givenYear + 1;}
?>
block was setting every month to 1 because it was not equal to 12. I changed that to <?php if ($givenMonth == '12') { ?>and now all is fine!
Now - to refine it so that it only shows Fridays on the 5th or after, until the 4th of the next month.. Damm UK tax stuff!
=)
N
25-Sep-2008 01:35
MySQL 5 will accept ISO_8601 encoded time, so it is acceptable to use date(ISO_8601)
12-Sep-2008 03:01
Correct format for a MySQL DATETIME column is
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
27-Aug-2008 08:47
a date function supporting the milliseconds format character
<?php
function udate($format, $utimestamp = null)
{
if (is_null($utimestamp))
$utimestamp = microtime(true);
$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp - $timestamp) * 1000000);
return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}
echo udate('H:i:s.u'); // 19:40:56.78128
echo udate('H:i:s.u', 654532123.04546); // 16:28:43.45460
?>
26-Aug-2008 02:32
here is the simpliest way to get the start and end date of the week;
<?php
$sdate=date('c',strtotime(date('Y')."W".date('W')."0"));
$edate=date('c',strtotime(date('Y')."W".date('W')."7"));
?>
the format is for the string in strtotime is;
2008W200
this stands for year - 2008, constant never changes - W, week number of the year - 20, day of the week - 0 for sunday, 1 for monday, etc....
so 2008W200 stands for the sunday of the 20th week of 2008.
This will only work in php 5 or better
15-Aug-2008 12:53
All novices must be very carefull when working with timestamps as second values.
From first glance it looks like date("Y-m-d H:i:s",TIMESTAMP) will return correct date, based on "how much seconds gone from 1970".
But here is the feature, it'll be corrected time, according to LOCAL timezone.
So if you take a 25200 as timestamp (10 hours),
then on one server you'll get
1970-01-01 08:00:00
and on other server you'll get
1970-01-01 09:00:00
and so on.
Though you could expect 1970-01-01 10:00:00 in all cases, because if 25200 seconds gone from 1970-01-01 00:00:00 it obviously have to be 1970-01-01 10:00:00
I spend today 3 hours to correct scripts which were created with such error by previous programmer, so please, guys, don't make me work like this and remember about conversation to LOCAL time.
06-Aug-2008 08:25
Try this for finding the difference in days between 2 dates/datetimes... take note though, date_parse requires PHP version 5.1.3 or higher.
<?php
/**
* Finds the difference in days between two calendar dates.
*
* @param Date $startDate
* @param Date $endDate
* @return Int
*/
function dateDiff($startDate, $endDate)
{
// Parse dates for conversion
$startArry = date_parse($startDate);
$endArry = date_parse($endDate);
// Convert dates to Julian Days
$start_date = gregoriantojd($startArry["month"], $startArry["day"], $startArry["year"]);
$end_date = gregoriantojd($endArry["month"], $endArry["day"], $endArry["year"]);
// Return difference
return round(($end_date - $start_date), 0);
}
?>
25-Jul-2008 10:22
<?php
// A demonstration of the new DateTime class for those
// trying to use dates before 1970 or after 2038.
?>
<h2>PHP 2038 date bug demo (php version <?php echo phpversion(); ?>)</h1>
<div style='float:left;margin-right:3em;'>
<h3>OLD Buggy date()</h3>
<?php
$format='F j, Y';
for ( $i = 1900; $i < 2050; $i++) {
$datep = "$i-01-01";
?>
Trying: <?php echo $datep; ?> = <?php echo date($format, strtotime($datep)); ?><br>
<?
}
?></div>
<div style='float:left;'>
<h3>NEW DateTime Class (v 5.2+)</h3><?php
for ( $i = 1900; $i < 2050; $i++) {
$datep = "$i-01-01";
$date = new DateTime($datep);
?>
Trying: <?php echo $datep; ?> = <?php echo $date->format($format); ?><br>
<?
}
?></div>
10-Jul-2008 06: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 05: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 04: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 06: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 04: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 10: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