جمعه ۱۲ بهمن ۱۴۰۳

Friday, January 31, 2025 GMT +3:30

تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP

php-date-time

یکی از موارد پرکاربرد در طراحی و برنامه نویسی سایت ها و صفحات فارسی زبان نمایش تاریخ هجری شمسی به اشکال مختلف است، برنامه نویسان وب معمولا برای سازگاری و ایجاد قابلیت های چندگانه در برنامه هایشان به صورت پیش فرض در ساختار، سورس کدها و فیلدهای دیتابیس از تاریخ میلادی استفاده می کنند که جنبه درون برنامه ای دارد و به صورت ذاتی با توابع یا امکانات سرور و پایگاه داده سازگار است، اما اگر بخواهیم این فرمت های پیش فرض را به صورت محلی و به زبان کاربر نمایش دهیم قاعدتا باید آنها را بر اساس فرمول و قاعده خاص گاهشماری مقصد تبدیل کنیم، بر همین اساس یکی از رایج ترین این موارد تبدیل تاریخ میلادی به هجری شمسی در PHP است که برای آن مبدلی تحت عنوان JDF توسط برنامه نویسان فارسی زبان نوشته و توسعه داده شده که در این مطلب می خواهیم با چند و چون کار و نحوه استفاده از آن آشنا شویم.

مبدل JDF چیست؟


همان طور که از معنی عبارت "مبدل" مشخص است، JDF تبدیل کننده تاریخ از میلادی به شمسی و از شمسی به میلادی است که برای این منظور از چند تابع مختلف که همگی در یک فایل PHP گنجانده شده اند استفاده می کند، این دستورات و توابع توسط برنامه نویسان سایت "مرکز دریافت بسته های کاربردی" به آدرس
https://scr.ir
نوشته و توسعه داده شده اند که در همین آدرس می توانیم تاریخچه و راهنمای کاملی از نحوه شکل گیری و تکامل این ابزار را مطالعه کنیم.

آیا برای نمایش تاریخ هجری شمسی، JDF تنها راه حل است؟!


قاعدتا خیر، یادآور می شویم در صورت مطالعه و آشنایی با اصول تقویم میلادی و گاهشمار هجری شمسی، تسلط بر برنامه نویسی و صرف وقت و حوصله کافی می توانیم توابع شخصی و مشابه حداقل جهت رفع نیازهای عادی طراحی کنیم، به عبارتی استفاده از JDF تنها روش برای تبدیل و نمایش تاریخ به صورت هجری شمسی نیست و راه برای ایجاد توابع و شیوه های سفارشی و جدید همواره باز است، JDF یک راه حل دم دستی، جامع، سریع و البته حرفه ای و خوب است که با توجه به رایگان بودن آن می تواند در هر کجا که نیاز باشد مورد استفاده قرار گیرد.

دانلود JDF، مبدل تاریخ میلادی، شمسی به زبان PHP


قبل از پرداختن به ادامه آموزش، ابتدا آخرین نسخه مبدل تاریخ میلادی، هجری شمسی (JDF) را از آدرس 
http://jdf.scr.ir
دانلود یا از لینک زیر نسخه ای از آن را از «وبگو» دریافت کنید:
دانلود JDF، مبدل تاریخ میلادی به هجری شمسی - تاریخ به روزرسانی فایل ZIP در «وبگو»: آبان 1396

نحوه استفاده از فایل jdf.php در برنامه ها


پس از دانلود فایل مبدل تاریخ میلادی به شمسی و شمسی به میلادی JDF، قاعدتا اولین کار include کردن آن در سورس کدهای برنامه PHP است که به روش نمونه زیر انجام می شود:
include_once('jdf.php');
به این ترتیب توابع این فایل در کدها در دسترس و قابل استفاده خواهند بود، فایل jdf.php چندین تابع مختلف را در خود جای داده اما برای کاربردهای عادی سه تابع jdate، gregorian_to_jalali و jalali_to_gregorian بیشترین اهمیت را دارند که در خصوص کارکرد و نحوه استفاده از آنها در ادامه به صورت موردی صحبت خواهیم کرد.
نکته: چنانچه خطای 
Fatal error: Call to undefined function: date_default_timezone_set()
را دریافت کردید، خط مربوط به date_default_timezone_set را در خطوط ابتدایی فایل jdf.php حذف یا (با افزودن // در ابتدای آن) به صورت کامنت در آورید، نمایش خطا به این دلیل است که قابلیت date_default_timezone_set تنها برای نسخه 5.1.0 به بعد در PHP قابل دسترس است.

تبدیل تاریخ میلادی به شمسی با تابع jdate


برای تبدیل تاریخ میلادی به هجری شمسی ابتدا باید دید تاریخ میلادی با چه فرمتی در کدهای PHP استفاده یا در فیلدهای دیتابیس ذخیره شده است، برنامه نویسان معمولا از دو فرمت رایج Unix، به طور مثال:
1510803458
یا تاریخ و زمان به صورت استاندارد، به طور مثال:
2017-11-16 03:37:38
استفاده می کنند، Unix یک مقدار عددی قابل فهم برای ماشین است که بر اساس اختلاف زمان به ثانیه از مبدا GMT یعنی نیمه شب (ساعت 0) 1 ژانویه 1970 میلادی تا زمان مقصد محاسبه شده و با تبدیل آن بر اساس فرمول های خاص می توانیم تاریخ و زمان مد نظر را به شکل قابل فهم برای انسان بدست آوریم، در حالت Unix فرآیند تبدیل تاریخ میلادی به شمسی ساده خواهد بود، کافی است مقدار عددی را به صورت برچسب زمان به عنوان آرگیومنت به تابع jdate داده و معادل تاریخ هجری شمسی آن را با توجه به تنظیمات در خروجی دریافت کنیم، به فرض:
<?php
$timestamp = '1510803458';
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
با اجرای این کد در خروجی تاریخ هجری شمسی چاپ خواهد شد، نکته مهم این کد نحوه استفاده از آرگیومنت های تابع jdate است که مشابه با تابع date در PHP هر حرف لاتین نماد یک شکل از تاریخ و زمان در این تابع است، به طور مثال حرف Y سال شمسی را به صورت عددی و کامل چاپ می کند، برای مشاهده جدول راهنمای این حروف می توانیم به آدرس زیر مراجعه نمائیم:
https://jdf.scr.ir/rahnama/?t=jdate
اما اگر تاریخ و زمان کدهای PHP یا مقادیر ذخیره شده در دیتابیس به صورت Unix نباشد، ابتدا باید تاریخ و زمان میلادی را به صورت فرمت استاندارد (سال-ماه-روز ساعت:دقیقه:ثانیه) دریافت کرده سپس پس از تجزیه تاریخ و زمان از طریق تابع explode در PHP و نهایتا تبدیل آرایه های حاصله به متغیر با کمک list، با استفاده از تابع mktime تاریخ و زمان را به صورت Unix و برچسب زمان (Timestamp) در آوریم، سپس مقدار عددی Unix را به عنوان آرگیومنت به تابع jdate داده و در نهایت تبدیل شده شمسی آن را دریافت می کنیم، مثال زیر روشن است:
<?php
$date = '2017-11-16 03:37:38';
$array = explode(' ', $date);
//print_r($array);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute, $second) = explode(':', $array[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
//echo $timestamp;
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
در صورتی که از آرایه با دستور print_r خروجی بگیریم تاریخ و زمان به صورت جداگانه چاپ خواهند شد:
Array ( [0] => 2017-11-16 [1] => 03:37:38 )
اگر از متغیر timestamp نیز با دستور echo خروجی بگیریم مقدار عددی 1510803458 چاپ خواهد شد.
نکته 1: تابع jdate درون خود از تابع gregorian_to_jalali استفاده می کند، در واقع تاریخ میلادی به این تابع داده شده و معادل شمسی آن به صورت آرایه (سال، ماه و روز) یا رشته متنی (در صورتی که آرگیومنت چهارم تنظیم شود) برگردانده می شود، سپس تابع jdate با استفاده از این اطلاعات بر اساس تنظیمات کاربر خروجی نهایی را چاپ می کند.
نکته 2: تابع jdate برای نمایش تاریخ و زمان فعلی سرور بصورت هجری شمسی نیز مورد استفاده قرار می گیرد، در این صورت نیازی به آرگیومنت دوم یعنی برچسب زمان نیست، مثال:
echo jdate("تاریخ:Y/m/d زمان:H:i:s");
نکته 3: در صورتی که تاریخ و زمان در فیلدهای دیتابیس ذخیره شده باشند، قاعدتا ابتدا باید با اجرای پرس و جو از دیتابیس استخراج و سپس به متغیر PHP نسب داده شوند، به طور مثال:
<?php
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "Error!: " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    $id = mysqli_real_escape_string($conn, @$_GET['id']);
    $sql = "SELECT date_col FROM tbl WHERE id = $id LIMIT 1";
    $query = mysqli_query($conn, $sql);
    if(!$query) {
        echo "Error!: " . mysqli_error($conn);
    } else {
        while($row = mysqli_fetch_array($query)){
            $date = $row['date_col'];
        }
    }
}
mysqli_close($conn);
?>
در این مثال از اکستنشن MySQLi در حالت برنامه نویسی رویه ای (Procedural) استفاده شده که روشی عمومی و به اصطلاح دم دستی است، قاعدتا برای حالت های پیشرفته  تر می توانیم از حالت شی گرا یا اکستنشن PDO نیز استفاده کنیم (در عمل صرفا خروجی برایمان ملاک است و تفاوتی بین روش ها از این نظر وجود ندارد).

تبدیل تاریخ میلادی به شمسی با تابع gregorian_to_jalali


اگرچه برای تبدیل تاریخ میلادی به هجری شمسی استفاده از تابع jdate کفایت می کند، اما به جهت اینکه خود این تابع از تابع دیگری به نام gregorian_to_jalali استفاده می کند، بد نیست این تابع را نیز بررسی کنیم.
function gregorian_to_jalali($gy, $gm, $gd, $mod='')
تابع gregorian_to_jalali تاریخ میلادی را به صورت سه آرگیومنت (سال، ماه و روز) دریافت و تبدیل شده شمسی آن را بر اساس محاسبات مربوط به تبدیل تاریخ ها به عنوان نتیجه به صورت آرایه یا رشته متنی بر می گرداند، آرگیومنت چهارم این تابع با عنوان mod می تواند یک علامت متنی مانند - یا / باشد، در این صورت نتیجه به صورت رشته متنی برگردانده می شود، نمونه کد نحوه استفاده مستقیم از این تابع:
<?php
$timezone = 0;
$year = date('Y', time() + $timezone);
$month = date('n', time() + $timezone);
$day = date('j', time() + $timezone);
print_r(gregorian_to_jalali($year, $month, $day));
?>
که خروجی نمونه کد بالا به صورت زیر خواهد بود:
Array ( [0] => 1396 [1] => 8 [2] => 25 )
اگر آرگیومنت چهارم مقداردهی شود خروجی به صورت رشته متنی خواهد بود:
echo gregorian_to_jalali($year, $month, $day, '/');
که در اینصورت خروجی برابر است با:
1396/8/25
نکته 1: در نمونه کد بالا اختلاف از GMT را در متغیر دلخواه timezone برابر 0 قرار داده ایم، اگر زمان سرور شما بر روی GMT تنظیم شده است باید برای سازگاری با زمان محلی ایران، اختلاف 3:30 از GMT عدد 12600 و برای 4:30 (شش ماهه اول سال، ساعت تابستانی) عدد 16200 را برای متغیر timezone قرار دهید، هر ساعت اختلاف از GMT برابر است با 60 دقیقه ضرب در 60 ثانیه (60*60) و نتیجه برابر است با 3600 ثانیه (یک ساعت برابر 3600 ثانیه)، 3:30 برابر می شود با 12600 و 4:30 برابر است با 16200 ثانیه.
نکته 2: تنها تفاوت بین استفاده از حروف n و j با m و d در تابع date در این است که اعداد کوچکتر از 10 به صورت بدون صفر یا با صفر در ابتدا نمایش داده می شوند (به طور مثال 8 یا 08).

تبدیل تاریخ شمسی به میلادی با تابع jalali_to_gregorian


function jalali_to_gregorian($jy, $jm, $jd, $mod='')
مشابه آنچه در خصوص تابع gregorian_to_jalali گفتیم در اینجا نیز کافی است سال، ماه و روز مد نظر در تاریخ هجری شمسی را به عنوان آرگیومنت به تابع jalali_to_gregorian بدهیم و تبدیل شده میلادی آن را بر اساس محاسبات خاص به صورت آرایه یا در صورتی که آرگیومنت چهارم تنظیم شود، به صورت رشته متنی دریافت کنیم، مثال زیر روشن است:
<?php
$date = '1396/8/25';
$array = explode('/', $date);
$year = $array[0];
$month = $array[1];
$day = $array[2];
print_r(jalali_to_gregorian($year, $month, $day));
?>
که خروجی نمونه کد بالا به شکل زیر خواهد بود:
Array ( [0] => 2017 [1] => 11 [2] => 16 )
اگر آرگیومنت چهارم مقداردهی شود خروجی به صورت رشته متنی خواهد بود:
echo jalali_to_gregorian($year, $month, $day, '/');
که در اینصورت خروجی برابر است با:
2017/11/16
همانطور که مشخص است برای اینکه خروجی به صورت رشته متنی باشد، کافی است آرگیومنت چهارم را با یک علامت مانند - یا / مقداردهی و به جای print_r از echo استفاده کنیم.

مثال و پیش نمایش آنلاین


