PDA

View Full Version : نسخه اصلاح شده jdate به نام pdate



vahid4134
پنج شنبه 27 تیر 1387, 00:25 صبح
با سلام به همه دوستان
اطلاعات و دریافت فایل در
http://dev.servers24.ir/node/14
اگر اشکالی کدها وجود دارد بگید تا اصلاح کنم با تشکر از همه

yaqubian
پنج شنبه 27 تیر 1387, 00:34 صبح
آقا وحید فقط صفحه utf-8 نیست
فونت ها رو بهم ریخته
لطفا یه چک بفرمایید
ممنون

vahid4134
پنج شنبه 27 تیر 1387, 01:00 صبح
ممنون از توجه تون
دیگه اینش رو باید برم داخل apache درست کنم.
چک کردم اگر صفحه رو ذخیره کنید درست ذخیره میشه

vahid4134
پنج شنبه 27 تیر 1387, 01:12 صبح
UTF-8 هم درست شد

yaqubian
پنج شنبه 27 تیر 1387, 01:16 صبح
مرسی از لطفتون
موفق باشید

tabib_m
پنج شنبه 27 تیر 1387, 01:42 صبح
سلام
ممنون بابت لطفت
کاش اسمشو عوض نمیکردی
و این که
فقط اگه میشه اشکالاتی که برطرف شده رو یه شرح کوچیک بده که بدونیم مزیتش نسبت به قبل چیه :) ممنون

majoran
پنج شنبه 27 تیر 1387, 09:12 صبح
خیلی عالی دست شما درد نکنه آقا متشکر خیلی نسخه جی رو به کار بردم من هم مایل هستم مشکلات این نسخه رو بدونم

vahid4134
پنج شنبه 27 تیر 1387, 13:09 عصر
خوب برای اینکه با تابع قبلی بتونید جایگزین کنید فقط کافین اسم pdate رو یه find and replace کنید. تا با نسخه های قبلی حل بشه.
در مورد مشکلاتی که داشت. تغییر در فانکشن is_kabise مقداری ناقص بود که با الگوریتم مناسب شمسی مطابقت داده شد.
اشکال در بعضی از پارامترهای فرمت مثلا z که با Z بزرگ اشتباه گرفته شده بود و یا اضافه شدن N بزرگ که در نسخه قبلی نبود اما در این نسخه قرار داده شده. (و بعضی از پارامترهای دیگه که الان حضور ذهن ندارم)
تغییر در محاسبه بعضی از پارامتر های فرمت مثل M که به جای if و elseif های متعدد و کار کردن با رشته های به فرمت راحتتری اصلاح شده است.
اصلام فانکشن days_of_year
اصلاح فانکشن pmktime
اصلاح فانکشن number_of_day.
اصلاح فانکشن Convertnumber2farsi .
اصلاح فانکشن pgetdate

man4toman
پنج شنبه 27 تیر 1387, 18:20 عصر
آدرسی که دادید برای من باز نمیشه.
اگه میتونین یک جای دیگه هم آپ کنید.ممنون

vahid4134
پنج شنبه 27 تیر 1387, 20:35 عصر
با سلام متاسفانه vps من در حال ترانسفر بوده به همين خاطر اين مشكل پيش اومده تا سه يا چهار ساعت ديگه حل ميشه

sweb
پنج شنبه 27 تیر 1387, 20:49 عصر
تاریخ عربارو هم بزارین متاسفانه هنوز کاربرد داره! یک کلاس ترکیبی بسازین که هم شمسی داشته باشه و هم قمری.

این یک کلاسیه که من قبلاً روش کار کرده بودم که شمسی و قمریشو از 2 تا کلاس دیگه با هم ترکیب کرده بودم. 100% پر از اشتباه و باگه! یک حالی بهش بدین. تا
دیگه مشکل تاریخ نداشته باشیم. جایه تابع date هم بهتره از gmdate استفاده شه با یک offset واسه فاسله زمانی کلاینت واسه پردازش.



/**
* ExtraDate class
*/
class ExtraDate {

/**
* The translated words that used in dates
*
* @var string
*/
private $string = array(
'D' => array('ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'),
'l' => array('یک شنبه', 'دو شنبه', 'سه شنبه', 'چهار شنبه', 'پنج شنبه', 'جمعه', 'شنبه'),
'FM' => array(
'p' => array(null, 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'),
'a' => array(null, 'محرم', 'صفر', 'ربیع الاول', 'ربیع الثانی', 'جمادی الاول', 'جمادی الثانی', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذی القعده', 'ذی الحجه'),
),
'a' => array('ب.ظ', 'ق.ظ'),
'A' => array('بعد از ظهر', 'قبل از ظهر'),
);

/**
* Get the formated type of date
*
* @param string $$string
* @param integer $timestamp
* @param string $type
* @return string
*/
public function date($string, $timestamp = null, $type = null) {
switch ($type) {
case 'a':
return $this->idate($string, $timestamp);
break;
default:
return $this->pdate($string, $timestamp);
}
}

/**
* Persian date
*
* @param string $string
* @param integer $timestamp
*/
public function pdate($string, $timestamp) {
if ($timestamp) {
$gy = date('Y', $timestamp);
$gm = date('m', $timestamp);
$gd = date('d', $timestamp);
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
} else {
$gy = date('Y');
$gm = date('m');
$gd = date('d');
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$timestamp = $this->pmktime(date('h'), date('i'), date('s'), $jm, $jd, $jy);
}
while($i < strlen($string)) {
$subtype = substr($string, $i, 1);
switch ($subtype) {
case 'A':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['A'][0];
} else {
$return .= $this->string['A'][1];
}
break;
case 'a':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['a'][0];
} else {
$return .= $this->string['a'][1];
}
break;
case 'd':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= str_pad($jd, 2, '0', STR_PAD_LEFT);
break;
case 'D':
$result = date('w', $timestamp);
$return .= $this->string['D'][$result];
break;
case 'F':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $this->string['FM']['p'][$jm];
break;
case 'g':
$return .= date('g', $timestamp);
break;
case 'G':
$return .= date('G', $timestamp);
break;
case 'h':
$return .= date('h', $timestamp);
break;
case 'H':
$return .= date('H', $timestamp);
break;
case 'i':
$return .= date('i', $timestamp);
break;
case 'w':
$return .= date('w', $timestamp);
break;
case 's':
$return .= date('s', $timestamp);
break;
case 'S':
$return .= 'ام';
break;
case 'j':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jd;
break;
case 'l':
$result = date('w', $timestamp);
$return .= $this->string['l'][$result];
break;
case 'm':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= str_pad($jm, 2, '0', STR_PAD_LEFT);
break;
case 'M':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $this->string['FM']['p'][$jm];
break;
case 'n':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jm;
break;
case 't':
$return .= $this->pdim($gm, $gd, $gy);
break;
case 'y':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= substr($jy, 2, 4);
break;
case 'Y':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jy;
break;
default:
$return .= $subtype;
}
$i++;
}
return $return;
}

/**
* Islamic date
*
* @param string $string
* @param integer $timestamp
*/
public function idate($string, $timestamp) {
if ($timestamp) {
$gy = date('Y', $timestamp);
$gm = date('m', $timestamp);
$gd = date('d', $timestamp);
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
} else {
$gy = date('Y');
$gm = date('m');
$gd = date('d');
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$timestamp = time();
}
while($i < strlen($string)) {
$subtype = substr($string, $i, 1);
switch ($subtype) {
case 'A':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['A'][0];
} else {
$return .= $this->string['A'][1];
}
break;
case 'a':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['a'][0];
} else {
$return .= $this->string['a'][1];
}
break;
case 'd':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= str_pad($jd, 2, '0', STR_PAD_LEFT);
break;
case 'D':
$result = date('w', $timestamp);
$return .= $this->string['D'][$result];
break;
case 'F':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $this->string['FM']['a'][$jm];
break;
case 'g':
$return .= date('g', $timestamp);
break;
case 'G':
$return .= date('G', $timestamp);
break;
case 'h':
$return .= date('h', $timestamp);
break;
case 'H':
$return .= date('H', $timestamp);
break;
case 'i':
$return .= date('i', $timestamp);
break;
case 'w':
$return .= date('w', $timestamp);
break;
case 's':
$return .= date('s', $timestamp);
break;
case 'S':
$return .= 'ام';
break;
case 'j':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jd;
break;
case 'l':
$result = date('w', $timestamp);
$return .= $this->string['l'][$result];
break;
case 'm':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= str_pad($jm, 2, '0', STR_PAD_LEFT);
break;
case 'M':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $this->string['FM']['a'][$jm];
break;
case 'n':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jm;
break;
case 't':
$return .= $this->pdim($gm, $gd, $gy);
break;
case 'y':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= substr($jy, 2, 4);
break;
case 'Y':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jy;
break;
default:
$return .= $subtype;
}
$i++;
}
return $return;
}

/**
* Get persian date from georgian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function ptg($year, $month, $day) {
$gdim = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$jdim = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$jy = $year - 979;
$jm = $month - 1;
$jd = $day - 1;
$dayn = 365 * $jy + $this->div($jy, 33) * 8 + $this->div($jy % 33 + 3, 4);
for ($i = 0; $i < $jm; ++$i) $dayn += $jdim[$i];
$dayn += $jd;
$gdn = $dayn + 79;
$gy = 1600 + 400 * $this->div($gdn, 146097);
$gdn = $gdn % 146097;
$ly = true;
if ($gdn >= 36525) {
$gdn--;
$gy += 100 * $this->div($gdn, 36524);
$gdn = $gdn % 36524;
if ($gdn >= 365) $gdn++;
else $ly = false;
}
$gy += 4 * $this->div($gdn, 1461);
$gdn %= 1461;
if ($gdn >= 366) {
$ly = false;
$gdn--;
$gy += $this->div($gdn, 365);
$gdn = $gdn % 365;
}
for ($i = 0; $gdn >= $gdim[$i] + ($i == 1 && $ly); $i++) $gdn -= $gdim[$i] + ($i == 1 && $ly);
$gm = $i + 1;
$gd = $gdn + 1;
return array($gy, $gm, $gd);
}

/**
* Get georgian date from presian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function gtp($year, $month, $day) {
$gdim = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$jdim = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$gy = $year - 1600;
$gm = $month - 1;
$gd = $day - 1;
$dayn = 365 * $gy + $this->div($gy + 3, 4)- $this->div($gy + 99, 100) + $this->div($gy + 399, 400);
for ($i = 0; $i < $gm; ++$i) $dayn += $gdim[$i];
if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0))) $dayn++;
$dayn += $gd;
$jdn = $dayn - 79;
$jnp = $this->div($jdn, 12053);
$jdn = $jdn % 12053;
$jy = 979 + 33 * $jnp + 4 * $this->div($jdn, 1461);
$jdn %= 1461;
if ($jdn >= 366) {
$jy += $this->div($jdn - 1, 365);
$jdn = ($jdn - 1) % 365;
}
for ($i = 0; $i < 11 && $jdn >= $jdim[$i]; ++$i) $jdn -= $jdim[$i];
$jm = $i + 1;
$jd = $jdn + 1;
return array($jy, $jm, $jd);
}

/**
* Get islamic date from georgian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function itg($year, $month, $day) {
$jd = (int) ((11 * $year + 3) / 30) + 354 * $year + 30 * $month - (int) (($month - 1) / 2) + $day + 1948440 - 385;
if ($jd > 2299160) {
$l = $jd + 68569;
$n =(int) ((4*$l) / 146097);
$l = $l - (int) ((146097 * $n + 3) /4);
$i = (int) ((4000 * ($l + 1)) / 1461001);
$l = $l - (int) ((1461 * $i) / 4) + 31;
$j = (int) ((80 * $l) / 2447);
$day = $l - (int) ((2447 * $j) / 80);
$l = (int) ($j / 11);
$month = $j + 2 - 12 * $l;
$year = 100 * ($n - 49) + $i + $l;
} else {
$j = $jd + 1402;
$k = (int) (($j - 1) / 1461);
$l = $j - 1461 * $k;
$n = (int) (($l - 1) / 365) - (int) ($l / 1461);
$i = $l - 365 * $n + 30;
$j = (int) ((80 * $i) / 2447);
$day = $i - (int) ((2447 * $j) / 80);
$i = (int) ($j / 11);
$month = $j + 2 - 12 * $i;
$year = 4 * $k + $n + $i - 4716;
}
return array($year, $month, $day);
}

/**
* Get georgian date from islamic date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function gti($year, $month, $day) {
if (($year > 1582) || (($year == 1582) && ($month > 10)) || (($year == 1582) && ($month == 10) && ($day > 14))) {
$jd = (int) ((1461 * ($year + 4800 + (int) (($month - 14) / 12)))/ 4) + (int) ((367 * ($month - 2 - 12 * ((int) (($month - 14) / 12)))) / 12) - (int) ((3 * ((int) (($year + 4900+ (int) (($month - 14) / 12)) / 100))) / 4)+ $day - 32075;
} else {
$jd = 367 * $year - (int) ((7 * ($year + 5001 + (int) (($month - 9) / 7))) / 4) + (int) ((275 * $month) / 9) + $day + 1729777;
}
$l = $jd - 1948440 + 10632;
$n = (int) (($l - 1) / 10631);
$l = $l - 10631 * $n + 354;
$j = ((int) ((10985 - $l) / 5316)) * ((int) ((50 * $l) / 17719)) + ((int) ($l / 5670)) * ((int) ((43 * $l) / 15238));
$l = $l - ((int) ((30 - $j) / 15)) * ((int) ((17719 * $j) / 50)) - ((int) ($j / 16)) * ((int) ((15238 * $j) / 43)) + 29;
$month = (int) ((24 * $l) / 709);
$day = $l - (int) ((709 * $month) / 24);
$year = 30 * $n + $j - 30;
return array($year, $month, $day);
}

/**
* Get days that in a special month in persian date
*
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pdim($month, $day, $year) {
$ldg = date('d', mktime(0, 0, 0, $month + 1, 0, $year));
list($jy, $jm, $jd) = $this->ptg($year, $month, $day);
$ldj = $jd;
$jd = $jd2;
while($jd2 != '1') {
if($day < $ldg) {
$day++;
list($jy, $jm, $jd2) = $this->ptg($year, $month, $day);
if($pd == 1) break;
if($pd != 1) $ldj++;
} else {
$day = 0;
$month++;
if($month == 13) {
$month = 1;
$year++;
}
}
}
return $ldj - 1;
}

/**
* Get Unix timestamp from persian date
*
* @param integer $hour
* @param integer $minute
* @param integer $second
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pmktime($hour, $minute, $second, $month, $day, $year)
{
list($year, $minuteonth, $day) = $this->ptg($year, $month, $day);
$i = mktime($hour, $minute, $second, $minuteonth, $day, $year);
return $i;
}

/**
* Find the day of begining of the month in persian date
*
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pmstart($month, $day, $year)
{
list($jy, $jm, $jd) = $this->gtp($year, $month, $day);
list($year, $month, $day) = $this->ptg($jy, $jm, 1);
$timestamp = mktime(0, 0, 0, $month, $day, $year);
return (int) date('w', $timestamp);
}

/**
* Get the div between two number
*
* @param integer $a
* @param integer $b
* @return integer
*/
private function div($a, $b) {
return (int) ($a / $b);
}
}

