PDA

View Full Version : کد نمایش زمان گذشته از انتشار یک مطلب بصورت زنده (مانند فیسبوک)



sajjad405
دوشنبه 18 خرداد 1394, 23:00 عصر
سلام و عرض ادب خدمت دوستان عزیز
ببخشید همونطوری که از اسم تاپیک مشخص هست، بنده دنبال یک کدی میگردم که زمان انتشار از یک مطلب رو بصورت زنده نشون بده، نمونه این کد رو تو فیسبوک دیدیم... که بدون رفرش صفحه نشون بده مثلا 10 ثانیه قبل، 1 دقیقه قبل، 2 دقیقه قبل و ...
این کد رو برای وسایت خبریم میخوام که تحت وردپرس هست...
از دوستان و اساتید ممنون میشم راهنمایی بفرمایید...
مرسی

Unique
سه شنبه 19 خرداد 1394, 00:28 صبح
نه آجاکس نمیخواد ، کافیه زمان خبر را به صورت timestamp بگیرید و به تابع زیر بدین ، فقط منتن هاش را فارسی کنید :

function timeDifference(current, previous) {

var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;

var elapsed = current - previous;

if (elapsed < msPerMinute) {
return Math.round(elapsed/1000) + ' seconds ago';
}

else if (elapsed < msPerHour) {
return Math.round(elapsed/msPerMinute) + ' minutes ago';
}

else if (elapsed < msPerDay ) {
return Math.round(elapsed/msPerHour ) + ' hours ago';
}

else if (elapsed < msPerMonth) {
return 'approximately ' + Math.round(elapsed/msPerDay) + ' days ago';
}

else if (elapsed < msPerYear) {
return 'approximately ' + Math.round(elapsed/msPerMonth) + ' months ago';
}

else {
return 'approximately ' + Math.round(elapsed/msPerYear ) + ' years ago';
}
}

sajjad405
سه شنبه 19 خرداد 1394, 00:35 صبح
نه آجاکس نمیخواد ، کافیه زمان خبر را به صورت timestamp بگیرید و به تابع زیر بدین ، فقط منتن هاش را فارسی کنید :

function timeDifference(current, previous) {

var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;

var elapsed = current - previous;

if (elapsed < msPerMinute) {
return Math.round(elapsed/1000) + ' seconds ago';
}

else if (elapsed < msPerHour) {
return Math.round(elapsed/msPerMinute) + ' minutes ago';
}

else if (elapsed < msPerDay ) {
return Math.round(elapsed/msPerHour ) + ' hours ago';
}

else if (elapsed < msPerMonth) {
return 'approximately ' + Math.round(elapsed/msPerDay) + ' days ago';
}

else if (elapsed < msPerYear) {
return 'approximately ' + Math.round(elapsed/msPerMonth) + ' months ago';
}

else {
return 'approximately ' + Math.round(elapsed/msPerYear ) + ' years ago';
}
}
داداش مرسی از پاسخت، ولی من برای نشون دادن زمان گذشته از ارسال پست مشکلی ندارم و کدش رو دارم، تو لینکی که گذاشتم میتونید مشاهده کنید، مشکل من اینه که زمان گذشته بصورت خودکار بروز نمیشه (مثل فیسبوک) و با هر بار رفرش صفحه زمان گذشته از مطلب بروز میشه، من میخوام این قضیه بدون رفرش صفحه و بصورت زنده باشه...

Keramatifar
سه شنبه 19 خرداد 1394, 12:22 عصر
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<meta name="author" content="Keramatifar" />

<title>Barnamenevis Examples</title>
</head>

<body>

<?php
$postTimestamp = mktime(23,59,12,6,28,2012);
$postShowDate = date('H:i:s A', $postTimestamp);
echo "<p>Date: <span id='tarikh'>$postShowDate</span></p>";

?>

<script>
function show_clock(){
my_element = document.getElementById("tarikh")
var tt = new Date().getTime();
var my_date = new Date(<?php echo $postTimestamp; ?>);
var hours = my_date.getHours()
var minutes = my_date.getMinutes()
var seconds = my_date.getSeconds()

var dn="PM"
if (hours<=1 && minutes<=50)
my_element.innerHTML= "kamtar az 1 saat ghabl"
else if (hours<=1 && minutes<=1)
my_element.innerHTML= "kamtar az ... ghabl"
else
my_element.innerHTML= '... ghabl'
setTimeout("show_clock()",1000)
}
show_clock()

</script>

</body>
</html>

Unique
سه شنبه 19 خرداد 1394, 15:25 عصر
داداش مرسی از پاسخت، ولی من برای نشون دادن زمان گذشته از ارسال پست مشکلی ندارم و کدش رو دارم، تو لینکی که گذاشتم میتونید مشاهده کنید، مشکل من اینه که زمان گذشته بصورت خودکار بروز نمیشه (مثل فیسبوک) و با هر بار رفرش صفحه زمان گذشته از مطلب بروز میشه، من میخوام این قضیه بدون رفرش صفحه و بصورت زنده باشه...

جناب کرامتی فر جواب دادن اما فقط لازم بود اشاره کنن همین تابعی که من دادم را با setTimeout در پایانش دوباره صدا بزنین. همین.

sajjad405
سه شنبه 19 خرداد 1394, 20:33 عصر
سلام مجدد
از هر دو دوست و سرور گرامی تشکر میکنم بابت راهنمایی هاتون، من با تلفیقی از کد شما به این کد رسیدم:


<?php
$gmt_timestamp = get_post_time('U', false);
$postShowDate = date('H:i:s A', $gmt_timestamp);
echo "<p>Date: <span id='tarikh'>$postShowDate</span></p>";

?>
<script>
function show_clock(){
my_element = document.getElementById("tarikh")
var tt = getTime();
var my_date = new Date(<?php echo $gmt_timestamp ?>);

var msPerMinute = 60 * 1000;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;

var elapsed = tt - my_date;

if (elapsed < msPerMinute) {
my_element.innerHTML= Math.round(elapsed/1000) + ' seconds ago';
}
else if (elapsed < msPerHour) {
my_element.innerHTML= Math.round(elapsed/msPerMinute) + ' minutes ago';
}

else if (elapsed < msPerDay ) {
my_element.innerHTML= Math.round(elapsed/msPerHour ) + ' hours ago';
}

else if (elapsed < msPerMonth) {
my_element.innerHTML= 'approximately ' + Math.round(elapsed/msPerDay) + ' days ago';
}

else if (elapsed < msPerYear) {
my_element.innerHTML= 'approximately ' + Math.round(elapsed/msPerMonth) + ' months ago';
}

else {
my_element.innerHTML= 'approximately ' + Math.round(elapsed/msPerYear ) + ' years ago';
}

setTimeout("show_clock()",1000)
}
show_clock()

</script>

زمان انتشار مطلب در وردپرس رو پیدا و در متغیر $gmt_timestamp قرار میدم، و سپس چاپش میکنم، اما نکته ای که وجود داره اینه که فقط الان کد تا خط سوم یعنی چاپ متغیر $postShowDate کار میکنه، و بخش مربوط به اسکریپت عمل نمیکنه، ممکنه یک نگاهی بندازید و اگه ایرادی چیزی هست راهنمایی کنید که چرا عمل نمیکنه؟

من میخوام بعد اینکه صفحه بار گذاری شد، و مثلا تاریخ انتشار نشون داده شد 2 دقیقه قبل، دیگه بصورت اتوماتیک و بدون رفرش صفحه مثلا بشه 3 دقیقه قبل، 4 دقیقه قبل و الی آخر...

مرسی

Unique
سه شنبه 19 خرداد 1394, 21:37 عصر
این جواب میده ، تغییرش بده و استفاده کن :


<?php
echo "<p>Date: <span id='tarikh'>".gmdate("Y-m-d H:i:s")."</span></p>";

?>
<script>

function timeDifference() {
var msPerMinute = 60;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var ret = "";

d = new Date();
var elapsed = (d.getTime() / 1000) - <?php echo time();?>;

if (elapsed < msPerMinute) {
ret = Math.floor(elapsed) + ' seconds ago';
}

else if (elapsed < msPerHour) {
ret = Math.floor(elapsed/msPerMinute) + ' minutes ago';
}

else if (elapsed < msPerDay ) {
ret = Math.floor(elapsed/msPerHour ) + ' hours ago';
}

else if (elapsed < msPerMonth) {
ret = 'approximately ' + Math.floor(elapsed/msPerDay) + ' days ago';
}

else if (elapsed < msPerYear) {
ret = 'approximately ' + Math.floor(elapsed/msPerMonth) + ' months ago';
}

else {
ret = 'approximately ' + Math.floor(elapsed/msPerYear ) + ' years ago';
}

document.getElementById("tarikh").innerHTML = ret;
setTimeout(function(){timeDifference();},1000);
}
timeDifference();
</script>

