Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update jalaali_js.dart #25

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 81 additions & 59 deletions lib/jalaali_js.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ String farsiNumbers(String input) {
input = input.replaceAll("1", "۱");
input = input.replaceAll("2", "۲");
input = input.replaceAll("3", "۳");
input = input.replaceAll("4", "۴");
input = input.replaceAll("5", "۵");
input = input.replaceAll("6", "۶");
input = input.replaceAll("4", "٤");
input = input.replaceAll("5", "٥");
input = input.replaceAll("6", "٦");
input = input.replaceAll("7", "۷");
input = input.replaceAll("8", "۸");
input = input.replaceAll("9", "۹");
return input;
}

String englishNumbers(String input) {
String? englishNumbers(String? input) {
if (input != null) {
input = input.replaceAll("۰", "0");
input = input.replaceAll("۱", "1");
input = input.replaceAll("۲", "2");
input = input.replaceAll("۳", "3");
input = input.replaceAll("۴", "4");
input = input.replaceAll("۵", "5");
input = input.replaceAll("۶", "6");
input = input.replaceAll("٤", "4");
input = input.replaceAll("٥", "5");
input = input.replaceAll("٦", "6");
input = input.replaceAll("۷", "7");
input = input.replaceAll("۸", "8");
input = input.replaceAll("۹", "9");
Expand All @@ -32,33 +32,34 @@ String englishNumbers(String input) {

/// Jalaali
class Jalaali {
int year;
int month;
int day;
int? year;
int? month;
int? day;

int get julianDayNumber {
final r = _JalaaliBreaks.cal(year);
final r = _JalaaliBreaks.cal(year!);

return Gregorian(r.gy, 3, r.march).julianDayNumber +
(month - 1) * 31 -
_div(month, 7) * (month - 7) +
day -
(month! - 1) * 31 -
_div(month!, 7) * (month! - 7) +
day! -
1;
}

Jalaali(this.year, [this.month = 1, this.day = 1]);

factory Jalaali.fromJulianDayNumber(julianDayNumber) {
// Calculate Gregorian year (gy).
int gy = Gregorian.fromJulianDayNumber(julianDayNumber).year;
int gy = Gregorian.fromJulianDayNumber(julianDayNumber).year!;

int jy = gy - 621;
final r = _JalaaliBreaks.cal(jy);
int jdn1f = Gregorian(gy, 3, r.march).julianDayNumber;
int jd, jm, k;
int? jd, jm, k;

// Find number of days that passed since 1 Farvardin.
k = julianDayNumber - jdn1f;
if (k >= 0) {
if (k! >= 0) {
if (k <= 185) {
// The first 6 months.
jm = 1 + _div(k, 31);
Expand Down Expand Up @@ -102,23 +103,23 @@ class Jalaali {

/// Checks whether a Jalaali date is valid or not.
bool isValid() {
return year >= -61 &&
year <= 3177 &&
month >= 1 &&
month <= 12 &&
day >= 1 &&
day <= monthLength;
return year! >= -61 &&
year! <= 3177 &&
month! >= 1 &&
month! <= 12 &&
day! >= 1 &&
day! <= monthLength;
}

/// Checks if a year is a leap year or not.
bool isLeapYear() {
return _JalaaliBreaks.cal(year).leap == 0;
return _JalaaliBreaks.cal(year!).leap == 0;
}

/// Computes number of days in a given month in a Jalaali year.
int get monthLength {
if (month <= 6) return 31;
if (month <= 11) return 30;
if (month! <= 6) return 31;
if (month! <= 11) return 30;
if (isLeapYear()) return 30;
return 29;
}
Expand All @@ -133,13 +134,13 @@ class Jalaali {
/// Gregorian date class
class Gregorian {
/// Gregorian year (years BC numbered 0, -1, -2, ...)
final int year;
final int? year;

/// Gregorian month (1 to 12)
final int month;

/// Gregorian day of the month (1 to 28/29/30/31)
final int day;
final int? day;

/// Calculates the Julian Day number from Gregorian or Julian
/// calendar dates. This integer number corresponds to the noon of
Expand All @@ -148,12 +149,11 @@ class Gregorian {
/// The procedure was tested to be good since 1 March, -100100 (of both
/// calendars) up to a few million years into the future.
int get julianDayNumber {
int d = _div((year + _div(month - 8, 6) + 100100) * 1461, 4) +
int d = _div((year! + _div(month - 8, 6) + 100100) * 1461, 4) +
_div(153 * _mod(month + 9, 12) + 2, 5) +
day -
day! -
34840408;
d = d - _div(_div(year + 100100 + _div(month - 8, 6), 100) * 3, 4) + 752;

d = d - _div(_div(year! + 100100 + _div(month - 8, 6), 100) * 3, 4) + 752;
return d;
}

Expand All @@ -169,13 +169,34 @@ class Gregorian {

j = 4 * julianDayNumber + 139361631;
j = j +
_div(_div(4 * julianDayNumber + 183187720, 146097) * 3, 4) * 4 -
3908;
// _div(_div(4 * julianDayNumber + 183187720, 146097) * 3, 4) * 4 -
// 3908;
// _div(_div(4 * julianDayNumber + 183187720, 146097) * 3, 4) * 4 -
// 65000;
_div(_div(4 * julianDayNumber + 183187720, 146097) * 3, 4) * 3 -
65000;
i = _div(_mod(j, 1461), 4) * 5 + 308;
gd = _div(_mod(i, 153), 5) + 1;
// gd = _div(_mod(i, 153), 5) + 1;
gd = _div(_mod(i, 153), 4) + 2;

gm = _mod(_div(i, 153), 12) + 1;
gy = _div(j, 1461) - 100100 + _div(8 - gm, 6);

// int z = (julianDayNumber + 0.5).floor();
// int a = ((z - 1867216.25) / 36524.25).floor();
// a = z + 1 + a - (a / 4).floor();
// int b = a + 1524;
// int c = ((b - 122.1) / 365.25).floor();
// int d = (365.25 * c).floor();
// int e = ((b - d) / 30.6001).floor();
// int day = b - d - (e * 30.6001).floor();
// //var wd = _gMod(julianDate + 1, 7) + 1;
// int month = e - (e > 13.5 ? 13 : 1);
// int year = c - (month > 2.5 ? 4716 : 4715);
// if (year <= 0) {
// year--;
// } // No year zero
// print("year${year} month${month} day${day}");
return Gregorian(gy, gm, gd);
}

Expand All @@ -190,11 +211,12 @@ class Gregorian {

/// Converts Gregorian date to [DateTime] object
DateTime toDateTime() {
return DateTime(year, month, day);
return DateTime(year!, month, day!);
}

/// Converts a Gregorian date to Jalaali.
Jalaali toJalaali() {
//julianDayNumber
return Jalaali.fromJulianDayNumber(julianDayNumber);
}

Expand All @@ -208,13 +230,13 @@ class Gregorian {
/// Internal class
class _JalaaliBreaks {
/// Number of years since the last leap year (0 to 4)
final int leap;
final int? leap;

/// Gregorian year of the beginning of Jalaali year
final int gy;
final int? gy;

/// The March day of Farvardin the 1st (1st day of jy)
final int march;
final int? march;

_JalaaliBreaks({this.leap, this.gy, this.march});

Expand Down Expand Up @@ -251,7 +273,7 @@ class _JalaaliBreaks {
3178
];

int bl = breaks.length,
int? bl = breaks.length,
gy = jy + 621,
leapJ = -14,
jp = breaks[0],
Expand All @@ -266,19 +288,19 @@ class _JalaaliBreaks {
if (jy < jp || jy >= breaks[bl - 1]) throw 'Invalid Jalaali year $jy';

// Find the limiting years for the Jalaali year jy.
for (i = 1; i < bl; i += 1) {
for (i = 1; i! < bl; i += 1) {
jm = breaks[i];
jump = jm - jp;
jump = jm - jp!;
if (jy < jm) break;
leapJ = leapJ + _div(jump, 33) * 8 + _div(_mod(jump, 33), 4);
leapJ = leapJ! + _div(jump, 33) * 8 + _div(_mod(jump, 33), 4);
jp = jm;
}
n = jy - jp;
n = jy - jp!;

// Find the number of leap years from AD 621 to the beginning
// of the current Jalaali year in the Persian calendar.
leapJ = leapJ + _div(n, 33) * 8 + _div(_mod(n, 33) + 3, 4);
if (_mod(jump, 33) == 4 && jump - n == 4) leapJ += 1;
leapJ = leapJ! + _div(n, 33) * 8 + _div(_mod(n, 33) + 3, 4);
if (_mod(jump!, 33) == 4 && jump - n == 4) leapJ += 1;

// And the same in the Gregorian calendar (until the year gy).
leapG = _div(gy, 4) - _div((_div(gy, 100) + 1) * 3, 4) - 150;
Expand Down Expand Up @@ -394,32 +416,32 @@ String getGregorianMonthName(int month) {
}
}

String getJalaaliMonthName(int month) {
String getJalaaliMonthName(int? month) {
switch (month) {
case 1:
return "فروردین";
return "جماد الثاني";
case 2:
return "اردیبهشت";
return "رجب";
case 3:
return "خرداد";
return "شعبان";
case 4:
return "تیر";
return "رمضان";
case 5:
return "مرداد";
return "شوال";
case 6:
return "شهریور";
return "ذو القعدة";
case 7:
return "مهر";
return "ذو الحجة";
case 8:
return "آبان";
return "محرم";
case 9:
return "آذر";
return "صفر";
case 10:
return "دی";
return "ربيع آول";
case 11:
return "بهمن";
return "ربيع الثاني";
case 12:
return "اسفند";
return "جماد آول";
default:
return "خطا";
}
Expand Down