PDA

View Full Version : میلادی به شمسی



D32.00110
سه شنبه 20 دی 1384, 14:30 عصر
سلام

سرچ کردم ها لطفا نگید که ...
کسی اگه سورس میلادی به شمسی رو در سی داره ممنون میشم بده ...

saffari2005
سه شنبه 20 دی 1384, 14:52 عصر
void Mil2Shm( int nYear, int nMonth, int nDay, int &rnYear, int &rnMonth, int &rnDay )
{
int anSDate[ 13 ],
inIdx,
nB,
nLso,
nDeltaJD,
nTYear,
nSDayLen,
nShmTotalDay,
nYIdx,
nTmpMonth,
nTmpYear;
double dflMiladi,
dflJulinDay;

dflMiladi = double( nYear ) + double( nMonth ) / 100.0 + double( nDay ) / 10000.0;

// Limitation
if ( dflMiladi < 622.0716 ) // 622.0319
{
nYear = 622;
nMonth = 7;
nDay = 16;
dflMiladi = double( nYear ) + double( nMonth ) / 100.0 + double( nDay ) / 10000.0;
}


if ( dflMiladi > 1582.1004 && dflMiladi < 1582.1015 )
nDay = 4;

nTmpYear = nYear;
nTmpMonth = nMonth;
if ( nMonth == 1 || nMonth == 2 )
{
nTmpYear = nYear - 1;
nTmpMonth = nMonth + 12;
}

nB = 0;
if ( dflMiladi >= 1582.1015 )
nB = 2 - nTmpYear / 100 + nTmpYear / 400;

dflJulinDay = double( nB ) + double( int( 365.25 * nTmpYear ) ) +
double( int( 30.6001 * ( nTmpMonth + 1 ) ) ) +
1720994.5 + double( nDay ) - 1947953.5;

for ( nYIdx = 0, nShmTotalDay = 0; ( int( dflJulinDay ) - nShmTotalDay ) > 366; nYIdx++ )
{
nShmTotalDay += 365 + IsShmLeap( nYIdx );
nDeltaJD = int( dflJulinDay ) - nShmTotalDay;

if ( nDeltaJD == 0 )
{
rnYear = nYIdx;
nSDayLen = 365 + IsShmLeap( nYIdx );
//break;
}
else
if ( nDeltaJD > 0 && nDeltaJD <= 365 )
{
rnYear = nYIdx + 1;
nSDayLen = nDeltaJD;
//break;
}
else
if ( nDeltaJD == 366 )
{
nTYear = nYIdx + 1;
nLso = 365 + IsShmLeap( nTYear );
if ( nLso == 366 )
{
rnYear = nTYear;
nSDayLen = nLso;
//break;
}
else
{
rnYear = nTYear + 1;
nSDayLen = 1;
//break;
}
}
}


anSDate[ 0 ] = 0;
anSDate[ 1 ] = 31;
anSDate[ 2 ] = 62;
anSDate[ 3 ] = 93;
anSDate[ 4 ] = 124;
anSDate[ 5 ] = 155;
anSDate[ 6 ] = 186;
anSDate[ 7 ] = 216;
anSDate[ 8 ] = 246;
anSDate[ 9 ] = 276;
anSDate[ 10 ] = 306;
anSDate[ 11 ] = 336;
anSDate[ 12 ] = 366;

// nSDayLen che roozi az sale shamsi ast
for ( inIdx = 11; inIdx >= 0; inIdx-- )
if ( nSDayLen > anSDate[ inIdx ] )
break;

rnMonth = inIdx + 1;
rnDay = nSDayLen - anSDate[ inIdx ];
}

D32.00110
چهارشنبه 21 دی 1384, 11:44 صبح
عزیز خیلی ممنون از لطفت ...