Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Shemsi dates
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Titre:
Shemsi dates
Divers
Thread ID:
01529263
Message ID:
01529263
Vues:
93
Hi Zaheer,

I looked your http://www.levelextreme.com/ViewPageArticle.aspx?ID=578 article. Your article is about Hijri dates. We sold application to Iran and I think so they are use Shemsi date. A developer from Iran sent me a function for convert Shemsi but I see it's about just convert to Gregorian->Shemsi and it doesn't work good or I couldn't understand it.

Do you have functions for both convert Shemsi->Gregorian and Gregorian->Shemsi?

This is the function which he sent me:
**  m_mi_date : Miladi Tarih
** sh_date : Shemsi Tarih   ( Iran Takvimi)

private m_mi_date, ref_mi_date
m_mi_date = date()
set date to mdy
private dupper, dlower, quitting
store .f. to dupper, dlower, quitting
public dmf(12)
store 31 to dmf
store 30 to dmf(7), dmf(8), dmf(9), dmf(10), dmf(11)
store 29 to dmf(12)
ref_mi_date = ctod("01/01/1993")
private sh_year, mi_days, i
sh_year = 1371
mi_days = 0
do case
case m_mi_date>ref_mi_date
	mi_days = m_mi_date-ref_mi_date
	dupper = .t.
case m_mi_date<ref_mi_date
	mi_days = ref_mi_date-m_mi_date
	dlower = .t.
otherwise
	sh_date = '71/11/10'
	sh_month = 11
	day_of_m = 10
	return sh_date
endcase
i = 0
do case
case dupper
	if mi_days>78
		sh_year = 1372
		mi_days = mi_days-78
		ref_sh_date = '72/01/01'
	else
		quitting = .t.
		sh_year = 1371
		do case
		case mi_days<=19
			i = 10
			mi_days = mi_days+11
		case mi_days<=49
			i = 11
			mi_days = mi_days-19
		otherwise
			i = 12
			mi_days = mi_days-dmf(11)-19
		endcase
	endif
	if mi_days>365
		sh_year = sh_year+int((mi_days/365))
		mi_days = mi_days-int((mi_days/365))*365-int((mi_days/365)/4)
	endif
	do while  .not. quitting
		i = i+1
		if mi_days<=dmf(i)
			quitting = .t.
		else
			mi_days = mi_days-dmf(i)
		endif
	enddo
	if mi_days<1
		if i=1
			i = 12
			sh_year = sh_year-1
		else
			i = i-1
		endif
		mi_days = dmf(i)+mi_days
	endif
case dlower
	quitting = .f.
	i = 10
	if mi_days>287
		i = 13
		mi_days = mi_days-287
	else
		quitting = .t.
		sh_year = 1371
		if mi_days<11
			mi_days = 11-mi_days
		else
			mi_days = mi_days-10
			quitting2 = .f.
			do while  .not. quitting2
				i = i-1
				if mi_days<=dmf(i)
					mi_days = dmf(i)-mi_days
					quitting2 = .t.
				else
					mi_days = mi_days-dmf(i)
				endif
			enddo
			mi_days = mi_days+1
		endif
	endif
	if mi_days>365
		sh_year = 1371-int((mi_days/365))
		mi_days = mi_days-int((mi_days/365))*365-int((mi_days/365)/4)
	endif
	if  .not. quitting
		do while  .not. quitting
			i = i-1
			if mi_days<=dmf(i)
				quitting = .t.
			else
				mi_days = mi_days-dmf(i)
			endif
		enddo
		mi_days = dmf(i)-mi_days+1
	endif
endcase
sh_month = i
day_of_m = mi_days
sh_date = alltrim(str(sh_year))+'/'+iif(len(alltrim(str(i)))=1, '0', '')+alltrim(str(i))+'/'+iif(len(alltrim(str(day_of_m)))=1, '0', '')+alltrim(str(day_of_m))
*sh_date = chrtran(sh_date, '0123456789', '€‚ƒ„…†‡ˆ‰')
*?substr(sh_date, 3)
return substr(sh_date, 3)
endfunc
Répondre
Fil
Voir

Click here to load this message in the networking platform