سؤال

أنا أبحث عن وظيفة مماثلة DateTime :: createfromformat لكنني بحاجة إلى العمل في بيئة تدير إصدارًا من PHP أكبر من V5.3. في الأساس ، أحتاج إلى تقديم تنسيق ، مثلما كنت تستخدمه مع تاريخ() الوظيفة ، وبعد ذلك أحتاج إلى تحليل/التحقق من صحة سلسلة مقابل هذا التنسيق ، وإرجاع الطابع الزمني إذا تم تنسيق السلسلة بشكل صحيح وتاريخ صالح.

أي شخص يعرف أين يمكنني العثور على شيء من هذا القبيل ، أو هل يجب أن أكتبه بنفسي؟

مرة أخرى ، يجب أن يعمل هذا بتنسيق محدد ، يتم توفيره كحجة. يمكن أن يكون التنسيق أي شيء ، لذلك لا يوجد ضمان يمكنني استخدامه فقط strtotime ().

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

المحلول

DateTime::createFromFormat و date_parse_from_format تمت إضافة في PHP 5.3 لأنه كان هناك طلب كبير على هذه الميزة ، وخاصة من المتقدمين الذين يرمزون للمستخدمين الذين لا يستخدمون تنسيقات التاريخ/الوقت لنا.


قبل هؤلاء ، كان عليك تطوير وظيفة محددة لتحليل التنسيق الذي كنت تستخدمه ؛ مع PHP <5.3 ، ما يتم فعله بشكل عام هو:

  • حدد التنسيق الذي سيتم قبوله من خلال التطبيق
  • عرض بعض الرسائل تقول شيئًا مثل "يجب أن تكون مدخلاتك JJ/MM/AAAA" (الفرنسية لـ DD/MM/Yyyy)
  • تحقق من أن الإدخال على ما يرام ، فيما يتعلق بهذا التنسيق
  • وتحليله لتحويله إلى تاريخ/وقت يمكن أن يفهمه PHP.

مما يعني أن التطبيقات والتطوير عمومًا لم تسمح بالعديد من التنسيقات ، حيث أن كل تنسيق يعني وظيفة التحقق الإضافية المختلفة+وظيفة التحليل.


إذا كنت بحاجة حقًا إلى هذا النوع من الوظائف ، فهذا يسمح بأي تنسيق ممكن ، أخشى أن تضطر إلى كتابته بنفسك :-(

ربما نلقي نظرة على مصادر date_parse_from_format يمكن أن تساعد ، إذا فهمت رمز C؟ يجب أن يكون في شيء مثل ext/date/php_date.c - ولكن لا يبدو بهذه البساطة: إنه يدعو إلى timelib_parse_from_format الوظيفة التي يتم تعريفها في ext/data/lib/parse_date.c, ، ولا تبدو ودية ^ ^

نصائح أخرى

يمكنك استخدام فئة Zend_Date من Zend Framework: http://framework.zend.com/manual/en/zend.date.html

$date = new Zend_Date($string, $format);
$timestamp = $date->get();

يمكنك استخدام strptime() - إنه يستخدم strftime() صيغة. مختلف بعض الشيء مقارنة مع date() تنسيق ولكن يفعل نفس الأشياء تقريبا.

function createFromFormat($strptimeFormat, $date) {
    $date = strptime($date, $strptimeFormat);
    $date['tm_year'] += 1900;
    $date['tm_mon']++;
    $timestamp = mktime($date['tm_hour'], $date['tm_min'], $date['tm_sec'], $date['tm_mon'], $date['tm_mday'], $date['tm_year']);
    return new DateTime('@'. $timestamp);
}

لإصدار PHP قبل 5.3 ، أستخدم هذه الوظيفة الملتوية للحصول على DateTime سلاسل نموذج الكائن مكونة من ذلك 'DD.MM.YYYY'.

function ParseForDateTimeValue ($strText)
{
    if ($strText != "")
    {
        if (ereg("^([0-9]{1,2})[/\.]\s*([0-9]{1,2})[/\.]\s*([0-9]{2,4})$",$strText,$arr_parts)) {

            $month = ltrim($arr_parts[2], '0');
            $day = ltrim($arr_parts[1], '0');
            $year = $arr_parts[3];

            if (checkdate($month, $day, $year)) {
               return new DateTime(date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
            }
        }
    }
    return NULL;
}
  • تحقق أولاً إذا كان الإدخال صحيحًا.
  • ثم استخراج الشهر واليوم والسنة
  • استخدم CheckDate للتحقق من صحة التاريخ.
  • قم بتحويله إلى الطابع الزمني وتمريره إلى محام DateTime وإعادته.

يمكنك إنشاء ملف timestamp ثم قم بتشغيله خلال التاريخ .. لإنشاء timestamp يمكنك أن تفعل بعض explode على السلسلة التي تحصل عليها ..

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top