SalmanAA

نوشته های سلمان عرب عامری

SalmanAA

نوشته های سلمان عرب عامری

اگر بخواهیم بدون استفاده از توابع پیچیده بررسی کنیم که تاریخ وارد شده توسط شخص در فرمت صحیح شمسی وارد شده است یا نه کافی است از عبارت با قاعده زیر استفاده کنیم:

/(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/

نمونه استفاده در جاوا اسکریپت:

    var str = "1393/11/23";
    //look for "1393/10/10"
    var patt = /(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/g;
    var result1 = patt.test(str);
console.log(result1);
str="1393/13/10";
    var result2 = patt.test(str);
console.log(result2);

البته توجه کنید که در این عبارت یک مشکل وجود داره. اون هم اینکه سال کبیسه محاسبه نمی شه و برای اسفند همواره تا 30 رو قبول می کند. بنابراین باید یک کد اضافه هم بگذاریم که اگر تاریخ مورد قبول بود، با استخراج ماه و سال و روز اگر تاریخ طبق دستورات قبل معتبر بود و ماه 12 بود، و  سال کبیسه آنگاه 30 روز قابل قبول باشد و در غیر اینصورت 29 روز قبول کند. بنابراین در ادامه کد زیر را می آوریم:

    if (result1) {
        var pos = str.indexOf('/');
        var year = str.substring(0,pos);
        var nextPos = str.indexOf('/',pos+1);
        var month = str.substring(pos+1,nextPos);
        var day = str.substring(nextPos+1);
        if(month==12 && (year+1) % 4!=0 && day==30) { // kabise = 1379, 1383, 1387,... (year +1) divides on 4 remains 0
            result = false;
    }

کد کامل برنامه :

function checkShamsi(str) {
    var patt = /(13|14)([0-9][0-9])\/(((0?[1-6])\/((0?[1-9])|([12][0-9])|(3[0-1])))|(((0?[7-9])|(1[0-2]))\/((0?[1-9])|([12][0-9])|(30))))/g;
    var result = patt.test(str);
    if (result) {
            var pos = str.indexOf('/');
            var year = str.substring(0,pos);
            var nextPos = str.indexOf('/',pos+1);
            var month = str.substring(pos+1,nextPos);
            var day = str.substring(nextPos+1);
            if(month==12 && (year+1) % 4!=0 && day==30) { // kabise = 1379, 1383, 1387,... (year +1) divides on 4 remains 0
                result = false;
    }   
    return result;
}

نحوه استفاده:

var myvalue="1393/12/30";
if (!checkShamsi(myvalue)) {
    alert("تاریخ وارد شده معتبر نیست!");
    return;
}
  • موافقین ۰ مخالفین ۰
  • پنجشنبه, ۶ آذر ۱۳۹۳، ۰۹:۲۹ ق.ظ
  • سلمان عرب عامری

نظرات  (۱)

  • سینا صدرزاده
  • مدیریت تاریخ همیشه توی جاوااسکریپت یه موضوع قابل بحث بوده. روشی هم که شما پیشنهاد کردین جالبه.
    اگر فرصت کردین یه نگاه به کتابخانه momenjs بندازین. از تاریخ های فارسی هم پشتیبانی می کنه.
    پاسخ:
    متشکرم از نظرتون. البته من قصد نداشتم بگم این روش بهترین روش هست، بلکه بیشتر بحث نحوه پیاده سازی با استفاده از عبارات با قاعده هست.
    البته می بینید که این روش مقدار زیادی از شرط ها رو حذف می کنه و در قالب عبارت با قاعده می بره.
    کاربرد این تابع که ارائه شد در نرم افزارهای تحت وب وقتیه که می خواهیم از کاربر تاریخ بگیریم و سمت کلاینت اعتبار تاریخ وارد شده رو بررسی کنیم.
    شاید در آینده در مورد نحوه ادغام این متد با ولیدیشن جی کوئری هم نوشتم...
    کتابخانه ای هم که معرفی کردید دیدم. خیلی خوبه. حتما کدش رو مطالعه خواهم کرد تا بهتر بشم.

    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی