B4J Question How to Port this Java Class for B4j

hi all
how to use javaobject for this java class

B4X:
public class Roozh {

private int day, month, year;

private int jY, jM, jD;private int gY, gM, gD;private int leap, march;

/*** Calculates the Julian Day number (JG2JD) from Gregorian or Julian* calendar dates. This integer number corresponds to the noon of the date* (i.e. 12 hours of Universal Time). The procedure was tested to be good* since 1 March, -100100 (of both the calendars) up to a few millions* (10**6) years into the future. The algorithm is based on D.A. Hatcher,* Q.Jl.R.Astron.Soc. 25(1984), 53-55 slightly modified by me (K.M.* Borkowski, Post.Astron. 25(1987), 275-279).* * @param year*  <code>int</code>* @param month*  <code>int</code>* @param day*  <code>int</code>* @param J1G0*  to be set to 1 for Julian and to 0 for Gregorian calendar* @return Julian Day number*/private int JG2JD(int year, int month, int day, int J1G0) {
  int 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;
}

/*** Calculates Gregorian and Julian calendar dates from the Julian Day number* (JD) for the period since JD=-34839655 (i.e. the year -100100 of both the* calendars) to some millions (10**6) years ahead of the present. The* algorithm is based on D.A. Hatcher, Q.Jl.R.Astron.Soc. 25(1984), 53-55* slightly modified by me (K.M. Borkowski, Post.Astron. 25(1987), 275-279).* * @param JD*  Julian day number as <code>int</code>* @param J1G0*  to be set to 1 for Julian and to 0 for Gregorian calendar*/private void JD2JG(int JD, int J1G0) {
  int i, j;

  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;
}

/*** Converts the Julian Day number to a date in the Jalali calendar* * @param JDN*  the Julian Day number*/private void JD2Jal(int JDN) {
  JD2JG(JDN, 0);

  jY = gY - 621;
  JalCal(jY);

  int JDN1F = JG2JD(gY, 3, march, 0);
  int 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;
}

/*** Converts a date of the Jalali calendar to the Julian Day Number* * @param Jy*  Jalali year as <code>int</code>* @param Jm*  Jalali month as <code>int</code>* @param Jd*  Jalali day as <code>int</code>* @return Julian day number*/private int Jal2JD(int jY, int jM, int jD) {
  JalCal(jY);
  int jd = JG2JD(gY, 3, march, 1) + (jM - 1) * 31 - jM / 7 * (jM - 7)
      + jD - 1;
  return jd;
 }

 /**
 * This procedure determines if the Jalali (Persian) year is leap (366-day
 * long) or is the common year (365 days), and finds the day in March
 * (Gregorian calendar) of the first day of the Jalali year (jY)
 *
 * @param jY
 *  Jalali calendar year (-61 to 3177)
 */
 private void JalCal(int jY) {
  march = 0;
  leap = 0;

  int[] breaks = { -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
      1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 };

  gY = jY + 621;
  int leapJ = -14;
  int jp = breaks[0];

  int jump = 0;
  for (int j = 1; j <= 19; j++) {
    int jm = breaks[j];
    jump = jm - jp;
    if (jY < jm) {
      int N = jY - jp;
      leapJ = leapJ + N / 33 * 8 + (N % 33 + 3) / 4;

      if ((jump % 33) == 4 && (jump - N) == 4)
        leapJ = leapJ + 1;

      int 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;
  }
 }

 /**
 * Modified <code>toString()</code> method that represents date string
 *
 * @return Date as <code>String</code>
 */
 @Override
 public String toString() {
  return String.format("%04d-%02d-%02d", getYear(), getMonth(), getDay());
 }

 /**
 * Converts Gregorian date to Persian(Jalali) date
 *
 * @param year
 *  <code>int</code>
 * @param month
 *  <code>int</code>
 * @param day
 *  <code>int</code>
 */
 public void GregorianToPersian(int year, int month, int day) {
  int jd = JG2JD(year, month, day, 0);
  JD2Jal(jd);
  this.year = jY;
  this.month = jM;
  this.day = jD;
 }

 /**
 * Converts Persian(Jalali) date to Gregorian date
 *
 * @param year
 *  <code>int</code>
 * @param month
 *  <code>int</code>
 * @param day
 *  <code>int</code>
 */
 public void PersianToGregorian(int year, int month, int day) {
  int jd = Jal2JD(year, month, day);
  JD2JG(jd, 0);
  this.year = gY;
  this.month = gM;
  this.day = gD;
 }

 /**
 * Get manipulated day
 *
 * @return Day as <code>int</code>
 */
 public int getDay() {
  return day;
 }

 /**
 * Get manipulated month
 *
 * @return Month as <code>int</code>
 */
 public int getMonth() {
  return month;
 }

 /**
 * Get manipulated year
 *
 * @return Year as <code>int</code>
 */
 public int getYear() {
  return year;

 }
}


sorry For my bad english
 

Erel

B4X founder
Staff member
Licensed User
Longtime User
Non-ui project:
B4X:
Sub Process_Globals
End Sub

Sub AppStart (Args() As String)
   Dim jo As JavaObject
   jo.InitializeNewInstance("b4j.example.main.Roozh", Null)
   jo.RunMethod("GregorianToPersian", Array(2010, 1, 20))
   Log(jo.RunMethod("getYear", Null))
   Log(jo.RunMethod("getMonth", Null))
   Log(jo.RunMethod("getDay", Null))
End Sub



#if java
public static class Roozh {

private int day, month, year;

private int jY, jM, jD;private int gY, gM, gD;private int leap, march;

/*** Calculates the Julian Day number (JG2JD) from Gregorian or Julian* calendar dates. This integer number corresponds to the noon of the date* (i.e. 12 hours of Universal Time). The procedure was tested to be good* since 1 March, -100100 (of both the calendars) up to a few millions* (10**6) years into the future. The algorithm is based on D.A. Hatcher,* Q.Jl.R.Astron.Soc. 25(1984), 53-55 slightly modified by me (K.M.* Borkowski, Post.Astron. 25(1987), 275-279).* * @param year*  <code>int</code>* @param month*  <code>int</code>* @param day*  <code>int</code>* @param J1G0*  to be set to 1 for Julian and to 0 for Gregorian calendar* @return Julian Day number*/
private int JG2JD(int year, int month, int day, int J1G0) {
  int 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;
}

/*** Calculates Gregorian and Julian calendar dates from the Julian Day number* (JD) for the period since JD=-34839655 (i.e. the year -100100 of both the* calendars) to some millions (10**6) years ahead of the present. The* algorithm is based on D.A. Hatcher, Q.Jl.R.Astron.Soc. 25(1984), 53-55* slightly modified by me (K.M. Borkowski, Post.Astron. 25(1987), 275-279).* * @param JD*  Julian day number as <code>int</code>* @param J1G0*  to be set to 1 for Julian and to 0 for Gregorian calendar*/private void JD2JG(int JD, int J1G0) {
  int i, j;

  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;
}

/*** Converts the Julian Day number to a date in the Jalali calendar* * @param JDN*  the Julian Day number*/private void JD2Jal(int JDN) {
  JD2JG(JDN, 0);

  jY = gY - 621;
  JalCal(jY);

  int JDN1F = JG2JD(gY, 3, march, 0);
  int 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;
}

/*** Converts a date of the Jalali calendar to the Julian Day Number* * @param Jy*  Jalali year as <code>int</code>* @param Jm*  Jalali month as <code>int</code>* @param Jd*  Jalali day as <code>int</code>* @return Julian day number*/private int Jal2JD(int jY, int jM, int jD) {
  JalCal(jY);
  int jd = JG2JD(gY, 3, march, 1) + (jM - 1) * 31 - jM / 7 * (jM - 7)
  + jD - 1;
  return jd;
 }

 /**
 * This procedure determines if the Jalali (Persian) year is leap (366-day
 * long) or is the common year (365 days), and finds the day in March
 * (Gregorian calendar) of the first day of the Jalali year (jY)
 *
 * @param jY
 *  Jalali calendar year (-61 to 3177)
 */
 private void JalCal(int jY) {
  march = 0;
  leap = 0;

  int[] breaks = { -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
  1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 };

  gY = jY + 621;
  int leapJ = -14;
  int jp = breaks[0];

  int jump = 0;
  for (int j = 1; j <= 19; j++) {
  int jm = breaks[j];
  jump = jm - jp;
  if (jY < jm) {
  int N = jY - jp;
  leapJ = leapJ + N / 33 * 8 + (N % 33 + 3) / 4;

  if ((jump % 33) == 4 && (jump - N) == 4)
  leapJ = leapJ + 1;

  int 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;
  }
 }

 /**
 * Modified <code>toString()</code> method that represents date string
 *
 * @return Date as <code>String</code>
 */
 @Override
 public String toString() {
  return String.format("%04d-%02d-%02d", getYear(), getMonth(), getDay());
 }

 /**
 * Converts Gregorian date to Persian(Jalali) date
 *
 * @param year
 *  <code>int</code>
 * @param month
 *  <code>int</code>
 * @param day
 *  <code>int</code>
 */
 public void GregorianToPersian(int year, int month, int day) {
  int jd = JG2JD(year, month, day, 0);
  JD2Jal(jd);
  this.year = jY;
  this.month = jM;
  this.day = jD;
 }

 /**
 * Converts Persian(Jalali) date to Gregorian date
 *
 * @param year
 *  <code>int</code>
 * @param month
 *  <code>int</code>
 * @param day
 *  <code>int</code>
 */
 public void PersianToGregorian(int year, int month, int day) {
  int jd = Jal2JD(year, month, day);
  JD2JG(jd, 0);
  this.year = gY;
  this.month = gM;
  this.day = gD;
 }

 /**
 * Get manipulated day
 *
 * @return Day as <code>int</code>
 */
 public int getDay() {
  return day;
 }

 /**
 * Get manipulated month
 *
 * @return Month as <code>int</code>
 */
 public int getMonth() {
  return month;
 }

 /**
 * Get manipulated year
 *
 * @return Year as <code>int</code>
 */
 public int getYear() {
  return year;

 }
}
#end if

The only interesting change required from the original code is to change the class signature to: public static class ...
 
Upvote 0
Top