كيفية عرض تاريخ اسم ISO 8601 مع PHP
-
05-09-2019 - |
سؤال
أحاول عرض 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 الخاصة بي.
أي أفكار ماذا يحدث خطأ؟
نصائح أخرى
باستخدام فئة 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));
}