برای جمع بندی این آموزش مثال ها و پیش نمایش آنلاین تبدیل تاریخ میلادی به شمسی و شمسی به میلادی را در قالب یک فایل تست و بررسی می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | تبدیل تاریخ میلادی، شمسی</title>
<!-- Webgoo.ir -->
<style type="text/css">
body{
    direction:rtl;    
}
.ltr{
    direction:ltr;
}
.rtl{
    direction:rtl;
}
</style>
</head>
<body>
<?php
include_once('jdf.php');
$date = '2017-11-16 03:37:38';
$array = explode(' ', $date);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute, $second) = explode(':', $array[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
<?php
$date = '1396/8/25 03:37:38';
$array = explode(' ', $date);
list($year, $month, $day) = explode('/', $array[0]);
$gregorian_date = 'Date:' . jalali_to_gregorian($year, $month, $day, '-') . ' Time:' . $array[1];
?>
<div class="ltr"><?php echo $gregorian_date; ?></div>
<hr>
با توجه به اینکه بیشتر توابع و امکانات درونی MySQL صرفا با تاریخ میلادی سازگار هستند، توصیه می شود تاریخ دیتابیس را همواره به صورت میلادی با یکی از فرمت های استاندارد یا به صورت Unix ذخیره کنیم و صرفا در حالت نمایشی از تاریخ هجری شمسی استفاده نمائیم.
</body>
</html>
پیش نمایش
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
ساخت منوی هوشمند با PHP و CSS
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
دیدگاه
more ۹۶ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
علایی
۱۱:۳۷ ۱۴۰۳/۰۹/۱۲
با سلام و درود بی پایان و خوشحالم که با این سایت آشنا شدم بنده وردپرس کار هستم اگه لطف بکنید و نحوه شمسی سازی با این رشته کدها تو وردپرس رو هم یاد بدین خیلی ممنون میشم.
خیلیها دنبالشن
با سپاس فراوان
این روش کلی است و کافی است تاریخ میلادی را برای آن فراهم کنید، در وردپرس بسته به اینکه تاریخ چه قسمتی را می خواهید به هجری شمسی تبدیل کنید باید ابتدا پرس و جوی متناظر آن را بنویسید تا تاریخ میلادی از دیتابیس استخراج و سپس تبدیل شود که البته پلاگین های آماده هم برای فارسی سازی تاریخ ها وجود دارد.
سارا اکبری
۰۶:۰۹ ۱۴۰۳/۰۴/۲۱
لطفا کد کپچا رو درست کنید هر چی کپچا رو میزنیم میگه اشتباهه حتما باید کپچا رو دستی خودمون رو دکمش بزنیم رفرش بشه بعد بفهمه
بخش ارسال یادداشت ها بررسی شد، مشکلی در قسمت کد امنیتی (کپچا) دیده نشد، در صورت امکان لطفا از مشکل پیش آمده فیلمی تهیه و به آدرس ایمیل ما (موجود در بخش تماس) بفرستید تا بیشتر بررسی کنیم.
سارا اکبری
۰۶:۰۸ ۱۴۰۳/۰۴/۲۱
سلام استاد عزیز وقت بخیر
بنده ی تعداد افراد انلاین ساده نوشتم ببینید برای پروژه های بزرگ اوکیه و مشکلی پیش نمیاد ؟ حتی اگه timezone سرور و دیتابیس فرق داشته باشه همچنان کار خواهد کرد و مشکلی پیش نمیاد
چک کنید اگه مشکلی بود بی زحمت برطرفش کنید
<?php
use Core\DB;

const ROOT = __DIR__;

require_once(ROOT . '/Configs/config.php');
require_once(ROOT . '/Core/autoloader.php');

session_start();
$conn = DB::connect();

function checkOffLineAndDelete()
{
global $conn;

$expired = time() - 60 * 2;
$conn->query("DELETE FROM `onlineList` WHERE FROM_UNIXTIME(`time`) < FROM_UNIXTIME('{$expired}')");
}
function insertOrDeleteOnline()
{
global $conn;
$session_id = session_id();

$res = $conn->query("SELECT * FROM `onlineList` WHERE `session` = '{$session_id}'");
if($res->num_rows){
$row = $res->fetch_assoc();
$conn->query("UPDATE `onlineList` SET `time` = '".time()."' WHERE `id` = '{$row['id']}'");
}
else{
$conn->query("INSERT INTO `onlineList` (`session`, `time`) VALUES('{$session_id}', '".time()."')");
}
}
function countOnlineList()
{
global $conn;

return $conn->query("SELECT COUNT(*) `countList` FROM `onlineList`")->fetch_assoc()['countList'];
}


checkOffLineAndDelete();
insertOrDeleteOnline();
$onlineCount = countOnlineList();
?>

<h1>تعداد افراد آنلاین: <?= $onlineCount ?></h1>
طبق بررسی ما و مرور ظاهر کدها مشکل خاصی دیده نشد، با محدوده زمانی متفاوت سرور ایراد اساسی ایجاد نمی شود، اما در کل هنگام بررسی کارایی برنامه ها و خطایابی کدها در نظر گرفتن تمام جوانب و اجرا در شرایط واقعی مهم است، چون ممکن است پارامترهای دیگری در کار کدها دخیل شوند که در مرور ظاهری مشخص نشود.
علی
۱۴:۱۴ ۱۴۰۲/۱۲/۲۰
سلام وقت بخیر
یک سوال داشتم ممنون میشم راهنمایی کنید. بنده تاریخ را برای یک فرم به صورت datetime در پایگاه داده ذخیره کرده ام. حالا در بخش کاربران من نیاز داریم که این تاریخ را به شمسی نمایش بگذارم که تا اینجا مشکلی نیست. اما می خوام کاربر امکان تغییر این تاریخ را داشته باشد. یعنی کاربر تاریخ را به صورت شمسی با استفاده از input date تغییر داده و در پایگاه داده به صورت میلادی ذخیره شود.
ممنون میشم بهینه ترین راه را برای بنده توضیح دهید.
برای ورود تاریخ به صورت شمسی و دریافت و تبدیل آن به صورت میلادی با فرمت مد نظر، در سمت سرور می توانید از مبدل JDF برای محاسبات استفاده کنید که در آموزش حاضر در بخش "تبدیل تاریخ شمسی به میلادی با تابع jalali_to_gregorian" نمونه کد وجود دارد، منتها برای ایجاد رابط کاربری بهینه سمت مرورگر یعنی باکسی که کاربر بتواند از آن تاریخ های شمسی را جستجو کرده و تاریخ مد نظرش را پیدا و جایگزین کند به ابزارک ورود تاریخ شمسی احتیاج دارید که معمولا به زبان JavaScript نوشته می شود، هرچند امکان ورود دستی تاریخ شمسی نیز در فیلد وجود دارد.
پـــرتو
۲۱:۲۲ ۱۴۰۲/۰۵/۲۸
سلام بابت جواب به سوالم در مورد بلاگفا ممنون من خودم با پشتیبانی بلاگفا تماس گرفتم گفنن نمیشه اینکار ولی یه سوال دیگه ازتون داشتم اونم اینکه من توی اپارات کلیپ گذاشتم و یعنی خودم ساختم و گذاشتم و دو سه هفته پیش تعداد بازدیدش یکم زیاد بود مثلا ده 20 نفر ولی امروز دیدم که تعداد بازدیدش کمتر شده تعدادش شده 4 بنظر شما مشکل از چیست؟؟؟؟ ممنون میشم بگین لطفا مرسی
تا جایی که اطلاع داریم عدد بازدیدهای کلیپ در سایت آپارات باید همواره افزایشی باشد و این عدد کاهش پیدا نمی کند، ممکن است کلیپ را چند بار آپلود کرده یا صفحات جدید و قدیم را به اشتباه تصور کرده باشید یا مسائلی از این دست، در کل چند روز صفحه را زیر نظر بگیرید علت مشخص می شود.
پـــرتو
۱۱:۵۹ ۱۴۰۲/۰۵/۰۳
نه خب منکه نمی تونم تک تک پست ها رو بزارم من چندسال پیش ازش یه پشتیبان گرفتم و پسوندش دات بلاگفا دات کام نبود و پسوندش .html هست ایا راهی هست بشه تبدیلش کرد به دات بلاگفا دات کام یا نه؟ ممنون میشم لطفا بگین مرسی
در این مورد باید با پشتیبانی بلاگفا تماس بگیرید، با توجه به اینکه از خود سیستم بلاگفا پشتیبان تهیه کرده اید ممکن است راه حلی برای این حالت داشته باشند.
پـــرتو
۱۵:۵۴ ۱۴۰۲/۰۵/۰۱
سلام خسته نباشید ببخشید مزاحم میشم من می خواستم وبلاگمو برگردونم که بلاگفا تازگیا این امکانو میده که وبلاگمون رو برگردونیم بعد گفته باید پسوندش دات بلاگفا دات کام باشه که از مال من html هستش یعنی پسوندش html هست ولی بلاگفا نوشته پسوندش باید دات بلاگفا دات کام باشه بعد من چیکار کنم که پسوندش دات بلاگفا دات کام باشه؟
شما می دونید باید چیکار کرد؟ ممنون میشم راهنماییم بفرمایید که چطوری بلاگفا مال منو پیدا کنه؟ یعنی بلاگفا مال منو پیدا نمیکنه من باید چیکار کنم که پیدا کنه فایلمو؟ الان یه پشتیبانی از همه وبلاگ دارم
نسخه پشتیبان وبلاگ در صورتی در سرویس بلاگفا قابل بازیابی سیستمی است که از خود بلاگفا پشتیبان گرفته شده باشد، یعنی باید نسخه پشتیبان را از پنل مدیریت وبلاگتان تهیه کرده باشید که در این حالت پسوند فایل به صورت blogfa. است، اگر اینطور نیست تنها راه حل ورود و بازیابی دستی اطلاعات به صورت انتشار تک تک پست ها است.
ایران
۱۹:۰۰ ۱۴۰۲/۰۴/۲۶
سلام وقت بخیر.
من یه فرم دارم که از کاربر دو تا داده به صورت زیر میگیره اولی تاریخ و دومی زمان مثلا:
۱۲ آذر ۱۴۰۲ - ساعت ۱۰:۳۰ دقیقه
چطور باید این تاریخ رو به صورت unix در دیتابیس ذخیره کنم؟
تاریخ ها به صورت شمسی و رشته متنی فارسی هستند و ابتدا باید آنها را به صورت عددی انگلیسی تبدیل کنیم، در گام بعدی از تاریخ شمسی به میلادی تبدیل و در نهایت تاریخ میلادی را به صورت برچسب زمان خروجی بگیریم، پس تمام این مراحل را باید مانند نمونه کد زیر انجام دهیم:
<?php
include_once('jdf.php');

function numFaToEn($string) {
return strtr($string, array('۰'=>'0', '۱'=>'1', '۲'=>'2', '۳'=>'3', '۴'=>'4', '۵'=>'5', '۶'=>'6', '۷'=>'7', '۸'=>'8', '۹'=>'9'));
}

$j_months = array('فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند');
$j_data_str = '۱۲ آذر ۱۴۰۲';
$j_data_array = explode(' ', $j_data_str);

$j_year = numFaToEn($j_data_array[2]);
$j_month = array_search($j_data_array[1], $j_months) + 1;
$j_day = numFaToEn($j_data_array[0]);

$gregorian_date = jalali_to_gregorian($j_year, $j_month, $j_day, '-');
$gregorian_time = numFaToEn('۱۰:۳۰' . ':00');

$date = $gregorian_date . ' ' . $gregorian_time;
$array = explode(' ', $date);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute, $second) = explode(':', $array[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
echo $timestamp;
?>
نکته: این شیوه استاندارد نیست و به فرض ممکن است ماه های شمسی دقیقا مشابه مقداری که ما در آرایه نوشته ایم در کدهای شما در دسترس نباشد و کد دچار مشکل شود، لذا تست و بررسی دقیق این راه حل و تطبیق آن با عناوین ماه های شمسی که برنامه شما ایجاد می کند قبل از استفاده توصیه می شود.
زهرا
۲۳:۱۳ ۱۴۰۱/۰۶/۰۴
من دنبال تبدیل تاریخ شمسی به میلادی بودم که با یار php اشنا شدم خیلی وب سایت خوبیه
ابوالفضل
۲۰:۵۶ ۱۴۰۰/۱۰/۳۰
سلام
ممنونم ازتون استاد خوبم با کمک شما توانستم تابع زیر را بنویسم و عالی هم کار میکنه. من از چند سال پیش که با وبگو آشنا شدم به خاطر دارم اینو که شما استاد خوبمون اگر متوجه میشدید برای حل یه مسئله تحقیقی نکردیم توی نت بهم جواب نمیدادید اما سرنخ کار رو بهم میگفتید تا برم تحقیق کنم ولی زمانی که واقعا متوجه میشدید که تحقیقم کردیم و به نتیجه ای نرسیدم برام مسئله رو حل میکردید کد رو مینوشتید واقعا ممنونم ازتون من از آموزش های شما به درآمد های خوبی رسیدم من هیچوقت فراموش نمیکنم که وبگو منو برنامه نویس کرد
/* به دست آوردن شیفت جاری */
function SHIFT()
{

$Date_Today = date("Y-m-d");
$LastRowID = LastRow('Shift');
$Time_Start_Shift = ShowRow('Shift', $LastRowID, 'Start_Time_Shift');
$Saat_Kari = ShowRow('Shift', $LastRowID, 'Saat_Kari');

$base_date_time = strtotime($Date_Today . ' ' . $Time_Start_Shift);

$first_end = $base_date_time + (3600 * $Saat_Kari);
$second_end = $first_end + (3600 * $Saat_Kari);
$therth_end = $second_end + (3600 * $Saat_Kari);

$test_date_time = time();

if (($test_date_time > $base_date_time) && ($test_date_time < $first_end)) {

$Shift = 1;

} elseif (($test_date_time > $first_end) && ($test_date_time < $second_end)) {

$Shift = 2;

} elseif (($test_date_time > $second_end) && ($test_date_time < $therth_end)) {

$Shift = 3;

}

return $Shift;
}

/* END */
نظر لطف شما است، از داشتن همراهان فهیمی مثل شما واقعا خوشحالیم، در مورد تابع ما یک تغییر کوچک در نمونه کد ایجاد و از عملگر =< به جای < برای مقایسه استفاده کرده ایم که می توانید در تابع خودتان هم اعمال کنید.
ابوالفضل
۱۴:۵۵ ۱۴۰۰/۱۰/۳۰
سلام استاد خوبید من همیشه از وبگو برای یادآوری آموزش هایی که دیدم استفاده میکنم الان توی یه پروژه بزرگ با یه مشکل مواجه شدم من میخوام سه شیفت رو مشخص کنم به صورت زیر:
از ساعت 6 تا 14 شیفت اول
از ساعت 14 تا 22 شیفت دوم
از ساعت 22 همان روز تا 6 صبح روز بعد! شیفت سوم
هر روشی بلد بودم رفتم نتونستم کاری کنم ممنون میشم راهنمایی کنید که چجوری باید عمل کنم
با توجه به توضیحات به نظر برای مشخص کردن شیفت ها می توانیم تاریخ شروع ساعت کاری را داشته باشیم و در گام های 8 ساعته (معادل 28800 ثانیه) سه شیفت را تعیین کنیم و در نهایت با دستورات شرطی وضعیت زمان درخواستی مورد نظر و اینکه در کدام شیفت کاری است بررسی شود، به طور مثال:
<?php
//شروع ساعت کاری یک روز
$base_date_time = strtotime('2021-11-1 06:00:00');
//echo $base_date_time;

//محاسبه سه شیفت 8 ساعته
$first_end = $base_date_time + 28800;
$second_end = $first_end + 28800;
$therth_end = $second_end + 28800;
//echo date("Y-m-d H:i:s", $therth_end);

//بررسی یک زمان دلخواه
$test_date_time = strtotime('2021-11-1 15:21:10');
if(($test_date_time >= $base_date_time) && ($test_date_time < $first_end)){
echo 'شیفت اول';
} elseif(($test_date_time >= $first_end) && ($test_date_time < $second_end)){
echo 'شیفت دوم';
} elseif(($test_date_time >= $second_end) && ($test_date_time < $therth_end)){
echo 'شیفت سوم';
}
?>
نکته ها:
- استفاده از تابع strtotime برای تبدیل تاریخ به معادل عددی Unix است تا عملیات ریاضی جمع و تفریق ساده تر شود.
- عدد 28800 معادل ثانیه هشت ساعت یا 3600 ثانیه در 8 است که 3600 مقدار زمان به ثانیه یک ساعت است (یعنی 60 دقیقه در 60 ثانیه).
m.b
۱۹:۲۵ ۱۴۰۰/۰۷/۰۲
تاریخ ها به صورت int 15 ذخیره شده در ستونی در دیتابیس newposts به نام date و به صورت مثلا
2021-09-10  11:22
ابتدا باید JDF را در صفحه include کرده باشید، سپس از نمونه الگوی زیر برای ویرایش کدها استفاده کنید:
include_once('jdf.php');
if ($result->num_rows > 0){
while($row = $result->fetch_assoc()) {
$date = $row["date"];
$array = explode(' ', $date);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute) = explode(':', $array[1]);
$second = 0;
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
$jalali_date = jdate("Y/m/d H:i:s", $timestamp);

echo '<li style="text-align:right;background:darkblue;background color:white;color:white"><a style="text-align:right;text-decoration:none;margin-top:30px;margin-right:2px;background:darkblue;background color:white;color:white" href="'.$row["link"].'">('.$jalali_date.') '.$row["titel"].'</br></a></li>';
}
}
دقت کنید میزان فضای خالی بین تاریخ و زمان یک Space باشد در غیر اینصورت باید به همان اندازه در تابع explode فاصله در نظر بگیرید.
m.b
۱۷:۵۳ ۱۴۰۰/۰۷/۰۲
سلام
تشکر بابت مطالب خوب و آموزنده تون.
یک سوال داشتم من میام اطلاعات را از دیتابیس فراخوانی می کنم و اطلاعات تاریخ ها به میلادی نمایش داده می شود نمونه کدهای من به صورت زیر هست امکانش هست ببنید در ادامه کدها چه چیزی باید بنویسم تا به تاریخ شمسی نمایش داده شود ممنون.
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("ارتباط برقرار نشد: " . $conn->connect_error);
}
$sql = "SELECT * FROM `newposts` ORDER BY `ID` DESC LIMIT 8";
$result = $conn->query($sql);

if ($result->num_rows > 0)
{
// output data of each row
while($row = $result->fetch_assoc()) {
echo '<li style="text-align:right;background:darkblue;background color:white;color:white"><a style="text-align:right;text-decoration:none;margin-top:30px;margin-right:2px;background:darkblue;background color:white;color:white" href="'.$row["link"].'">('.$row["date"].') '.$row["titel"].'</br></a></li>';
}
} else {
echo "تاکنون نوشته جدیدی ثبت نشده است ";
}
?>
برای تبدیل تاریخ میلادی به شمسی مقدار ذخیره شده در دیتابیس حین گرفتن خروجی باید تجزیه شود، لطفا یک نمونه تاریخی که در ستون date ثبت شده است را ارسال کنید تا نحوه تجزیه مشخص باشد.
محسن
۰۹:۳۳ ۱۳۹۹/۰۷/۱۱
سلام
من از فرم ساز گرویتی استفاده میکنم آیا امکان استفاده همچین چیزی رو میتونم داخلش داشته باشم آیا کدی داره که در قسمت سفارشی سازیش وارد کنم ؟
امکان استفاده از این کد در هر برنامه ای که به زبان PHP نوشته شده باشد وجود دارد منتها اینکه چطور کد را با برنامه هماهنگ کنید نیاز به این دارد که برنامه نویس باشید (بتوانید سورس های افزونه را تجزیه تحلیل کنید)، در مورد فرم ساز گرویتی متاسفانه این افزونه را بررسی نکرده ایم تا پاسخ دقیقی بدهیم اما ظاهرا تقویم شمسی برای این فرم ساز در سایت های ایرانی وجود دارد که ممکن است رایگان نباشند.
۱۴:۵۷ ۱۳۹۹/۰۶/۲۰
سلام
قبل از تبدیل تاریخ نوشتید مثلا
$date = '2016/8/25';
خب این مقدار تاریخ برای من در دیتابیس در جدولی بنام startedtm بصورت یونیکس نوشته شده و فراخوانیش که میکنم همون عدد یه تیکه نشون داده میشه.
چجوری بفهمونم این عدد یه تیکه چه تاریخی هست؟ یا راحت تر بپرسم کلا روش نمایش یک تاریخ یونیکس در جدول دیتابیس را چجوری به فرمت قابل فهم تبدیل کنم.
سپاس بسیار
در این صورت پس از استخراج برچسب زمان از دیتابیس به روش زیر آن را به تاریخ خوانا تبدیل کنید:
<?php 
//تنظیم منطقه زمانی
date_default_timezone_set('Asia/Tehran');

//زمان به صورت یونیکس، استخراج از دیتابیس
$timestamp = 1307595105;

//خروجی
$date = date('Y/m/d H:i:s', $timestamp);
?>
استخراج از دیتابیس را باید مطابق نمونه موجود در آموزش انجام دهید، در اینجا فرض بر این است که مقدار برچسب زمان از دیتابیس استخراج شده است، همچنین تنظیم منطقه زمانی اگر در برنامه انجام نشده باشد بهتر است مطابق نمونه بالا انجام شود (در غیر اینصورت منطقه زمانی از تنظیمات سرور پیروی می کند).
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
1 × 4
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
رقیه موسوی
سلام سایت منم بررسی میکنین کلن بهم ریختگی دارم در گوشی و سیستم
۱۴۰۳/۱۱/۰۳

سیدعباسی
با سلام و خسته نباشید این کد رو نگاه کنید شروع می شن رو حذف کنم و فقط متن لینک باقی بمونه ولی...
۱۴۰۳/۱۱/۰۲

امیرحسین
سلام وقت بخیر بنده میخوام با کمک curl دیتابیس پنل رو دانلود کنم و در یک فایل ذخیره کنم با دستور file_get_contents و ارسال...
۱۴۰۳/۱۰/۲۹

عباسی
با سلام و خسته نباشید چطوری می تونم با یک الگو متن داخل کد زیر رو پیدا کنم: با تشکر
۱۴۰۳/۱۰/۲۸

شریفی
اینجا هم یه سری توضیحات داده خیلی سر در نیاوردم
۱۴۰۳/۱۰/۲۴

شریفی
سلام وقت بخیر این نمونه هست که البته فقط توضیحاتش رو خوندم و خودم اسکریپت رو تست نکردم. فقط برام جالبه که...
۱۴۰۳/۱۰/۲۴

شریفی
سلام وقت بخیر خوب هستین انشالله؟ من به تازگی با کتابخانه سدیم آشنا شدم مثل اینکه میشه برای کدگذاری روی فایل php ازش...
۱۴۰۳/۱۰/۲۲

پرتو
سلام ممنونم از جوابتون اوکی مرسی از جواب ایمیل بله درسته جواب دادید و دیگ اینکه یه ایمیل دیگه هم تازگیا فرستادم ممنون میشم چک...
۱۴۰۳/۱۰/۰۸

پرتو
سلام خوبید خسته نباشید ببخشید یه سوال داشتم اولا بهتون ایمیل دادم جواب ندادین دوما میگن قالب هام ساده هستند چیکار می تونم بکنم بنظرتون...
۱۴۰۳/۱۰/۰۴

رضا
ممنونم از شما بابت وقتی که گذاشتید و پاسخ دادین. راستی یه سوال خدمت شما داشتم. بهترین راه برای اینکه بفهمیم که کاربر از...
۱۴۰۳/۰۹/۲۷

رضا
اصلاح می کنم دیکودر ایرانی یون ۱۲ هم گویا پیدا شده امان از دست ...
۱۴۰۳/۰۹/۲۱

رضا
سلام ممنون برای پاسخ خوبتون. فرمودین <نکته 1: با مبهم سازی، سورس ها همچنان قابل کپی هستند منتها برای انسان گیج کننده، نامفهوم و...
۱۴۰۳/۰۹/۲۱

رضا
سلام من چند ماهی هست که کلی روی یه پروژه سیستم مدیریت محتوا با زبان php کار کردم و پروژه کامل شده. قصد...
۱۴۰۳/۰۹/۲۰

ناشناس
سلام خسته نباشید وقتتون بخیر چطور می تونم با استفاده از حلقه وایل بزرگ ترین و کوچک ترین عدد را از بین چند عدد پیدا...
۱۴۰۳/۰۹/۱۸
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.