تاریخ شمسی در کاتلین | تبدیل تاریخ میلادی به تاریخ شمسی در کاتلین

به نام خداوند مهربان ، ما از سری آموزش کاتلین امروز قصد داریم کار با تاریخ شمسی در کاتلین نحوی پیاده سازی تاریخ میلادی و تبدیل آن به تاریخ شمسی یا  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
    }

}

ما به همین راحتی تونستیم در برنامه نویسی کاتلین خودمون از تاریخ استفاده کنیم . امیدوارم این آموزش کوچیک و خلاصه برای شما مفید بوده باشد . و اینکه خروجی کد بالا را در پایین مشاهده کنید .

موفق باشین .

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]
اشتراک‌گذاری

فرشید حبیبی هستم . برنامه نویس موبایل، سئو و وردپرس همچنین علاقه مند به تولید محتوا در زمینه برنامه نویسی و تکنولوژی های روز دنیا.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *