PowerBuilder 10.5. Cómo calcular el calendario lunar basándose en el calendario solar
****************************************** ** ***************************
Nombre de la función: desde un determinado día del calendario lunar hasta un determinado día
Pasar parámetros: fecha ad _ fecha
-Fecha del calendario lunar
Parámetros de retorno: cadena
****** ****** ********************************************** ******* ******
Descripción de la función: Calcular el calendario lunar: Ingrese el calendario gregoriano para calcular el calendario lunar.
********************************************* *** *************************
*/
Cadena ls_ret
//Datos de información anual de 1900 a 2050:
/*
0x04bd8, 0x04ae0, 0570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
p>0x04ae0, 05b6, 04d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0da2, 0x095b0, 0x14977,
0x04970, 04b0, 0x0b4b5, 0x06d40, 0x1ab5 4, 0x02b60, 0x09570, 0x052f2, 0x04970,
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950. >
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0,0x1a5b4, 0x025d0,0x092d0, 0x0d2b2, 0950, 0x0b557,
0x06ca0, 0x0b550, 0x15355, 0x04da0, 05d0, 0x14573, 0x052d0, 09a8, 0x0e950, 6aa0,
0ea6, 0b50, 0x04b60, 0ae4,0570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 04d0, 0x0d4d4, 0x0d250, 0x0d558, 540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0974, 04b0, 0x0b27a, 0x06a50, 0x06d40, 0f46, 0b60, 0x09570,
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 58, 0x055c0, 0b60, 0x096d5, 0 x092e0,
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0bb7, 0x025d0, 0x092d0, 0x0cab5,
0950, 0x0b4a0, 0x 0ba 4, 0d50, 055d9, 0x04ba0, 05b0, 0x15 176,0x052b0 ,0930,
0x07954, 0x06aa0, 0d50, 0x05b52, 0x04b60, 06e6, 04e0, 0x0d260, 0x0ea65, 0x0d530,
0x05aa0, 0x076a3, 0x04bd7, 0x04ad0, 04d0, 0x1d0b6 , 0x0d250, 0x0d520, 0x0dd45 ,
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0577, 04b0, 0a50, 0x1b255, 0x06d20,
0x14b63 p>
* /
información lunar larga[151]= { & amp;
19416, 19168, 42352, 21717, 53856, 55632, 91476, 22176, 39632, 21970, amp
19168, 42422,42
192, 53840, 119381, 46400, 54944, 44450, 38320, 84343 y 18800, 42160, 46261, 27216, 27968, 109396, 1104, 38256, , 18800, &
25958, 54432, 59984, 28309, 23248, 1104, 100067, 37600, 116951, 51536 y 54432, 120998, 46416, 22176, 107956, 9680, 7584, 53938, 43344, 46423 y amp ;
27808, 46416, 86869, 19872, 42448, 83315, 21200, 43432, 59728, 27296 y
44710, 43856, 19296, 43748, 42352, 8, 62051, 55632, 23383, 22176 y 38608, 19925, 19152, 42192, 54484, 53840, 54616, 46400, 46496, 103846 y 38320, 18864, 80, 42160, 45690, 27216, 27968, 44870, 43872, 38256 y
51552, 55636, 54432, 55888, 30034, 22176, 43959, 9680, 37584, 51893 &
43344, 46240, 47780, 44368, 21977, 19360, 42416, 86390, 21168, 43312 y 31060, 27296, 44368, 23378, 19296, 42720, 8, 53856, 60005, 54576 y 54576.
23200 30371 38608 19415 19 152 42192 118966 53840 54560 56645 y
46496, 22224, 21938, 18864, 42359, 42160, 111189, 27936, 44448 & p>
84835 }
//Número de días por mes en el calendario gregoriano
mes solar largo[12]= {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31}
//Seco
Cadena Gan[10] = {"A", "B", "C", "D ", "E", "Puerta", "G", "Xin", "Ren", "Fantasma" }
//Rama
Cadena Zhi[12] = { "子", "Chou", "Yin", "Mao", "Chen", "Si", "Wu", "Wei", "Shen", "Tú", "Xu", "Hai".
//Asesino del Zodíaco
String Animals[12] = { "Rata", "Buey", "Tigre", "Conejo", "Dragón", "Serpiente" , " Caballo", "Oveja", "Mono", "Pollo", "Perro", "Cerdo" }
//Veinticuatro Términos Solares
Xian Yang$ TÉRMINO [ 24 ] = { "Pequeño frío", "Gran frío", "Comienzo de la primavera", "Lluvia", "Jingzhe", "Equinoccio de primavera", "Qingming", "Lluvia de cereales", "Changxia", "Xiaoman", " Mangzhong", "Solsticio de verano", "y;
"Pequeño calor", "Gran calor", "Comienzo del otoño", "Calor Shu", "Rocío blanco", "Equinoccio de otoño", " Rocío frío", "Primera helada", "Comienzo del invierno", "Nieve ligera", "Nieve fuerte", "Solsticio de invierno"}
//El tiempo en los veinticuatro términos solares, en minutos.
long sTermInfo[24 ] = {0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 1955565448& ltbr & gt263343, 285989, 331033, 353350, 375494, 3 97447, 419210, 440795, 462224, 483532, 504758} p>
cadena nstr 1[11]= { "uno", "dos", "tres", "cuatro", "cinco", "seis ", "siete", "ocho", "nueve" y "Diez" }
Stringstr2 [5] = { "Temprano", "Diez", "Veinte", "Treinta", " " }
string MonthName[12] = { "enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "Octubre", "Noviembre", "Diciembre" }
Un año largo, una semana, un día
Un año largo, un día largo
/ /Año, mes, día
ll_year = año(ad_date)
ll_mon =mes (ad_date)
ll_day = día(ad_date)
doble ld_num
Día bisiesto largo, día bisiesto largo, día bisiesto largo
ll_info largo, k, I
Entero largo ll_temp, ll_offset p>
Booleano lb_isleap
Cadena ls_bin, ls_code
ll_leap = 0
ll_temp = 0
/ /Calcular el número de días correspondientes al 1900-1-30 (calendario lunar 1-1).
ll_offset = días después(date(" 1900-1-30 "), ad_date)
//Calcular el calendario lunar
Para i = 1900 a 2050
//Encuentra el número de días del año lunar actual.
Ll_sumday = 348 //12 meses, 29 por mes.
k = 32768 //0x8000
ll _ info = información lunar[I-1901]
//hacer mientras k>8/ /0x8
////Y la operación con 0x8000, puede saber si es un mes grande.
// ll_temp = of_bitand(ll_info, k)
//
//Si ll_temp = 1 entonces ll_sum día = ll_sum día+1//Agregar 1 al gran mes.
//
////Mover k una posición hacia la derecha.
//ls _ bin = of _ decode(k)//Convertir a cadena binaria.
//
//ls_code = mid (ls_bin, 1, len(ls_bin)-1)//Desplazar un bit a la derecha.
//
// k = of_bintodec(ls_code) //Convertir a decimal.
//
//Bucle
// El último algoritmo es demasiado lento. De hecho, es para juzgar el valor binario de ll_info a partir del quinto. bit al bit 16 a la derecha ¿Cuántos unos hay?
//Lo siguiente se procesa utilizando el método de cadena.
ls_bin = of _dec Tobin_fixlen(ll_info, 16)
Para k = 1 a 12
ll_sum día = ll _ suma día+entero(izquierda(derecha) (ls _ bin, k + 4), 1))
Entonces
//Calcule el número de días en el mes bisiesto lunar.
//Calcular el mes del mes bisiesto
LL _ LEAP = of _ BITAND (LL _ INFO, 15) // 0xF hasta el último dígito.
Si ll _ salto & gt0 entonces // hay un mes bisiesto, 0 significa que no hay mes bisiesto.
LL_temp = of_Bitand (LL_info, 65536) // con 0x 10000.
Si ll_temp = 0, entonces //Obtiene el número de días del mes bisiesto.
ll_leapdays = 29
Otro
ll_leapdays = 30
Terminará si...
Otro
ll_leapdays = 30
p>
ll_leapdays = 0
Terminará si...
//El número de días en el año calendario lunar
ll _ suma día = ll _ suma día +ll _ días bisiestos
ll_offset = ll_offset - ll_sumday
if ll_offset & lt1 luego salir
luego
ll_offset = ll_offset + ll_sumday
//Año Nuevo Lunar
ll_lyear = i
lb_isleap = false
Para i = 1 a 12
Si ll_leap & gt0 y I = ll_leap+1 y lb_isleap = false entonces //Mes bisiesto.
lb_isleap = true
i = i - 1
//El número de días del mes bisiesto
ll_temp = ll_leapdays
Otros
//Calcular el número de días en meses no bisiestos: el número total de días en el mes I en ll_lyear.
k = 65536 //0x10000
//Realizar una operación binaria de desplazamiento a la derecha en k por I bit.
ls _ bin = of _ decode(k)//Convertir a cadena binaria.
Ls_code = mid (ls_bin, 1, len(ls_bin)-I)//Desplaza el bit I hacia la derecha.
K = of_bintodec(ls_code) //Convertir a decimal.
if_bitand(ll_info,k)>0 then //Obtiene el tamaño del mes.
ll_temp = 30
Otro
ll_temp = 29
Si... terminará
Si ... terminará terminará
ll_offset = ll_offset - ll_temp
Si ll_offset & lt0 entonces sale
Entonces
ll_offset = ll_offset + ll_temp
//Mes lunar
ll_lmon = i
//Año nuevo lunar
ll_lday = ll_offset
Fecha ld_ldate
11 días largos
LD _ ldate = date(string(ll _ ly ear)+" . "+ string(ll_lmon)+"."+ string (ll_lday))
//Traducido al calendario lunar chino:
Cadenas ls_str, ls_mstr, ls_ystr, ls_astr
//Las ramas del Año Nuevo Lunar
ls_ystr = gan[mod(mod(ll_ly ear-1864,60),10)+1]+zhi[mod(mod(ll_ly ear-1864,60),12)+1] p>
//Asesino del Zodíaco
ls _ astr = Animales[mod(ll _ ly ear-1900, 12) + 1]
//Mes p>
Seleccione caso ll_lmon
Caso 11
Ls_mstr = 'Eleven'
Caso 12
Ls_mstr = '十二'
Otros casos
Si ll_lmon>11 o ll_lmon<then=0
Otros
ls_mstr = nstr1[ll_lmon]
Es finalizará si...
Finalizar selección
//Fecha
Seleccionar caso ll_lday
Caso 10
Ls_str = 'Día 10'
Caso 20
Ls_str = 'Veinte'
Caso 30
Ls_str = 'Treinta'
Otras situaciones
si int(ll _ lday/10)+1>=1 y int(ll _ lday /10)+1 <then=5
ls _ str = nstr 2[int(ll _ lday/10)+1]
Terminará si...
p>if mod(ll_lday,10) >11 o mod(ll_lday,10)<then=0
Otro
ls _ str+= nstr 1[mod (ll _ lday, 10)]
Terminará si...
Finalizar selección
Ls_ret = 'Calendario lunar:'+ls_ystr+"año("+ls _ Astor+" ~ r ~ n "+ls +ls _ astr+" ~ r ~ n "+ls _ mstr+
// Calcula los términos solares lunares, a partir de 1900.1.6 02:05:00 (Xiaohan).
Para i = 1 a 24
LD _ num =(525948.76 *(ll _ año-1900)+sTerminfo[I])/(24 * 60)
ll_days = días después(fecha(' 1900.1.6 '), ad_date)
Si LD_num-ll_days<1 y LD_num-ll_days> ;-1
Ls_ret = ls_ret+" ~r~n término solar:"+SolarTerm[i]
Salir
Terminará si...
Entonces
Volver a ls_ret