vahid4134
جمعه 28 تیر 1387, 08:57 صبح
بچه ها اگر لینک دریافت کار نکرد اینجا فعلا بگیرید تا ببینم وضعیفت vps ام چی میشه

vahid4134
جمعه 28 تیر 1387, 08:59 صبح
تاریخ عربارو هم بزارین متاسفانه هنوز کاربرد داره! یک کلاس ترکیبی بسازین که هم شمسی داشته باشه و هم قمری.

این یک کلاسیه که من قبلاً روش کار کرده بودم که شمسی و قمریشو از 2 تا کلاس دیگه با هم ترکیب کرده بودم. 100% پر از اشتباه و باگه! یک حالی بهش بدین. تا
دیگه مشکل تاریخ نداشته باشیم. جایه تابع date هم بهتره از gmdate استفاده شه با یک offset واسه فاسله زمانی کلاینت واسه پردازش.



/**
* ExtraDate class
*/
class ExtraDate {

/**
* The translated words that used in dates
*
* @var string
*/
private $string = array(
'D' => array('ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'),
'l' => array('یک شنبه', 'دو شنبه', 'سه شنبه', 'چهار شنبه', 'پنج شنبه', 'جمعه', 'شنبه'),
'FM' => array(
'p' => array(null, 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'),
'a' => array(null, 'محرم', 'صفر', 'ربیع الاول', 'ربیع الثانی', 'جمادی الاول', 'جمادی الثانی', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذی القعده', 'ذی الحجه'),
),
'a' => array('ب.ظ', 'ق.ظ'),
'A' => array('بعد از ظهر', 'قبل از ظهر'),
);

/**
* Get the formated type of date
*
* @param string $$string
* @param integer $timestamp
* @param string $type
* @return string
*/
public function date($string, $timestamp = null, $type = null) {
switch ($type) {
case 'a':
return $this->idate($string, $timestamp);
break;
default:
return $this->pdate($string, $timestamp);
}
}

/**
* Persian date
*
* @param string $string
* @param integer $timestamp
*/
public function pdate($string, $timestamp) {
if ($timestamp) {
$gy = date('Y', $timestamp);
$gm = date('m', $timestamp);
$gd = date('d', $timestamp);
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
} else {
$gy = date('Y');
$gm = date('m');
$gd = date('d');
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$timestamp = $this->pmktime(date('h'), date('i'), date('s'), $jm, $jd, $jy);
}
while($i < strlen($string)) {
$subtype = substr($string, $i, 1);
switch ($subtype) {
case 'A':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['A'][0];
} else {
$return .= $this->string['A'][1];
}
break;
case 'a':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['a'][0];
} else {
$return .= $this->string['a'][1];
}
break;
case 'd':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= str_pad($jd, 2, '0', STR_PAD_LEFT);
break;
case 'D':
$result = date('w', $timestamp);
$return .= $this->string['D'][$result];
break;
case 'F':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $this->string['FM']['p'][$jm];
break;
case 'g':
$return .= date('g', $timestamp);
break;
case 'G':
$return .= date('G', $timestamp);
break;
case 'h':
$return .= date('h', $timestamp);
break;
case 'H':
$return .= date('H', $timestamp);
break;
case 'i':
$return .= date('i', $timestamp);
break;
case 'w':
$return .= date('w', $timestamp);
break;
case 's':
$return .= date('s', $timestamp);
break;
case 'S':
$return .= 'ام';
break;
case 'j':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jd;
break;
case 'l':
$result = date('w', $timestamp);
$return .= $this->string['l'][$result];
break;
case 'm':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= str_pad($jm, 2, '0', STR_PAD_LEFT);
break;
case 'M':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $this->string['FM']['p'][$jm];
break;
case 'n':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jm;
break;
case 't':
$return .= $this->pdim($gm, $gd, $gy);
break;
case 'y':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= substr($jy, 2, 4);
break;
case 'Y':
list($jy, $jm, $jd) = $this->gtp($gy, $gm, $gd);
$return .= $jy;
break;
default:
$return .= $subtype;
}
$i++;
}
return $return;
}

/**
* Islamic date
*
* @param string $string
* @param integer $timestamp
*/
public function idate($string, $timestamp) {
if ($timestamp) {
$gy = date('Y', $timestamp);
$gm = date('m', $timestamp);
$gd = date('d', $timestamp);
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
} else {
$gy = date('Y');
$gm = date('m');
$gd = date('d');
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$timestamp = time();
}
while($i < strlen($string)) {
$subtype = substr($string, $i, 1);
switch ($subtype) {
case 'A':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['A'][0];
} else {
$return .= $this->string['A'][1];
}
break;
case 'a':
$result = date('a', $timestamp);
if ($result == 'pm') {
$return .= $this->string['a'][0];
} else {
$return .= $this->string['a'][1];
}
break;
case 'd':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= str_pad($jd, 2, '0', STR_PAD_LEFT);
break;
case 'D':
$result = date('w', $timestamp);
$return .= $this->string['D'][$result];
break;
case 'F':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $this->string['FM']['a'][$jm];
break;
case 'g':
$return .= date('g', $timestamp);
break;
case 'G':
$return .= date('G', $timestamp);
break;
case 'h':
$return .= date('h', $timestamp);
break;
case 'H':
$return .= date('H', $timestamp);
break;
case 'i':
$return .= date('i', $timestamp);
break;
case 'w':
$return .= date('w', $timestamp);
break;
case 's':
$return .= date('s', $timestamp);
break;
case 'S':
$return .= 'ام';
break;
case 'j':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jd;
break;
case 'l':
$result = date('w', $timestamp);
$return .= $this->string['l'][$result];
break;
case 'm':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= str_pad($jm, 2, '0', STR_PAD_LEFT);
break;
case 'M':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $this->string['FM']['a'][$jm];
break;
case 'n':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jm;
break;
case 't':
$return .= $this->pdim($gm, $gd, $gy);
break;
case 'y':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= substr($jy, 2, 4);
break;
case 'Y':
list($jy, $jm, $jd) = $this->gti($gy, $gm, $gd);
$return .= $jy;
break;
default:
$return .= $subtype;
}
$i++;
}
return $return;
}

