به نام خداوند مهربان ، ما از سری آموزش کاتلین امروز قصد داریم کار با تاریخ شمسی در کاتلین نحوی پیاده سازی تاریخ میلادی و تبدیل آن به تاریخ شمسی یا Date Picker Dialog آموزش دهیم .
تاریخ شمسی در کاتلین به چه صورت می باشد.

تقویم در کاتلین
شاید ما در مراحلی از کد نویسی در زبان کاتلین به این نیاز داشته باشیم که از تاریخ در کاتلین استفاده کنیم . حالا این بین ما بسته به نیازمون میتونیم از تاریخ میلادی استفاده کنیم و یا در صورت نیاز به تاریخ شمسی تاریخ میلادی را به تاریخ شمسی تبدیل کنیم . برای مواردی مانند وارد کردن تاریخ تولد ، تاریخ ارسال اجناس و …. خیلی موارد دیگر . در این موارد ما باید از DatePicker Dialog در کاتلین استفاده کنیم تا هم کار ما را راحت شود و اینکه UI خوبی به برنامه ما بدهد. برای پیاده سازی تاریخ میلادی در کاتلین ما یک پروژه ایجاد می کنیم . و اسم دلخواه خودتون رو برای این پروژه قرار دهید . بعد اولین کاری که باید انجام دهیم اضافه کردن کتابخانه به پروژه می باشد .
در مسیر (Module)build.gradle کتابخانه زیر را وارد کنید .
implementation 'com.google.android.material:material:1.3.0'
بعد از این کار وارد بخش XML اکتیویتی خودتون بشید و کد های زیر را وارد سازید .
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/purple_500" android:gravity="center" tools:context=".DataPicker"> <LinearLayout android:gravity="center" android:layout_margin="25dp" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/btn1" android:text="تاریخ میلادی" android:textSize="22dp" android:textStyle="bold" /> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="2013/5/25" android:textColor="#FFFFFF" android:textSize="22dp" android:textStyle="bold" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_margin="25dp" android:gravity="center" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/btn2" android:text="تاریخ شمسی" android:textSize="22dp" android:textStyle="bold" /> <TextView android:id="@+id/textview2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="1400/8/9" android:textColor="#FFFFFF" android:textSize="22dp" android:textStyle="bold" /> </LinearLayout> </LinearLayout>
در قسمت بالا ما از دو تا LinearLayout استفاده کردیم. و در هر کدام از لایه ها از یک Button و TextViewاستفاده کردیم . تا با کلیک روی Button تاریخ برای ما باز شود .و با انتخاب تاریخ در همان TextView ثبت شود. اکنون سراغ کد نویسی بخش اکتیویتی خودمون بروید و در آن قسمت کد های زیر را وارد سازید.
package com.example.retrofit import android.app.DatePickerDialog import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextView import java.util.* class DataPicker : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_data_picker) val cal = Calendar.getInstance() val myYear = cal.get(Calendar.YEAR) val myMonth = cal.get(Calendar.MONTH) val day = cal.get(Calendar.DAY_OF_MONTH) val textview = findViewById<TextView>(R.id.textview) val btn1 = findViewById<Button>(R.id.btn1) val btn2 = findViewById<Button>(R.id.btn2) val textview2 = findViewById<TextView>(R.id.textview2) btn1.setOnClickListener { val datePickerDialog = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth -> textview.text = "Date:" + dayOfMonth + "/" + (month + 1) + "/" + year }, myYear, myMonth, day ) datePickerDialog.show() } btn2.setOnClickListener { val datePickerDialog = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth -> val jCal = Roozh(); // ایجاد یک نمونه از کلاس تبدیل تاریخ jCal.GregorianToPersian(year, month, dayOfMonth); // دادن تاریخ کنونی سیستم به متد تبدیل تاریخ میلادی به شنسی val yearr = jCal.year; // سال شمسی val monthh = jCal.month; // ماه شمسی val day = jCal.day; // روز شمسی textview2.text = "Date:" + day + "/" + (monthh + 1) + "/" + yearr }, myYear, myMonth, day ) datePickerDialog.show() } } }
چگونه تاریخ میلادی را به تاریخ شمسی تبدیل کنیم.
ما در قسمت اکتیویتی خودمون تاریخ میلادی را به تاریخ شمسی تبدیل کردیم . برای اینکار از یک کلاس کمکی استفاده می کنیم تا تاریخ میلادی را بگیرد و تاریخ شمسی را برای ما برگرداند . نام کلاس کمکی را Date بزارید و کد های آن نیز مانند زیر می باشد .البته به وسیله ی این کد ها کار های دیگر نیز می توانیم انجام دهیم که فقط تبدیل به تاریخ شمسی مورد استفاده ما می باشد .
package com.example.retrofit class Date { var day = 0 private set var month = 0 private set var year = 0 private set private var jY = 0 private var jM = 0 private var jD = 0 private var gY = 0 private var gM = 0 private var gD = 0 private var leap = 0 private var march = 0 private fun JG2JD(year: Int, month: Int, day: Int, J1G0: Int): Int { var jd = (1461 * (year + 4800 + (month - 14) / 12) / 4 + 367 * (month - 2 - 12 * ((month - 14) / 12)) / 12 - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4 + day - 32075) if (J1G0 == 0) jd = jd - (year + 100100 + (month - 8) / 6) / 100 * 3 / 4 + 752 return jd } private fun JD2JG(JD: Int, J1G0: Int) { val i: Int var j: Int j = 4 * JD + 139361631 if (J1G0 == 0) { j = j + (4 * JD + 183187720) / 146097 * 3 / 4 * 4 - 3908 } i = j % 1461 / 4 * 5 + 308 gD = i % 153 / 5 + 1 gM = i / 153 % 12 + 1 gY = j / 1461 - 100100 + (8 - gM) / 6 } private fun JD2Jal(JDN: Int) { JD2JG(JDN, 0) jY = gY - 621 JalCal(jY) val JDN1F = JG2JD(gY, 3, march, 0) var k = JDN - JDN1F if (k >= 0) { if (k <= 185) { jM = 1 + k / 31 jD = k % 31 + 1 return } else { k = k - 186 } } else { jY = jY - 1 k = k + 179 if (leap == 1) k = k + 1 } jM = 7 + k / 30 jD = k % 30 + 1 } private fun Jal2JD(jY: Int, jM: Int, jD: Int): Int { JalCal(jY) val jd = JG2JD(gY, 3, march, 1) + (jM - 1) * 31 - jM / 7 * (jM - 7) +jD - 1 return jd } private fun JalCal(jY: Int) { march = 0 leap = 0 val breaks = intArrayOf( -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 ) gY = jY + 621 var leapJ = -14 var jp = breaks[0] var jump = 0 for (j in 1..19) { val jm = breaks[j] jump = jm - jp if (jY < jm) { var N = jY - jp leapJ = leapJ + N / 33 * 8 + (N % 33 + 3) / 4 if (jump % 33 == 4 && jump - N == 4) leapJ = leapJ + 1 val leapG = gY / 4 - (gY / 100 + 1) * 3 / 4 - 150 march = 20 + leapJ - leapG if (jump - N < 6) N = N - jump + (jump + 4) / 33 * 33 leap = ((N + 1) % 33 - 1) % 4 if (leap == -1) leap = 4 break } leapJ = leapJ + jump / 33 * 8 + jump % 33 / 4 jp = jm } } override fun toString(): String { return String.format("%04d-%02d-%02d", year, month, day) } fun GregorianToPersian(year: Int, month: Int, day: Int) { val jd = JG2JD(year, month, day, 0) JD2Jal(jd) this.year = jY this.month = jM this.day = jD+1 } fun PersianToGregorian(year: Int, month: Int, day: Int) { val jd = Jal2JD(year, month, day) JD2JG(jd, 0) this.year = gY this.month = gM this.day = gD } }
ما به همین راحتی تونستیم در برنامه نویسی کاتلین خودمون از تاریخ استفاده کنیم . امیدوارم این آموزش کوچیک و خلاصه برای شما مفید بوده باشد . و اینکه خروجی کد بالا را در پایین مشاهده کنید .
موفق باشین .
دیدگاهتان را بنویسید