کار با زمان و تاریخ در اندروید (DatePicker و TimePicker)

با نام خدا و سلام، به امید خدا تو این پست میخوام در مورد کار کردن با DataPicker و TimePicker  و دیگر نیازمندی های زمان و تاریخ در اندروید بنویسم.

اول از همه ما دو تا دیالوگ داریم با نام های 

DatePickerDialog

و 

TimePickerDialog

که همونطور که از اسمشون پیداست برای گرفتن زمان و تاریخ توسط دیالوگ ازشون استفاده میشه. (تصاویر هر دو دیالوگ را در ادامه ملاحضه می کنید)

datePickerDialog in android
datePickerDialog in android

خب اما فراخوانی این دیالوگ ها به چه صورت هست!؟

من برای مثال، دو تا دکمه (button) گذاشتم یکه یک برای گرفتن تاریخ و یکی برای گرفتن زمان کاربرد داره. کد پشت این دو دکمه به صورت زیر میشه (توضیحات بعد از نمونه کد زیر):

public void onClick(View v) {
        //Start Date Picker
        if (v == btnDatePickerStart) {
            // Get Current Date
            final Calendar c = Calendar.getInstance();
            mYear = c.get(Calendar.YEAR);
            mMonth = c.get(Calendar.MONTH);
            mDay = c.get(Calendar.DAY_OF_MONTH);


            DatePickerDialog datePickerDialog = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {

                        @Override
                        public void onDateSet(DatePicker view, int year,
                                              int monthOfYear, int dayOfMonth) {

                        }
                    }, mYear, mMonth, mDay);
            datePickerDialog.show();
        }
        //Start Time Picker
        if (v == btnTimePickerStart) {

            // Get Current Time
            final Calendar c = Calendar.getInstance();
            mHour = c.get(Calendar.HOUR_OF_DAY);
            mMinute = c.get(Calendar.MINUTE);

            // Launch Time Picker Dialog
            TimePickerDialog timePickerDialog = new TimePickerDialog(this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                              int minute) {

                        }
                    }, mHour, mMinute, false);
            timePickerDialog.show();
        }
}

خب دو تا دکمه داریم با نام های btnTimePickerStart و btnDatePickerStart، برای فراخوانی دیالوگ تاریخ تنها کد زیر کافیست:

            // Get Current Date
            final Calendar c = Calendar.getInstance();
            mYear = c.get(Calendar.YEAR);
            mMonth = c.get(Calendar.MONTH);
            mDay = c.get(Calendar.DAY_OF_MONTH);


            DatePickerDialog datePickerDialog = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {

                        @Override
                        public void onDateSet(DatePicker view, int year,
                                              int monthOfYear, int dayOfMonth) {
                        }
                    }, mYear, mMonth, mDay);
            datePickerDialog.show();

برای فراخوانی دیالوگ زمان نیز کد زیر کفایت می کنه:

            // Get Current Time
            final Calendar c = Calendar.getInstance();
            mHour = c.get(Calendar.HOUR_OF_DAY);
            mMinute = c.get(Calendar.MINUTE);

            // Launch Time Picker Dialog
            TimePickerDialog timePickerDialog = new TimePickerDialog(this,
                    new TimePickerDialog.OnTimeSetListener() {

                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                              int minute) {
                        }
                    }, mHour, mMinute, false);
            timePickerDialog.show();

حالا اگر بخواید برای مثال تاریخی که کاربر انتخاب کرده را بگیرید، کافیه داخل onDateSet یا onTimeSet کد خودتون رو بنویسید، برای مثال برای آنکه تاریخ انتخاب شده را داخل یه TextView نمایش بدید کافیه onDateSet  به صورت زیر نوشته بشه:

                        @Override
                        public void onDateSet(DatePicker view, int year,
                                              int monthOfYear, int dayOfMonth) {
                            txtDateEnd.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
                        }

و به همین صورت برای نمایش زمان انتخاب شده توسط کاربر داخل onTimeSet  نیز باید کد مرتبط را نوشت.

یکی دیگر از کارها اینه که برای مثال یه حداقل برای انتخاب تاریخ اعمال کنیم،برای مثال کاربر فقط بتونه از تاریخ امروز به بعد را انتخاب کنه، برای این کار تنها کافیه از تکه کد زیر استفاده کنید:

view.setMinDate(System.currentTimeMillis());

کد بالا کاربر را محدود ی کنه از تاریخ امروز به بعد را تنها انتخاب کنه، همان طور که مشخصه باید زمان مورد نظر را به صورت میلی ثانیه به setMinDate داد، حال اگر بخواید محدودیت را از یه تاریخ دلخواه اعمال کنید ، باید تاریخ مورد نظرتان را به میلی ثانیه تبدیل کنید، برای این کار می توانید از تکه کد زیر استفاده کنید:

///www.sadegh-khan.ir
public long milliseconds(String date)
    {
        //String date_ = date;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try
        {
            Date mDate = sdf.parse(date);
            long timeInMilliseconds = mDate.getTime();
            //System.out.println("Date in milli :: " + timeInMilliseconds);
            return timeInMilliseconds;
        }
        catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return 0;
    }

تابع فوق یه ورودی میخواد که به صورت String هست، برای تبدیل تاریخ گرفته شده (که سال و ماه و روز به صورت integer هستن) به String میتونید از کد زیر استفاده کنید:

 public String dateFormat(int year, int month,int day)
    {
        /////"yyyy-MM-dd HH:mm:ss"
        String tempD;
        String tempM;
        if(day<10){
            tempD = "0" + Integer.toString(day);
        }
        else{
            tempD = Integer.toString(day);
        }

        if(month<10){
            tempM = "0" + Integer.toString(month);
        }
        else{
            tempM = Integer.toString(month);
        }

        String dateFormated= Integer.toString(year)+"-"+tempM+"-"+tempD;

        return dateFormated;
    }

حالا ترکیب این چند تا تابع فوق رو من تو یه مثال پایین آوردم:

// Get Current Date
            final Calendar c = Calendar.getInstance();
            mYear = c.get(Calendar.YEAR);
            mMonth = c.get(Calendar.MONTH);
            mDay = c.get(Calendar.DAY_OF_MONTH);


            DatePickerDialog datePickerDialog = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {

                        @Override
                        public void onDateSet(DatePicker view, int year,
                                              int monthOfYear, int dayOfMonth) {
                            
                            

                            String endDateFormated =  dateFormat(year,monthOfYear + 1,dayOfMonth);
                            miliSecsDate = milliseconds (startDateFormated);
                            view.setMinDate(miliSecsDate);


                            txtDateEnd.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
                            btnTimePickerEnd.setEnabled(true);

                        }
                    }, mYear, mMonth, mDay);
            datePickerDialog.getDatePicker().setMinDate(miliSecsDate);
            datePickerDialog.show();
       

مراجع: سایت اندروید دولوپر ،