1

Konu: PHP'den VFP çeviri Şemsi takvim

Aşağıdaki kodu tahmin ederek VFP'ye çevirmeye çalıştım. Ancak sanırım doğru çeviremedim, çünkü düzgün hesaplamıyor benim çeviri. Çevirebilecek bir arkadaş var mı?

/**
* Divides two integers.
*
* @param    int    $a    Integer to divide
* @param    int    $b    Integer to divide to
* @return    int
*/
function div($a,$b) {
    return (int) ($a / $b);
}

/**
* Converts gregorian to jalali calendar
*
* @param int $g_y    The gregorian year
* @param int $g_m    The gregorian month
* @param int $g_d    The gregorian day
* @return array The jalali date array
*/
function gregorian_to_jalali($g_y, $g_m, $g_d) {
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

    $gy = $g_y-1600;
    $gm = $g_m-1;
    $gd = $g_d-1;

    $g_day_no = 365*$gy+div($gy+3,4)-div($gy+99,100)+div($gy+399,400);

    for ($i=0; $i < $gm; ++$i)
    $g_day_no += $g_days_in_month[$i];
    if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
    /* leap and after Feb */
    $g_day_no++;
    $g_day_no += $gd;

    $j_day_no = $g_day_no-79;

    $j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
    $j_day_no = $j_day_no % 12053;

    $jy = 979+33*$j_np+4*div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */

    $j_day_no %= 1461;

    if ($j_day_no >= 366) {
        $jy += div($j_day_no-1, 365);
        $j_day_no = ($j_day_no-1)%365;
    }

    for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
    $j_day_no -= $j_days_in_month[$i];
    $jm = $i+1;
    $jd = $j_day_no+1;

    return array($jy, $jm, $jd);
}

/**
* Converts jalali to gregorian calendar
*
* @param int $j_y    The jalali year
* @param int $j_m    The jalali month
* @param int $j_d    The jalali day
* @return array The gregorian date array
*/
function jalali_to_gregorian($j_y, $j_m, $j_d) {
    $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);

    $jy = $j_y-979;
    $jm = $j_m-1;
    $jd = $j_d-1;

    $j_day_no = 365*$jy + div($jy, 33)*8 + div($jy%33+3, 4);
    for ($i=0; $i < $jm; ++$i)
    $j_day_no += $j_days_in_month[$i];

    $j_day_no += $jd;

    $g_day_no = $j_day_no+79;

    $gy = 1600 + 400*div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
    $g_day_no = $g_day_no % 146097;

    $leap = true;
    if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
    {
     $g_day_no--;
     $gy += 100*div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */
     $g_day_no = $g_day_no % 36524;

     if ($g_day_no >= 365)
        $g_day_no++;
     else
        $leap = false;
    }

    $gy += 4*div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
    $g_day_no %= 1461;

    if ($g_day_no >= 366) {
     $leap = false;

     $g_day_no--;
     $gy += div($g_day_no, 365);
     $g_day_no = $g_day_no % 365;
    }

    for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
    $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
    $gm = $i+1;
    $gd = $g_day_no+1;

    return array($gy, $gm, $gd);
}

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

2

Re: PHP'den VFP çeviri Şemsi takvim

Metin, geçmişde PHP ile epey kod yazdım.
Oturup yazmam smile
Ama yazdığın kodu yayınlarsan bir göz atarım.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

3

Re: PHP'den VFP çeviri Şemsi takvim

greg-celali tamam. onu buldum da celali-greg olmadı. çevirdiğim kod bu. biryerlere bir hata yapıyorum ama... sad

Visual Fox Pro
Lparameters j_y, j_m, j_d

 
Local g_days_in_month(12),j_days_in_month(12)
g_days_in_month(1)=31
g_days_in_month(2)=28
g_days_in_month(3)=31
g_days_in_month(4)=30
g_days_in_month(5)=31
g_days_in_month(6)=30
g_days_in_month(7)=31
g_days_in_month(8)=31
g_days_in_month(9)=30
g_days_in_month(10)=31
g_days_in_month(11)=30
g_days_in_month(12)=31
 
j_days_in_month(1)=31
j_days_in_month(2)=21
j_days_in_month(3)=31
j_days_in_month(4)=31
j_days_in_month(5)=31
j_days_in_month(6)=31
j_days_in_month(7)=30
j_days_in_month(8)=30
j_days_in_month(9)=30
j_days_in_month(10)=30
j_days_in_month(11)=30
j_days_in_month(12)=29
 
 
jy = j_y-979
jm = j_m-1
jd = j_d-1
 
j_day_no = 365*jy + div(jy, 33)*8 + div(jy%33+3, 4)
For i=1 To jm
    j_day_no = j_day_no +j_days_in_month[i]
Next
 
j_day_no = j_day_no +jd
 
g_day_no = j_day_no+79
 