/**
* Get persian date from georgian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function ptg($year, $month, $day) {
$gdim = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$jdim = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$jy = $year - 979;
$jm = $month - 1;
$jd = $day - 1;
$dayn = 365 * $jy + $this->div($jy, 33) * 8 + $this->div($jy % 33 + 3, 4);
for ($i = 0; $i < $jm; ++$i) $dayn += $jdim[$i];
$dayn += $jd;
$gdn = $dayn + 79;
$gy = 1600 + 400 * $this->div($gdn, 146097);
$gdn = $gdn % 146097;
$ly = true;
if ($gdn >= 36525) {
$gdn--;
$gy += 100 * $this->div($gdn, 36524);
$gdn = $gdn % 36524;
if ($gdn >= 365) $gdn++;
else $ly = false;
}
$gy += 4 * $this->div($gdn, 1461);
$gdn %= 1461;
if ($gdn >= 366) {
$ly = false;
$gdn--;
$gy += $this->div($gdn, 365);
$gdn = $gdn % 365;
}
for ($i = 0; $gdn >= $gdim[$i] + ($i == 1 && $ly); $i++) $gdn -= $gdim[$i] + ($i == 1 && $ly);
$gm = $i + 1;
$gd = $gdn + 1;
return array($gy, $gm, $gd);
}

/**
* Get georgian date from presian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function gtp($year, $month, $day) {
$gdim = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$jdim = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$gy = $year - 1600;
$gm = $month - 1;
$gd = $day - 1;
$dayn = 365 * $gy + $this->div($gy + 3, 4)- $this->div($gy + 99, 100) + $this->div($gy + 399, 400);
for ($i = 0; $i < $gm; ++$i) $dayn += $gdim[$i];
if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0))) $dayn++;
$dayn += $gd;
$jdn = $dayn - 79;
$jnp = $this->div($jdn, 12053);
$jdn = $jdn % 12053;
$jy = 979 + 33 * $jnp + 4 * $this->div($jdn, 1461);
$jdn %= 1461;
if ($jdn >= 366) {
$jy += $this->div($jdn - 1, 365);
$jdn = ($jdn - 1) % 365;
}
for ($i = 0; $i < 11 && $jdn >= $jdim[$i]; ++$i) $jdn -= $jdim[$i];
$jm = $i + 1;
$jd = $jdn + 1;
return array($jy, $jm, $jd);
}

/**
* Get islamic date from georgian date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function itg($year, $month, $day) {
$jd = (int) ((11 * $year + 3) / 30) + 354 * $year + 30 * $month - (int) (($month - 1) / 2) + $day + 1948440 - 385;
if ($jd > 2299160) {
$l = $jd + 68569;
$n =(int) ((4*$l) / 146097);
$l = $l - (int) ((146097 * $n + 3) /4);
$i = (int) ((4000 * ($l + 1)) / 1461001);
$l = $l - (int) ((1461 * $i) / 4) + 31;
$j = (int) ((80 * $l) / 2447);
$day = $l - (int) ((2447 * $j) / 80);
$l = (int) ($j / 11);
$month = $j + 2 - 12 * $l;
$year = 100 * ($n - 49) + $i + $l;
} else {
$j = $jd + 1402;
$k = (int) (($j - 1) / 1461);
$l = $j - 1461 * $k;
$n = (int) (($l - 1) / 365) - (int) ($l / 1461);
$i = $l - 365 * $n + 30;
$j = (int) ((80 * $i) / 2447);
$day = $i - (int) ((2447 * $j) / 80);
$i = (int) ($j / 11);
$month = $j + 2 - 12 * $i;
$year = 4 * $k + $n + $i - 4716;
}
return array($year, $month, $day);
}

/**
* Get georgian date from islamic date
*
* @param integer $year
* @param integer $month
* @param integer $day
* @return array
*/
public function gti($year, $month, $day) {
if (($year > 1582) || (($year == 1582) && ($month > 10)) || (($year == 1582) && ($month == 10) && ($day > 14))) {
$jd = (int) ((1461 * ($year + 4800 + (int) (($month - 14) / 12)))/ 4) + (int) ((367 * ($month - 2 - 12 * ((int) (($month - 14) / 12)))) / 12) - (int) ((3 * ((int) (($year + 4900+ (int) (($month - 14) / 12)) / 100))) / 4)+ $day - 32075;
} else {
$jd = 367 * $year - (int) ((7 * ($year + 5001 + (int) (($month - 9) / 7))) / 4) + (int) ((275 * $month) / 9) + $day + 1729777;
}
$l = $jd - 1948440 + 10632;
$n = (int) (($l - 1) / 10631);
$l = $l - 10631 * $n + 354;
$j = ((int) ((10985 - $l) / 5316)) * ((int) ((50 * $l) / 17719)) + ((int) ($l / 5670)) * ((int) ((43 * $l) / 15238));
$l = $l - ((int) ((30 - $j) / 15)) * ((int) ((17719 * $j) / 50)) - ((int) ($j / 16)) * ((int) ((15238 * $j) / 43)) + 29;
$month = (int) ((24 * $l) / 709);
$day = $l - (int) ((709 * $month) / 24);
$year = 30 * $n + $j - 30;
return array($year, $month, $day);
}