sajjad405
چهارشنبه 20 خرداد 1394, 10:26 صبح
سلام
مرسی داداش گلم کار کرد، فقط یه سوال، من زمان انتشار مطلب در وردپرس رو با این تابع میتونم بدست بیارم و در یک متغیر بزارم، میشه راهنمایی کنی که چطوری باید این کد رو تغییر بدم که به اون فرمی که من میخوام در بیاد؟

$gmt_timestamp = get_post_time('U', false);
الان این کدی که لطف کردی دادی، بعد باز شدن صفحه، از زمان صفر شروع میکنه و میشماره میره بالا، من میخوام از زمان انتشار پست شروع کنه بشماره و ادامه بده... مرسی:قلب:

sajjad405
چهارشنبه 20 خرداد 1394, 11:11 صبح
ببخشید یه سوال دیگه هم داشتم، چطور میتونم تو اسکریپت، آی دی المنت رو با استفاده از کد پی اچ پی بدست بیارم؟ این کد رو امتحان کردم نشد:

document.getElementById("<?php the_ID(); ?>").innerHTML = ret;

همینطور این کد:

document.getElementById('<?php the_ID(); ?>').innerHTML = ret;

بازم ممنون

Unique
چهارشنبه 20 خرداد 1394, 13:41 عصر
راستش من با wordpress تا حالا کار نکردم اما همون زمام پستی که نوشتین باید کار کنه و در مورد ID هم متاسفانه نمیدونم.

farzad-kh
چهارشنبه 20 خرداد 1394, 16:08 عصر
برای سوال اول فرم تاریخی که بهت میده رو بزار اینجا
برای آیدی اگه توی وردپرس کار میکنی این دوتا لینک
https://codex.wordpress.org/Function_Reference/the_ID
https://codex.wordpress.org/Function_Reference/get_the_ID

mahdiak
چهارشنبه 20 خرداد 1394, 16:24 عصر
این جواب میده ، تغییرش بده و استفاده کن :


<?php
echo "<p>Date: <span id='tarikh'>".gmdate("Y-m-d H:i:s")."</span></p>";

?>
<script>

function timeDifference() {
var msPerMinute = 60;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var ret = "";

d = new Date();
var elapsed = (d.getTime() / 1000) - <?php echo time();?>;

if (elapsed < msPerMinute) {
ret = Math.floor(elapsed) + ' seconds ago';
}

else if (elapsed < msPerHour) {
ret = Math.floor(elapsed/msPerMinute) + ' minutes ago';
}

else if (elapsed < msPerDay ) {
ret = Math.floor(elapsed/msPerHour ) + ' hours ago';
}

else if (elapsed < msPerMonth) {
ret = 'approximately ' + Math.floor(elapsed/msPerDay) + ' days ago';
}

else if (elapsed < msPerYear) {
ret = 'approximately ' + Math.floor(elapsed/msPerMonth) + ' months ago';
}

else {
ret = 'approximately ' + Math.floor(elapsed/msPerYear ) + ' years ago';
}

document.getElementById("tarikh").innerHTML = ret;
setTimeout(function(){timeDifference();},1000);
}
timeDifference();
</script>

دوست من اگر بخواهیم این مورد را در صفحه ای پیاده کنیم که با حلقه 10 تا پست را نمایش میده و هر پست تایم استمپ خودش را داره چطوری میتونیم کد را ویرایش کنیم ؟

farzad-kh
چهارشنبه 20 خرداد 1394, 16:48 عصر
بعد از تاریخ یه آیدی هم بزار خب(آیدی پست یا ترتیب پستا بر اساس موقعیت در صفحه)

sajjad405
چهارشنبه 20 خرداد 1394, 17:32 عصر
بعد از تاریخ یه آیدی هم بزار خب(آیدی پست یا ترتیب پستا بر اساس موقعیت در صفحه)
سلام مرسی از پاسخت
چطوری میتونم آیدی مطلب رو که با دستور the_ID پیدا میکنم بزارم تو دستور

document.getElementById("tarikh").innerHTML = ret;
مثلا من از این دستور استفاده کردم که شما فرمودی و آی دی مطلب رو گذاشتم تو متغیر linkid:

var linkid = <?php the_ID(); ?>;
حالا چطور باید متغیر linkid رو بزارم تو دستور document.getElementById("tarikh").innerHTML به جای tarikh ؟
ممنون از راهنماییتون

sajjad405
چهارشنبه 20 خرداد 1394, 17:39 عصر
راستش من با wordpress تا حالا کار نکردم اما همون زمام پستی که نوشتین باید کار کنه و در مورد ID هم متاسفانه نمیدونم.

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