gy = 1600 + 400*div(g_day_no, 146097)
g_day_no = g_day_no % 146097
 
leap = .T.
If (g_day_no >= 36525)
 
    g_day_no=g_day_no-1
    gy = gy +100*div(g_day_no,  36524)
    g_day_no = g_day_no % 36524
 
    If (g_day_no >= 365)
        g_day_no=g_day_no+1
    Else
        leap = .F.
    Endif
Endi
 
gy = gy +4*div(g_day_no, 1461)
g_day_no= g_day_no %1461
 
If (g_day_no >= 366)
    leap = .F.
 
    g_day_no=g_day_no-1
    gy = gy +div(g_day_no, 365)
    g_day_no = g_day_no % 365
Endi
i=0
*        for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
Do Whil g_day_no >= g_days_in_month[i+1] +Iif((i = 1 And leap),1,0)
    g_day_no = g_day_no-g_days_in_month[i+1] +Iif((i = 1 And leap),1,0)
    i=i+1
Enddo
gm = i+1
gd = g_day_no+1
Return Date(gy,gm,gd)
Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

4

Re: PHP'den VFP çeviri Şemsi takvim

teşekkürler, gerek kalmadı. sağolsun ut'den borislav borissov çevirdi...

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

5

Re: PHP'den VFP çeviri Şemsi takvim

Hata nerdeydi?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

6

Re: PHP'den VFP çeviri Şemsi takvim

sanırım c benzeri hani a+=b-c; gibi satırlar oluyor ya oralarda parantez hataları filan yapmışım.
ihtiyacı olan veya merak edenler için tüm çevirim altta:

Visual Fox Pro
*celgreg.prg

LPARAMETERS xyear,xmonth,xday
 
*    Jalali, a Gregorian to Jalali and inverse date convertor
* Copyright (C) 2001, 2002  Roozbeh Pournader <roozbeh@farsiweb.info>
* Copyright (C) 2001, 2002  Mohammad Toossi <mohammad@bamdad.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You can receive a copy of GNU Lesser General Public License at the
* World Wide Web address <http://www.gnu.org/licenses/lgpl.html>.
*
* For licensing issues, contact The FarsiWeb Project Group,
* Computing Center, Sharif University of Technology,
* PO Box 11365-8515, Tehran, Iran, or contact us the
* email address <FWPG@sharif.edu>.
*/
 
* Changes:
*
* 2002-Feb-19:
*    Added PHP header and tailer
* 2002-Jan-28:
*    First LGPL release
*/
 
 
 
 
 
DIMENSION g_days_in_month[12], j_days_in_month[12]
g_days_in_month[ 1] = 31
g_days_in_month[ 2] = 28
g_days_in_month[ 3] = 31
g_days_in_month[ 4] = 30
g_days_in_month[ 5] = 31
g_days_in_month[ 6] = 30
g_days_in_month[ 7] = 31
g_days_in_month[ 8] = 31
g_days_in_month[ 9] = 30
g_days_in_month[10] = 31
g_days_in_month[11] = 30
g_days_in_month[12] = 31
 
j_days_in_month[ 1] = 31
j_days_in_month[ 2] = 31
j_days_in_month[ 3] = 31
j_days_in_month[ 4] = 31
j_days_in_month[ 5] = 31
j_days_in_month[ 6] = 31
j_days_in_month[ 7] = 30
j_days_in_month[ 8] = 30
j_days_in_month[ 9] = 30
j_days_in_month[10] = 30
j_days_in_month[11] = 30
j_days_in_month[12] = 29
 
 
 
ooo = jalaliToGregorian( xyear,xmonth,xday)
RETURN DATE(ooo.year,ooo.month,ooo.day)
 
function div(a, b)
return INT(a / b)
 
FUNCTION jalaliToGregorian(j_y, j_m, j_d)
   jy = j_y-979
   jm = j_m-1
   jd = j_d-1
 
   j_day_no = 365*jy + div(jy, 33)*8 + div(jy%33+3, 4)
   for i=1 TO jm
      j_day_no = j_day_no + j_days_in_month[i]
   NEXT
 
   j_day_no = j_day_no + jd
 
   g_day_no = j_day_no+79
 
   gy = 1600 + 400*div(g_day_no, 146097) &&/* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
   g_day_no = g_day_no % 146097
 
   leap = .t.
   if (g_day_no >= 36525) &&/* 36525 = 365*100 + 100/4 */
      g_day_no = g_day_no - 1
      gy = gy + 100*div(g_day_no,  36524) &&/* 36524 = 365*100 + 100/4 - 100/100 */
      g_day_no = g_day_no % 36524
 
      if (g_day_no >= 365)
          g_day_no = g_day_no + 1
      else
         leap = .f.
      ENDIF   
   ENDIF
 
   gy = gy + 4*div(g_day_no, 1461) && /* 1461 = 365*4 + 4/4 */
   g_day_no = g_day_no % 1461
 
   if (g_day_no >= 366)
      leap = .f.
 
      g_day_no = g_day_no - 1 
      gy       = gy + div(g_day_no, 365)
      g_day_no = g_day_no % 365
   ENDIF
 
   i = 1
   DO WHILE g_day_no >= (g_days_in_month[i] + IIF(i == 2 AND leap, 1, 0))
      g_day_no = g_day_no - (g_days_in_month[i] + IIF(i == 2 AND leap, 1, 0)) && This is the culprit :-)
      i = i + 1
   ENDDO
   gm = i
   gd = g_day_no+1
   oReturn = CREATEOBJECT([EMPTY])
   ADDPROPERTY(oReturn,[Year], gy)
   ADDPROPERTY(oReturn,[Month], gm)
   ADDPROPERTY(oReturn,[Day], gd)
