تمام سوالات سوالات بدون پاسخ سوال بپرسید

سلام دوستان
من میخوام در یک برنامه به زبان python تاریخ میلادی که از سیستم میگیرم رو به تاریخ شمسی تبدیل کنم.
کسی میتونه راهنماییم کنه؟
ممنون

1 پاسخ

سلام
دوست عزیز من قبلا این کارو انجام دادم.
یک کلاس برای اینکار وجود داره که به راحتی میتونی از اون استفاده کنی.
امیدوارم مفید باشه.

#calverter.py

GREGORIAN_EPOCH = 1721425.5
GREGORIAN_WEEKDAYS = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

ISLAMIC_EPOCH = 1948439.5
ISLAMIC_WEEKDAYS = ("al-ahad", "al-'ithnayn", "ath-thalatha'", "al-arbia`aa'", "al-khamis", "al-jumu`a", "as-sabt")

JALALI_EPOCH = 1948320.5
JALALI_WEEKDAYS = ("Yekshanbeh", "Doshanbeh", "Seshhanbeh", "Chaharshanbeh", "Panjshanbeh", "Jomeh", "Shanbeh")

import math

class Calverter:
    """
    Converter Main Class
    """

    def __init__(self):
        self.J0000 = 1721424.5 # Julian date of Gregorian epoch: 0000-01-01
        self.J1970 = 2440587.5 # Julian date at Unix epoch: 1970-01-01
        self.JMJD  = 2400000.5 # Epoch of Modified Julian Date system
        self.J1900 = 2415020.5 # Epoch (day 1) of Excel 1900 date system (PC)
        self.J1904 = 2416480.5 # Epoch (day 0) of Excel 1904 date system (Mac)

        self.norm_leap = ("Normal year", "Leap year")

    def jwday(self, j):
        "Calculate day of week from Julian day"

        return int(math.floor((j + 1.5))) % 7

    def weekday_before(self, weekday, jd):
        """
        Return Julian date of given weekday (0 = Sunday)
        in the seven days ending on jd.
        """

        return jd - self.jwday(jd - weekday)

    def search_weekday(self, weekday, jd, direction, offset):
        """
        Determine the Julian date for:

        @param weekday: Day of week desired, 0 = Sunday
        @param jd: Julian date to begin search
        @param direction: 1 = next weekday, -1 = last weekday
        @param offset: Offset from jd to begin search
        """

        return self.weekday_before(weekday, jd + (direction * offset))

    # Utility weekday functions, just wrappers for search_weekday

    def nearest_weekday(self, weekday, jd):
        return self.search_weekday(weekday, jd, 1, 3)

    def next_weekday(self, weekday, jd):
        return self.search_weekday(weekday, jd, 1, 7)

    def next_or_current_weekday(self, weekday, jd):
        return self.search_weekday(weekday, jd, 1, 6)

    def previous_weekday(self, weekday, jd):
        return self.search_weekday(weekday, jd, -1, 1)

    def previous_or_current_weekday(self, weekday, jd):
        return self.search_weekday(weekday, jd, 1, 0)

    def leap_gregorian(self, year):
        "Is a given year in the Gregorian calendar a leap year ?"

        return ((year % 4) == 0) and (not(((year % 100) == 0) and ((year % 400) != 0)))

    def gregorian_to_jd(self, year, month, day):
        "Determine Julian day number from Gregorian calendar date"

        tm = 0 if month <= 2 else (-1 if self.leap_gregorian(year) else -2)

        return (GREGORIAN_EPOCH - 1) + (365 * (year - 1)) + math.floor((year - 1) / 4) +  (-math.floor((year - 1) / 100)) + \
            math.floor((year - 1) / 400) + math.floor((((367 * month) - 362) / 12) + tm + day)

    def jd_to_gregorian(self, jd) :
        "Calculate Gregorian calendar date from Julian day"

        wjd = math.floor(jd - 0.5) + 0.5
        depoch = wjd - GREGORIAN_EPOCH
        quadricent = math.floor(depoch / 146097)
        dqc = depoch % 146097
        cent = math.floor(dqc / 36524)
        dcent = dqc % 36524
        quad = math.floor(dcent / 1461)
        dquad = dcent % 1461
        yindex = math.floor(dquad / 365)
        year = int((quadricent * 400) + (cent * 100) + (quad * 4) + yindex)
        if not((cent == 4) or (yindex == 4)) :
            year += 1

        yearday = wjd - self.gregorian_to_jd(year, 1, 1)

        leapadj = 0 if wjd < self.gregorian_to_jd(year, 3, 1) else (1 if self.leap_gregorian(year) else 2)

        month = int(math.floor((((yearday + leapadj) * 12) + 373) / 367))
        day = int(wjd - self.gregorian_to_jd(year, month, 1)) + 1

        return year, month, day

    def n_weeks(self, weekday, jd, nthweek):

        j = 7 * nthweek
        if nthweek > 0 :
            j += self.previous_weekday(weekday, jd)
        else :
            j += self.next_weekday(weekday, jd)
        return j

    def iso_to_julian(self, year, week, day):
        "Return Julian day of given ISO year, week, and day"

        return day + self.n_weeks(0, self.gregorian_to_jd(year - 1, 12, 28), week)

    def jd_to_iso(self, jd):
        "Return array of ISO (year, week, day) for Julian day"

        year = self.jd_to_gregorian(jd - 3)[0]
        if jd >= self.iso_to_julian(year + 1, 1, 1) :
            year += 1

        week = int(math.floor((jd - self.iso_to_julian(year, 1, 1)) / 7) + 1)
        day = self.jwday(jd)
        if day == 0 :
            day = 7

        return year, week, day

    def iso_day_to_julian(self, year, day):
        "Return Julian day of given ISO year, and day of year"

        return (day - 1) + self.gregorian_to_jd(year, 1, 1)

    def jd_to_iso_day(self, jd):
        "Return array of ISO (year, day_of_year) for Julian day"

        year = self.jd_to_gregorian(jd)[0]
        day = int(math.floor(jd - self.gregorian_to_jd(year, 1, 1))) + 1
        return year, day

    def pad(self, Str, howlong, padwith) :
        "Pad a string to a given length with a given fill character. "

        s = str(Str)

        while s.length < howlong :
            s = padwith + s
        return s

    def leap_islamic(self, year):
        "Is a given year a leap year in the Islamic calendar ?"

        return (((year * 11) + 14) % 30) < 11

    def islamic_to_jd(self, year, month, day):
        "Determine Julian day from Islamic date"

        return (day + math.ceil(29.5 * (month - 1)) + (year - 1) * 354 + \
            math.floor((3 + (11 * year)) / 30) + ISLAMIC_EPOCH) - 1

    def jd_to_islamic(self, jd):
        "Calculate Islamic date from Julian day"

        jd = math.floor(jd) + 0.5
        year = int(math.floor(((30 * (jd - ISLAMIC_EPOCH)) + 10646) / 10631))
        month = int(min(12, math.ceil((jd - (29 + self.islamic_to_jd(year, 1, 1))) / 29.5) + 1))
        day = int(jd - self.islamic_to_jd(year, month, 1)) + 1;
        return year, month, day

    def leap_jalali(self, year):
        "Is a given year a leap year in the Jalali calendar ?"

        return ((((((year - 474 if year > 0 else 473 ) % 2820) + 474) + 38) * 682) % 2816) < 682

    def jalali_to_jd(self, year, month, day):
        "Determine Julian day from Jalali date"

        epbase = year - 474 if year>=0 else 473
        epyear = 474 + (epbase % 2820)

        if month <= 7 :
            mm = (month - 1) * 31
        else:
            mm = ((month - 1) * 30) + 6

        return day + mm + math.floor(((epyear * 682) - 110) / 2816) + (epyear - 1) * 365 + \
            math.floor(epbase / 2820) * 1029983 + (JALALI_EPOCH - 1)

    def jd_to_jalali(self, jd):
        "Calculate Jalali date from Julian day"

        jd = math.floor(jd) + 0.5
        depoch = jd - self.jalali_to_jd(475, 1, 1)
        cycle = math.floor(depoch / 1029983)
        cyear = depoch % 1029983
        if cyear == 1029982 :
            ycycle = 2820
        else :
            aux1 = math.floor(cyear / 366)
            aux2 = cyear % 366
            ycycle = math.floor(((2134 * aux1) + (2816 * aux2) + 2815) / 1028522) + aux1 + 1

        year = int(ycycle + (2820 * cycle) + 474)
        if year <= 0 :
            year -= 1

        yday = (jd - self.jalali_to_jd(year, 1, 1)) + 1
        if yday <= 186:
            month = int(math.ceil(yday / 31))
        else:
            month = int(math.ceil((yday - 6) / 30))

        day = int(jd - self.jalali_to_jd(year, month, 1)) + 1
        return year, month, day

به این صورت میتونی استفاده کنی.

# USAGE :

from calverter import Calverter
cal = Calverter()
jd = cal.gregorian_to_jd(2007,07,01)
wday = cal.jwday(jd)
print "Jalali: "
print cal.JALALI_WEEKDAYS[wday],
print cal.jd_to_jalali(jd)
print "\nIslamic: "
print cal.ISLAMIC_WEEKDAYS[wday],
print cal.jd_to_islamic(jd)

if  cal.leap_islamic(1428) :
    print 'Leap Isalmic year !'

# OUTPUT :

Jalali: 
Yekshanbeh (1386, 4, 10)

Islamic: 
al-ahad (1428, 6, 15)
Leap Isalmic year !
toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×52
  • ×35
  • ×2
  • پرسیده شده: 12 آوریل '12, 07:56
  • بازدید: 4,371 بار
  • آخرین بروزرسانی: 05 مارس '15, 18:42

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها