سؤال

أقوم بإنشاء تعليقات مخزنة في قاعدة بيانات MySQL.

أقوم بتسجيل وظيفة وقت PHP time() كما يتم نشر التعليق.بهذه الطريقة تظهر رسالة مثل..."تعليق...تم النشر منذ 4 ثوانٍ" وإذا قمت بتحديث الصفحة بعد دقيقتين فستعرض "تعليق...تم النشر منذ دقيقتين"

وهنا كيف أنا أدخل time() في قاعدة البيانات مع البيانات الأخرى:

$date=time();

// Insert data into mysql
$sql="INSERT INTO testimonials (username, comment, date) 
  VALUES ('$username', '$comment', '$date')";

الآن...أنا الاستيلاء على البيانات مثل هذا:

while ($row = mysql_fetch_row($result) )
{
  echo "<b>Random Comment</b></br>";
  echo ("<p>\n> $row[1]"); //comment
  echo ("</br>-$row[0]</p>"); //name
  echo ("</br>$row[2]"); //date

نموذج الإخراج على الخادم الخاص بي هو:

تعليق عشوائي

هذا هو أروع تعليق على الإطلاق !!!!

-كايل

1278905319

كيف يمكنني تحويل الوقت "1278905319" إلى تنسيق قابل للقراءة مثل "تم النشر منذ 4 ثوانٍ" أو شيء يتعامل مع الثواني والدقائق والساعات والأيام والأسابيع والشهور والسنوات؟

هل PHP هي الطريقة الخاطئة للقيام بذلك؟قرأت عن الطابع الزمني لـ MySQL ولكني لا أفهم ذلك أو كيفية جعله يعمل في حالتي.

لذا فإن سؤالي الرئيسي هو كيفية تنسيق الوقت في وقت يمكن قراءته عند الإخراج."منذ ثانيتين"

شكرًا لك.=)

هل كانت مفيدة؟

المحلول

وهنا وظيفة وجدت هنا, كتبه جون ماكلومفا:

<?php
function RelativeTime($timestamp){
    $difference = time() - $timestamp;
    $periods = array("sec", "min", "hour", "day", "week", "month", "years", "decade");
    $lengths = array("60","60","24","7","4.35","12","10");

    if ($difference > 0) { // this was in the past
        $ending = "ago";
    } else { // this was in the future
        $difference = -$difference;
        $ending = "to go";
    }       
    for($j = 0; $difference >= $lengths[$j]; $j++) $difference /= $lengths[$j];
    $difference = round($difference);
    if($difference != 1) $periods[$j].= "s";
    $text = "$difference $periods[$j] $ending";
    return $text;
}

نصائح أخرى

أولاً، اسمح لـ MySQL بإدراج التاريخ نيابةً عنك باستخدام حقل الطابع الزمني الذي يتم تحديثه تلقائيًا:

CREATE TABLE `table_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(255),
  `comment` TEXT,
  `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

بهذه الطريقة، لا داعي للقلق بشأن إدراج التاريخ من كود PHP الخاص بك، وإذا أجريت أي اختبار من مكان آخر - من عميل MySQL، على سبيل المثال، فسيتم إدراج التاريخ بشكل صحيح.

يجب عليك أيضًا استخدام PHP فئة التاريخ والوقت (يتطلب PHP 5.3.0 أو أحدث)، لأنه يجعل العمل مع التواريخ والأوقات أمرًا بسيطًا للغاية.فيما يلي مثال للحصول على بعض المعلومات من قاعدة البيانات، وإرجاع فاصل زمني منسق:

$result = $mysqli->query(
    'SELECT ' .
    '`id`, ' .
    '`username`, ' .
    '`comment`, ' .
    '`date`, ' .
    'NOW(), ' .
    'FROM table');

$row = $result->fetch_assoc();

print_r($row);
Array
(
    [id] => 1
    [username] = 'Fred'
    [comment] = 'My first post'
    [date] => 2009-09-28 07:08:12
    [now] => 2010-07-12 08:47:03
)

$now = new DateTime($row['now']);
$post = new DateTime($row['date']);
$interval = $post->diff($now);
echo $interval->format('%m months, %d days, %d days, %h hours, %m minutes, %s seconds');

// 9 months, 14 days, 14 days, 1 hours, 9 minutes, 51 seconds

يمكنك تنسيق الفاصل الزمني كيفما تشاء باستخدام DateInterval::تنسيق حدود.عن طريق الحصول على MySQL للعودة NOW(), ، فإنك تتأكد من تجنب أي تناقض في الوقت بين خادم التطبيق الخاص بك (الخادم الذي يقوم بتشغيل PHP) وخادم قاعدة البيانات الخاصة بك.

إذا كنت بحاجة إلى حسابات زمنية معقدة، راجع DateHelper الخاص بـsymfony، على وجه الخصوص distance_of_time_in_words كما وجدت في مصدر.هذه طريقة قوية جدًا تعرف حسابًا دقيقًا جدًا للوقت (على سبيل المثال.منذ 5 ثوانٍ، منذ 20 ثانية، منذ دقيقة واحدة تقريبًا، منذ 10 دقائق،...)


إذا كنت ترغب فقط في الحصول على تاريخ منسق, ، يمكنك تنسيقه عبر MySQL:

SELECT your_fields, FROM_UNIXTIME(date, 'H:%i:%s') FROM table;

سيعطيك 12:24:59 على سبيل المثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top