RETURN oReturn
 
 
*gregcel.prg
LPARAMETERS xdate
 
*    Jalali, a Gregorian to Jalali and inverse date convertor
* Copyright (C) 2001, 2002  Roozbeh Pournader <roozbeh@farsiweb.info>
* Copyright (C) 2001, 2002  Mohammad Toossi <mohammad@bamdad.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You can receive a copy of GNU Lesser General Public License at the
* World Wide Web address <http://www.gnu.org/licenses/lgpl.html>.
*
* For licensing issues, contact The FarsiWeb Project Group,
* Computing Center, Sharif University of Technology,
* PO Box 11365-8515, Tehran, Iran, or contact us the
* email address <FWPG@sharif.edu>.
*/
 
* Changes:
*
* 2002-Feb-19:
*    Added PHP header and tailer
* 2002-Jan-28:
*    First LGPL release
*/
 
 
 
 
 
DIMENSION g_days_in_month[12], j_days_in_month[12]
g_days_in_month[ 1] = 31
g_days_in_month[ 2] = 28
g_days_in_month[ 3] = 31
g_days_in_month[ 4] = 30
g_days_in_month[ 5] = 31
g_days_in_month[ 6] = 30
g_days_in_month[ 7] = 31
g_days_in_month[ 8] = 31
g_days_in_month[ 9] = 30
g_days_in_month[10] = 31
g_days_in_month[11] = 30
g_days_in_month[12] = 31
 
j_days_in_month[ 1] = 31
j_days_in_month[ 2] = 31
j_days_in_month[ 3] = 31
j_days_in_month[ 4] = 31
j_days_in_month[ 5] = 31
j_days_in_month[ 6] = 31
j_days_in_month[ 7] = 30
j_days_in_month[ 8] = 30
j_days_in_month[ 9] = 30
j_days_in_month[10] = 30
j_days_in_month[11] = 30
j_days_in_month[12] = 29
 
j_month_name    = ["Farvardin", "Ordibehesht", "Khordad", "Tir", "Mordad", "Shahrivar", "Mehr", "Aban", "Azar", "Dey", "Bahman", "Esfand"]
 
 
ooo = gregorian_to_jalali(YEAR(xdate),MONTH(xdate),DAY(xdate))
RETURN TRANSFORM(ooo.year,"@l 9999")+"/"+TRANSFORM(ooo.month,"@l 99")+"/"+TRANSFORM(ooo.day,"@l 99")
 
 
function div(a, b)
return INT(a / b)
 
function gregorian_to_jalali(g_y, g_m, g_d)
 
   gy = g_y-1600
   gm = g_m-1
   gd = g_d-1
 
   g_day_no = 365*gy+div(gy+3,4)-div(gy+99,100)+div(gy+399,400);
 
   for i=1 TO gm
      g_day_no = g_day_no + g_days_in_month[i]
   NEXT
 
   if (gm > 1 AND ((gy%4==0 AND gy%100!=0) OR (gy%400==0)))
      g_day_no = g_day_no + 1
   ENDIF
   g_day_no = g_day_no + gd
 
   j_day_no = g_day_no-79
 
   j_np = div(j_day_no, 12053)
   j_day_no = j_day_no % 12053
 
   jy = 979+33*j_np+4*div(j_day_no,1461)
 
   j_day_no = j_day_no % 1461
 
   if (j_day_no >= 366)
      jy = jy + div(j_day_no-1, 365)
      j_day_no = (j_day_no-1)%365
   ENDIF
 
   for i = 1 TO 11
      IF j_day_no >= j_days_in_month[i]
         j_day_no = j_day_no - j_days_in_month[i]
      ELSE
         EXIT
      ENDIF
   NEXT
   jm = i
   jd = j_day_no+1
 
   oReturn = CREATEOBJECT([EMPTY])
   ADDPROPERTY(oReturn,[Year], jy)
   ADDPROPERTY(oReturn,[Month], jm)
   ADDPROPERTY(oReturn,[Day], jd)
RETURN oReturn
Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com