<?php
$gmt_timestamp = get_the_time('Y/m/d H:i:s', $the_query->ID);
echo "انتشار: <span id='tarikh'>"; echo $gmt_timestamp; echo "</span>"; ?>
<script>

function timeDifference() {
var msPerMinute = 60;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var linkid = <?php the_ID(); ?>;
var ret = "";

d = new Date();
var elapsed = (d.getTime() / 1000) - <?php $gmt_timestamp?>;

if (elapsed < msPerMinute) {
ret = Math.floor(elapsed) + ' ثانیه پیش';
}

else if (elapsed < msPerHour) {
ret = Math.floor(elapsed/msPerMinute) + ' دقیقه پیش';
}

else if (elapsed < msPerDay ) {
ret = Math.floor(elapsed/msPerHour ) + ' ساعت پیش';
}

else if (elapsed < msPerMonth) {
ret = 'approximately ' + Math.floor(elapsed/msPerDay) + ' روز پیش';
}

else if (elapsed < msPerYear) {
ret = 'approximately ' + Math.floor(elapsed/msPerMonth) + ' ماه پیش';
}

else {
ret = 'approximately ' + Math.floor(elapsed/msPerYear ) + ' سال پیش';
}

document.getElementById("tarikh").innerHTML = ret;
setTimeout(function(){timeDifference();},1000);
}
timeDifference();
</script>
یعنی زمان مطلب رو بدست میارم و میزارم تو متغیر، خروجی متغیر $gmt_timestamp که جلوی کلمه ی انتشار چاپ میشه مثلا برای یک پست،به این صورت هست:
انتشار : ۱۳۹۴/۰۳/۲۰ ۱۱:۲۴:۰۵
میشه لطفا راهنمایی بفرمایید که چطور اختلاف زمان فعلی سرور و زمان پست رو (زمان نوشته شده جلوی کلمه انتشار ) محاسبه کنم؟
مرسی از لطفت

Unique
چهارشنبه 20 خرداد 1394, 20:05 عصر
این داره زمان را شمسی میده ! باید میلادیش را بگیری با تابع strtotime تبدیل به timestamp کنی.

sajjad405
چهارشنبه 20 خرداد 1394, 20:52 عصر
این داره زمان را شمسی میده ! باید میلادیش را بگیری با تابع strtotime تبدیل به timestamp کنی.

داداش میشه خواهش کنم کدش رو بنویسی؟

Unique
پنج شنبه 21 خرداد 1394, 00:17 صبح
اینباید جواب بده :


<?php
$gmt_timestamp = get_post_time("U",true,$the_query->ID);
echo "انتشار: <span id='tarikh'></span>";
?>
<script>

function timeDifference() {
var msPerMinute = 60;
var msPerHour = msPerMinute * 60;
var msPerDay = msPerHour * 24;
var msPerMonth = msPerDay * 30;
var msPerYear = msPerDay * 365;
var ret = "";

d = new Date();
var elapsed = (d.getTime() / 1000) - <?php echo $gmt_timestamp; ?>;

if (elapsed < msPerMinute) {
ret = Math.floor(elapsed) + ' ثانیه پیش';
}

else if (elapsed < msPerHour) {
ret = Math.floor(elapsed/msPerMinute) + ' دقیقه پیش';
}

else if (elapsed < msPerDay ) {
ret = Math.floor(elapsed/msPerHour ) + ' ساعت پیش';
}

else if (elapsed < msPerMonth) {
ret = 'approximately ' + Math.floor(elapsed/msPerDay) + ' روز پیش';
}

else if (elapsed < msPerYear) {
ret = 'approximately ' + Math.floor(elapsed/msPerMonth) + ' ماه پیش';
}

else {
ret = 'approximately ' + Math.floor(elapsed/msPerYear ) + ' سال پیش';
}

document.getElementById("tarikh").innerHTML = ret;
setTimeout(function(){timeDifference();},1000);
}
timeDifference();
</script>

sajjad405
پنج شنبه 21 خرداد 1394, 00:36 صبح
داداش واقعا مرسی که وقت میزاری و راهنمایی میکنی، امتحان کردم کد رو، برای مطلبی که دیروز منتشر شده، میزنه تقریبا 20 روز پیش، فکر کنم ساعت ها باید کمی تغییر کنن بازم، واقعا نمیدونم باید کجاش رو تغییر بدم وگرنه به شما زحمت نمیدادم عزیز...این سه تا لینک مربوط به دستور گرفتن زمان پست ها و فرمتشون در وردپرس هست شاید کمکت کنه:
https://codex.wordpress.org/Template_Tags/get_post_time
https://codex.wordpress.org/Function_Reference/get_the_time
https://codex.wordpress.org/Formatting_Date_and_Time