/**
* Get days that in a special month in persian date
*
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pdim($month, $day, $year) {
$ldg = date('d', mktime(0, 0, 0, $month + 1, 0, $year));
list($jy, $jm, $jd) = $this->ptg($year, $month, $day);
$ldj = $jd;
$jd = $jd2;
while($jd2 != '1') {
if($day < $ldg) {
$day++;
list($jy, $jm, $jd2) = $this->ptg($year, $month, $day);
if($pd == 1) break;
if($pd != 1) $ldj++;
} else {
$day = 0;
$month++;
if($month == 13) {
$month = 1;
$year++;
}
}
}
return $ldj - 1;
}

/**
* Get Unix timestamp from persian date
*
* @param integer $hour
* @param integer $minute
* @param integer $second
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pmktime($hour, $minute, $second, $month, $day, $year)
{
list($year, $minuteonth, $day) = $this->ptg($year, $month, $day);
$i = mktime($hour, $minute, $second, $minuteonth, $day, $year);
return $i;
}

/**
* Find the day of begining of the month in persian date
*
* @param integer $month
* @param integer $day
* @param integer $year
* @return integer
*/
public function pmstart($month, $day, $year)
{
list($jy, $jm, $jd) = $this->gtp($year, $month, $day);
list($year, $month, $day) = $this->ptg($jy, $jm, 1);
$timestamp = mktime(0, 0, 0, $month, $day, $year);
return (int) date('w', $timestamp);
}

/**
* Get the div between two number
*
* @param integer $a
* @param integer $b
* @return integer
*/
private function div($a, $b) {
return (int) ($a / $b);
}
}

دوست عزیز به نظر شما بهتر نبود برای این موضوع یک تاپیک جدید می زدید؟

sweb
شنبه 29 تیر 1387, 00:37 صبح
دوست عزیز به نظر شما بهتر نبود برای این موضوع یک تاپیک جدید می زدید؟
خب عزیز گفتم که داری شما زحمتشو می کشین واسه یک تابع تاریخ قمری هم بهش اضافه کنین ولی یادتون باشه تاریخ عرب ها مثل بقیه چیزاشون تخمیه اختلاف 1 روز ممکنه داشته باشه (الگوریتم زیاضی دقیقی نداره همون قضیه رویت هلال ازین داستانا که داریم :قهقهه: ) اگه این تاریخ کامل شه مشکل تاریخ واسه برنامه نویسی PHP حل میشه! فقط اون قضیه offset واسه TimeZone رو فراموش نکنید. اگه کسی از date_default_timezone_set استفاده کنه از تابع date در غیر این صورت از تابع gmdate به همراه Offset!
طرح مسئله بهتری هم اگه هست بگین تا به یک چیز واحد برسیم.

مرسی از تلاشتون. :لبخندساده:

vahid4134
شنبه 29 تیر 1387, 10:44 صبح
خب عزیز گفتم که داری شما زحمتشو می کشین واسه یک تابع تاریخ قمری هم بهش اضافه کنین ولی یادتون باشه تاریخ عرب ها مثل بقیه چیزاشون تخمیه اختلاف 1 روز ممکنه داشته باشه (الگوریتم زیاضی دقیقی نداره همون قضیه رویت هلال ازین داستانا که داریم :قهقهه: ) اگه این تاریخ کامل شه مشکل تاریخ واسه برنامه نویسی PHP حل میشه! فقط اون قضیه offset واسه TimeZone رو فراموش نکنید. اگه کسی از date_default_timezone_set استفاده کنه از تابع date در غیر این صورت از تابع gmdate به همراه Offset!
طرح مسئله بهتری هم اگه هست بگین تا به یک چیز واحد برسیم.

مرسی از تلاشتون. :لبخندساده:
خواهش می کنم.
البته با بچه هیا iranphp تصمیمات جدیدی گرفته شده که ایشالا قطعی شد خبرش رو بهتون میدم
البته به نظر من استفاده از تاریخ قمری کار صحیحی نیست چون دو چیز متفاوت از هم هستند.
برای gmdate هم نظر من این هست که قرار داده نشه. چون قراره جایگزین تابع date باشه نه gmdate

Bahram0110
شنبه 29 تیر 1387, 15:45 عصر
دوست عزيز sweb
يكم مودب تر صحبت كنيد
من عرب نيستم ولي از همه قشر توي اين تالار عضو هستن كرد، لر، فارس، عرب و ...
من خودم يه دوست عرب توي تالار پيدا كردم اينقد با معرفته كه حاضرم جونمو براش بدم
ممنون مي شم ...

sweb
یک شنبه 30 تیر 1387, 07:01 صبح
دوست عزيز sweb
يكم مودب تر صحبت كنيد
من عرب نيستم ولي از همه قشر توي اين تالار عضو هستن كرد، لر، فارس، عرب و ...
من خودم يه دوست عرب توي تالار پيدا كردم اينقد با معرفته كه حاضرم جونمو براش بدم
ممنون مي شم ...
چشم عزیز. فقط واسه درج همزمان این 2 تا تاریخ تو یک کلاس نظرتون چیه ؟ همچنین استفاده از timezone و gmdate ؟

