رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در تبدیل تاریخ شمسی به timestamp
#1
سلام
من از کتابخانه jdf استفاده می کنم، در جدول DB یک فیلد دارم به نام dtime که timestamp ها در آن ذخیره شده اند، کاربر در فرم یک تاریخ شمسی وارد می کند، مثلا :
۱۳۹۹/۰۵/۱۴
چطور می تونم این تاریخ را به timestamp تبدیل کنم که بتوانم بر اساس آن در ستون timestamp ها جستجو کنم؟

از مثال تابع jmktime استفاده کردم اما نتیجه نگرفتم.
$getTime = jmktime($D1);
پاسخ
تشکر شده توسط:
#2
سلام
تابع jmktime دارای ۸ پارامتر هست بصورت زیر:

jmktime( $hour , $minute , $second , $month , $day , $year , '' , $timezone );


پارامتر های تابع jmktime
hour$ : پارامتر اوّل ، ساعت ( 24 ساعته ، 23 - 0)
minute$ : پارامتر دوم ، دقیقه ( 59 - 0)
second$ : پارامتر سوم ، ثانیه ( 59 - 0)
month$ : پارامتر چهارم ، ماه ( 12 - 1)
day$ : پارامتر پنجم ، روز ( 31 - 1)
year$ : پارامتر ششم ، سال ( کامل 4 رقمی )
پارامتر هفتم ، در آن چیزی وارد نکنید. قبلاً $is_dst بود ، امّا در php5.1 منسوخ و در php7 حذف گردید.
timezone$ : پارامتر هشتم ، منطقه ی زمانی مورد نظر
جهت تنظیم یک منطقه ی زمانی برای اعمال اختلاف ساعت در خروجی است که مقدار پیشفرض آن به وقت تهران ، پایتخت جمهوری اسلامی ایران 'Asia/Tehran' می باشد
پاسخ
تشکر شده توسط:
#3
تشکر ، اما در عمل به چه شکل باید تاریخ ورودی کاربر مثلا "۱۳۹۹/۰۵/۱۴" را مجزاسازی کرد و به این تابع داد، مقادیر ساعت ، دقیقه و ثانیه درخواستی رو اگر به تاریخ الآن بدم که در بازه جستجو مشکل پیدا میشه با timestamp ثبت شده مغایرت پیدا میکنه؟!
پاسخ
تشکر شده توسط:
#4
الان از تابع تبدیل میلادی به شمسی این کتابخانه هم استفاده می کنم تاریخ رو به شکل صحیح تبدیل نمیکنه ،
$tm_grog = gregorian_to_jalali($y, $mf, $df, $mod);
خروجی نمونه :
1399-5-4
در صورتی که باید بدین شکل باشه :
1399-05-04
چطور می تونم اصلاح کنم؟
پاسخ
تشکر شده توسط:
#5
(14-05-1399، 04:33 ب.ظ)پیام حیاتی نوشته: تشکر ، اما در عمل به چه شکل باید تاریخ ورودی کاربر مثلا "۱۳۹۹/۰۵/۱۴" را مجزاسازی کرد و به این تابع داد، مقادیر ساعت ، دقیقه و ثانیه درخواستی رو اگر به تاریخ الآن بدم که در بازه جستجو مشکل پیدا میشه با timestamp ثبت شده مغایرت پیدا میکنه؟!

$str = "1399/01/01";

print_r (explode("/",$str))
Result:
Array ( [0] => 1399 [1] => 01 [2] => 01 )
پاسخ
تشکر شده توسط:
#6
(14-05-1399، 05:34 ب.ظ)artablog نوشته:
$str = "1399/01/01";

print_r (explode("/",$str))
Result:
Array ( [0] => 1399 [1] => 01 [2] => 01 )

<?php
                                   if (isset($_POST['subm-date-search'])) {
                                       $D1 = $_POST['d1'];
                                       $finalD1 = explode('/', $D1);
                                       $hour = date('h');
                                       $minute = date('i');
                                       $second = date('s');
                                       $month = $finalD1[1];
                                       $day = $finalD1[2];
                                       $year = $finalD1[0];
                                       $timezone = "";
                                      jmktime($hour, $minute, $second, $month, $day, $year, '', $timezone);
                                   }
                                   ?>

الان print_r می کنم خطا دارم باز :
Warning: mktime() expects at most 6 parameters, 7 given in 
دو پارامتر آخر اختیاری هست اما با حذف آنها هم باز خطای فوق برقراره
پاسخ
تشکر شده توسط:
#7
نقل قول:الان print_r می کنم خطا دارم باز :
Warning: mktime() expects at most 6 parameters, 7 given in 
دو پارامتر آخر اختیاری هست اما با حذف آنها هم باز خطای فوق برقراره

