Red de conocimientos turísticos - Lugares de interés turístico - PowerBuilder 10.5. Cómo calcular el calendario lunar basándose en el calendario solar

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

* /

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 &

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}

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

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]

//Asesino del Zodíaco

ls _ astr = Animales[mod(ll _ ly ear-1900, 12) + 1]

//Mes

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