بازم تشکر

Unique
پنج شنبه 21 خرداد 1394, 02:33 صبح
خروجی این چی میده ؟

get_post_time("U",true,$the_query->ID)

هر چی هست مشکل از همینه ، چک کن ببین اگه خروجیش را بدی به تابع date چی میگیری :

date("Y-m-d H:i:s",get_post_time("U",true,$the_query->ID));

sajjad405
پنج شنبه 21 خرداد 1394, 03:47 صبح
خروجی این چی میده ؟

get_post_time("U",true,$the_query->ID)

هر چی هست مشکل از همینه ، چک کن ببین اگه خروجیش را بدی به تابع date چی میگیری :

date("Y-m-d H:i:s",get_post_time("U",true,$the_query->ID));

سلام مجدد
فکر کنم فهمیدم مشکل کار از کجاست، البته هنوز جوابی براش پیدا نکردم، ببین من زمان ارسال پست رو به ثانیه بدست آوردم، همینطور زمان فعلی رو هم به ثانیه بدست آوردم. و توسط دستور php این دو مقدار رو از هم کم کردم، و مثلا به مقدار 3456 ثانیه رسیدم، ولی وقتی این مقدار رو که داخل متغیر php هستو تو متغیر elapsed اسکریپت میزارم، عددش تغییر میکنه، مثلا میشه 17342453 که نمیدونم دلیلش چی هست واقعا...!


زمان پست به ثانیه مثلا 1433975588 $gmt_timestamp2 = get_the_time('U');
زمان فعلی به ثانیه مثلا 1433979044 $gmt_timestamp4 = current_time('timestamp');
اختلاف دو زمان مثلا 3456 ثانیه $gmttimestamp = $gmt_timestamp4 - $gmt_timestamp2;

جایگذاری در اسکریپت:
var elapsed = <?php echo $gmttimestamp; ?> ;
خروجی که میده!!! 1723945


جالبتر اینه که بصورت خطی تغییر نمیکنه، وبا هربار رفرش صفحه، از تقسیم عدد خروجی متغیر elapsed تقسیم بر خروجی gmttimestamp یک عدد متفاوت میاد...
این کد :

$sajjad = date("Y-m-d H:i:s",get_post_time("U",true,$the_query->ID));
هم ازش خروجی گرفتم که اینو نشون میده: 2015-06-10 22:33:08
بعد از دو سه ساعتی که با این کد ها کلنجار رفتم یقین دارم مشکل از این خط هست:

var elapsed = (d.getTime() / 1000) - <?php echo ($gmt_timestamp); ?> ;
چون از کد زیر خروجی گرفتم، این مقدار رو نشون میده: 1433978919

var elapsedd = (d.getTime() / 1000);
و این کد هم :

$gmt_timestamp = get_post_time("U",true,$the_query->ID);
خروجیش شد این : 1433975560
قاعتا دستور تفریق این دو از هم باید عدد 3,359 رو نشون میداد، ولی یک عدد هفت رقمی بی ربط خروجی داد...!!
تمام دستور ها خروجی درستی میدن، و وقتی که به این خط میرسه و ازش خروجی میگیرم، به جای اینکه مثلا جواب رو بیاره 3456 ثانیه، یه عدد عجیب و قریب هفت رقمی میاره، این اتفاق هم وقتی که اختلاف زمان پست و زمان فعلی رو با دستور php حساب میکنم و متغیر نهایی رو میزارم تو var elapsed میفته، هم وقتی که اختلاف دو زمان رو تو خود اسکریپت حساب میکنم... بنظرت مشکل از کجاست؟

مرسی و ممنون

Unique
پنج شنبه 21 خرداد 1394, 12:02 عصر
عجیبه ، اصل کد صفحه ای که این مشکلات توش هست را پیام خصصوی کن تا چک کنم.

sajjad405
پنج شنبه 21 خرداد 1394, 13:12 عصر
عجیبه ، اصل کد صفحه ای که این مشکلات توش هست را پیام خصصوی کن تا چک کنم.

ارسال شد
سپاس

farzad-kh
جمعه 22 خرداد 1394, 18:23 عصر
همه تاریخا میخوای یه دفعه عوش بشه؟