خطا نشون میده شما تابع mktime خود php  رو صدا زدین ببین تابع کتابخانه  JDF اینه jmktime 
کد زیر رو تو یه صفحه تست اجرا کن نتیجه درسته ضمنا خروجی  تابع jmktime آرایه نیست میتونی با echo  چاپ کنی
$hour = '22';
$minute = '45';
$second = '20';
$month = '09';
$day = '05';
$year = '1399';
$timezone = 'Asia/Tehran';
$date = jmktime($hour, $minute, $second, $month, $day, $year, '', $timezone);
echo $date;
Result:
1606331720
پاسخ
تشکر شده توسط: پیام حیاتی
#8
(15-05-1399، 09:09 ق.ظ)artablog نوشته: خطا نشون میده شما تابع mktime خود php  رو صدا زدین ببین تابع کتابخانه  JDF اینه jmktime 
کد زیر رو تو یه صفحه تست اجرا کن نتیجه درسته ضمنا خروجی  تابع jmktime آرایه نیست میتونی با echo  چاپ کنی
$hour = '22';
$minute = '45';
$second = '20';
$month = '09';
$day = '05';
$year = '1399';
$timezone = 'Asia/Tehran';
$date = jmktime($hour, $minute, $second, $month, $day, $year, '', $timezone);
echo $date;
Result:
1606331720
تشکر ، فایل jdf من قدیمی بود و حتی با دستور درست هم خطا داشتم فایل کتابخانه رو دوباره دریافت کردم از سایت که خروجی داد، "اما" در این تابع نیاز هست که ما زمان رو (ساعت ، دقیقه، ثانیه) وارد کنیم در غیر این صورت اگر فیلدها رو خالی بزارم عدد timestamp خروجی اشتباه می شود و در نهایت جستجو بدون نتیجه.
مثلا من الان دو رکورد دارم در تاریخ "1399/05/14"، اگر به تابع زمان های ثبت شده رو ندم، timestamp های این دو رکورد رو اشتباه سرچ میکنه.
چطور می تونم این مشکل رو حل کنم که تنها بر روی تاریخ متمرکز شه؟
کدهای بنده :
if(isset($_POST['SrchDateRange']) && !empty($_POST['txtDateStart'])) {
                                       $DateStart = mysqli_real_escape_string($conn, $_POST['txtDateStart']);
                                       $DateEnd = mysqli_real_escape_string($conn, $_POST['txtDateEnd']); 
                                       $D1 = explode("/", $DateStart);
                                       $hour = '09';
                                       $minute = '34';
                                       $second = '53';
                                       $month = $D1[1];
                                       $day = $D1[2];
                                       $year = $D1[0];
                                       $timezone = 'Asia/Tehran';
                                       $date = jmktime($hour, $minute, $second, $month, $day, $year, '', $timezone);
                                       echo $date . '<br />';

                                       $sql = "SELECT * FROM `whatsapp` WHERE `w_dtime` = $date";
                                       $result = $conn->query($sql);

                                       if ($result->num_rows > 0) {
                                       // output data of each row
                                       while($row = $result->fetch_assoc()) {
                                           echo "id: " . $row["w_id"]. " - bingo you got it <br>";
                                       }
                                       } else {
                                       echo "0 results";
                                       } 

                                      

                                       ?>

نحوه دریافت زمان ها:
date_default_timezone_set('Asia/Tehran');
            $tme = date("h:i:sa");  //get just time : 04:58:20am
           $time = time();


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
تشکر شده توسط:
#9
ببینید خیلی سادست  من زمان رو به صورت timestamp با کمک تابع time گرفتم و درج کردم چون طبق گفته اساتید نباید زمان رو شمسی گرفت و ...الان کاربر تاریخ رو شمسی وارد میکنه و من باید اول تبدیلش کنم که برای این کار تمام سایت هایی که سرچ کردم کتابخانه jdf و متد jmk رو معرفی کردن با یک مثال ساده که تمام مقادیر مورد نیاز تابع رو به صورت دستی وارد میکنن و اونطرف timestamp خروجی میگیرن، درست هم کار میکنه من اگر زمان درج رکورد رو  که شامل ساعت ، دقیقه و ثانیه هست رو بهش بدم timestamp درست رو میده و جستجو نتیجه میده، اما هیچ مثال کاربردی برای اینکه تابع رو به شکلی که تنها متمرکز روی تاریخ کنم که زمان رو بیخیال شه  پیدا نکردم.

گفتم اصلا این رو بیخیال میشم همون شمسی میگیرم، تابع geo رو معرفی کردن تست کردم دیدم تاریخ میلادی رو وقتی تبدیل میکنه به جای اینکه مثلا بشه :
1399/05/05
بدین شکل تبدیل میکنه:
1399/5/5

بدین شکل کوئری ها sql مثل between دیگه خروجی نمیدن چون شکل صحیح تاریخ برای ماه و روز باید دو رقمی باشه ، اینطوری من یک تاریخ رو هم نمیتونم سرچ کنم حالا فکر کنید بخوام یک بازه تاریخ رو سرچ بزنم که دیگه هیچ.

من از سایر زبان ها و کتابخانه های تهیه شده برای آنها اطلاعی ندارم اما آیا واقعا آنها هم به همین شکل درگیر یک سرچ میشن یا فقط در php کتابخانه مناسبی وجود نداره؟!
پاسخ
تشکر شده توسط:
#10
برای ساعت و دقیقه و ثانیه، توی تاریخ شروع صفر بگذارین و توی تاریخ پایان، لحظه‌ی انتهای روز:
$tsStart = jmktime(0, 0, 0, $sMonth, $sDay, $sYear);
$tsEnd = jmktime(23, 59, 59, $eMonth, $eDay, $eYear);
پاسخ
تشکر شده توسط: پیام حیاتی
#11
(21-05-1399، 11:07 ق.ظ)ADMIN نوشته: برای ساعت و دقیقه و ثانیه، توی تاریخ شروع صفر بگذارین و توی تاریخ پایان، لحظه‌ی انتهای روز:
$tsStart = jmktime(0, 0, 0, $sMonth, $sDay, $sYear);
$tsEnd = jmktime(23, 59, 59, $eMonth, $eDay, $eYear);

بازهم timestamp درست برگشت داده نمیشه
پاسخ
تشکر شده توسط:
#12
کلاً jdf یه مقدار باگ داره بهتره از کتابخانه‌ی jdate استفاده کنین
پاسخ
تشکر شده توسط: artablog




کاربران در حال بازدید این موضوع: 1 مهمان