سؤال

أحاول عرض DateTime من قاعدة بيانات MySQL الخاصة بي باعتبارها سلسلة ISO 8601 المشكلة مع PHP ولكنها تخرج خطأ.

17 أكتوبر 2008 يخرج على النحو التالي: 1969-12-31T18: 33: 28-06: 00 من الواضح أنه غير صحيح (يجب أن يكون العام 2008 ليس 1969)

هذا هو الرمز الذي أستخدمه:

<?= date("c", $post[3]) ?>

$post[3] is the datetime (CURRENT_TIMESTAMP) من قاعدة بيانات MySQL الخاصة بي.

أي أفكار ماذا يحدث خطأ؟

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

المحلول

الحجة الثانية من date هو Timestamp UNIX، وليس سلسلة طابع طابع قاعدة البيانات.

تحتاج إلى تحويل Drivestamp قاعدة البيانات الخاصة بك strtotime.

<?= date("c", strtotime($post[3])) ?>

نصائح أخرى

باستخدام فئة DateTime متوفر في PHP الإصدار 5.2 فسيتم القيام به مثل هذا:

$datetime = new DateTime('17 Oct 2008');
echo $datetime->format('c');

أراها في العمل

اعتبارا من PHP 5.4 يمكنك القيام بذلك باعتباره بطانة واحدة:

echo (new DateTime('17 Oct 2008'))->format('c');

النمط الإجرائي:

echo date_format(date_create('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

نمط وجوه الموجهة:

$formatteddate = new DateTime('17 Oct 2008');
echo $datetime->format('c');
// Output : 2008-10-17T00:00:00+02:00

الهجين 1:

echo date_format(new DateTime('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

الهجين 2:

echo date_create('17 Oct 2008')->format('c');
// Output : 2008-10-17T00:00:00+02:00

ملاحظات :

1) يمكنك أيضا استخدام 'Y-m-d\TH:i:sP' كبديل ل 'c' لتنسيقك.

2) المنطقة الزمنية الافتراضية لإدخالك هي المنطقة الزمنية لخادمك. إذا كنت تريد أن تكون المدخلات لمنطقة زمنية مختلفة، فأنت بحاجة إلى ضبط المنطقة الزمنية بشكل صريح. سيؤثر ذلك أيضا على إخراجك، ومع ذلك:

echo date_format(date_create('17 Oct 2008 +0800'), 'c');
// Output : 2008-10-17T00:00:00+08:00

3) إذا كنت تريد أن يكون الإخراج لمنطقة زمنية مختلفة عن شكل إدخالك، فيمكنك تعيين المنطقة الزمنية بشكل صريح:

echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2008-10-16T18:00:00-04:00

ل Pre PHP 5:

function iso8601($time=false) {
    if(!$time) $time=time();
    return date("Y-m-d", $time) . 'T' . date("H:i:s", $time) .'+00:00';
}

هذه هي الوظيفة الجيدة ل Pre Php 5: أضيفت اختلاف GMT في النهاية، إنها ليست مسدودة.

function iso8601($time=false) {
    if ($time === false) $time = time();
    $date = date('Y-m-d\TH:i:sO', $time);
    return (substr($date, 0, strlen($date)-2).':'.substr($date, -2));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top