r30011111
سه شنبه 02 فروردین 1390, 07:37 صبح
بسم الله الرّحمن الرّحيم
معرّفی یک نرم افزار پی اچ پی مفید و کاربردی برای تبدیل تاریخ و زمان
تاريخ هجري شمسي به عنوان يکي از دقيق ترين تاريخ ها ، براي استفاده در سايت هاي فارسي بسيار مناسب است. امّا متاسّفانه با توجّه به ميلادي بودن تاريخ سرور سايت ها ، دسترسي به تاريخ هجري شمسي با مشکلاتي همراه است. يکي از اين مشکلات ، عدم دسترسي به يک نرم افزار رايگان مبدّل تاريخ به هجري شمسي است که از دقّت بالايي نيز برخوردار باشد.
يکي از بهترين نرم افزارهاي رايگان در اين زمينه ، نرم افزار تقويم جلالي بود که سال ها قبل به زبان پي اچ پي نوشته شد و هم اکنون در اکثر سايت ها استفاده مي شود. امّا با گذشت زمان ، عيوب بسيار زيادي از آن نرم افزار قديمي ، آشکار شد. افراد زيادي اقدام به اصلاح فايل نرم افزار نمودند و نسخه هاي گوناگوني از آن منتشر شد که هر کدام با مشکلات و خطاهايي همراه بود.
پس از گذشت سال ها از ساخت نرم افزار قديمي تبديل تاريخ ، در راستاي پيشرفت کشور و توسعه ي فناوري اطّلاعات ، نياز به انتشار يک نرم افزار مشابه با دقّت و امکانات بيشتر ، به شدّت احساس مي شد. تا اين که سايت http://jdf.scr.ir (http://jdf.scr.ir/) در روز 22 بهمن 1389 ، اقدام به انتشار يک نرم افزار جديد ، مشابه با نرم افزار قديمي نمود و اوّلين نسخه ي آن را در امتداد نسخه ي قديمي ، نسخه ي 2.00 قرار داد.
اين نرم افزار جديد ، به دليل همنام بودن نام فايل و توابع آن با نرم افزار قديمي ، اين قابليت را دارد که به راحتي جايگزين فايل قديمي در سايت ها شود و مشکلي در سايت ايجاد نکند.
همچنين امکانات بسيار زيادي به نرم افزار جديد اضافه شد ، مثلاً قابليت محاسبه و نمايش : نام روز و ماه و سال به حروف _ نام باستاني برج ها _ نام حيواني سال ها _ تعداد روز و درصد گذشته و باقيمانده از سال _ نام و شماره ي فصل _ و امکانات بسيار زياد ديگري که مناسب با تاريخ هجري شمسي و زبان شيرين فارسي می باشد.
در اين نرم افزار ، پارامترهاي جديد زيادي اضافه شد تا بتوان عملکرد توابع را به صورت دقیق کنترل کرد و خروجي دلخواه را دريافت نمود. مثلاً قابليت تعيين زبان اعداد ، منطقه ي زماني و حتّي نوع خروجي بعضي توابع که به صورت آرايه باشد يا يک متن دلخواه.
توابع نيز به صورت کامل ، بازنويسي و اصلاح شدند. حجم نرم افزار جديد تا حدّ زيادي کاهش يافت و در مقابل ، سرعت و دقّت آن چندين برابر شد.
اين نرم افزار با داشتن ويژگي هايي همچون متن باز و رايگان بودن ، راه جديدي را براي استفاده از تاريخ هجري شمسي در فضاي مجازي باز کرد. افتخار مي کنيم که اکنون شاهد استفاده از تاريخ بسيار دقيق هجري شمسي در وب سايت ها هستيم و ديگر اجباري براي استفاده از تاريخ ميلادي وجود ندارد. انشاءالله در آينده ي نزديک بتوانيم با ابداع سيستم عامل ها ، زبان هاي برنامه نويسي و نرم افزار هاي بومي به دست خودمان ، کاملاً خودکفا و بي نياز از فناوري هاي غير بومي شويم. آن زمان نزديک است ، آنقدر نزديک که حتّي نمي توانيد تصوّرش را بکنيد.
نرم افزار جديد را هم اکنون مي توان از طريق سايت رسمي اين نرم افزار به نشاني http://jdf.scr.ir (http://jdf.scr.ir/) دريافت نمود. براي استفاده کنندگان از اين نرم افزار ، يک مجموعه ي کامل آموزشي ، ايجاد شده و در سايت http://jdf.scr.ir (http://jdf.scr.ir/) موجود است. همچنين اين سايت ، اقدام به جمع آوري نظرات و پيشنهادات شما براي ارتقاي بيشتر نرم افزار نموده و شما مي توانيد با گزارش اشکالات نرم افزار ، در اصلاح نسخه ي بعدي آن ، کمک کنيد. در اين سايت ، از تمامي ايده هاي مفيد و کاربردي ، حمايت مي شود.
با عضويت در خبرنامه ي سايت http://jdf.scr.ir (http://jdf.scr.ir/) به محض انشار نسخه ي جديدتري از اين نرم افزار ، مطّلع خواهيد شد.
اين سايت در زمينه ي گسترش استفاده از تاريخ دقيق هجري شمسي ، فقط به وب سايت ها اکتفا نکرده و اقدام به ايجاد تابع مجازي jdate براي وبلاگ ها نموده است. از اين پس ، طرّاحان قالب وبلاگ ها و وبلاگ نويسان قادر خواهند بود به صورت مجازي و بدون نياز به فضاي آپلود فايل نرم افزار ، از تابع jdate به صورت دلخواه ، خروجي مورد نظر خود را دريافت کرده و در صفحات وبلاگ خود استفاده نمایند.

براي کسب اطّلاعات بيشتر ، مي توانيد به سايت http://jdf.scr.ir (http://jdf.scr.ir/) مراجعه فرماييد و از آخرين اخبار مربوطه ، مطّلع شويد.