用java和js实现农历和阳历的转换[z]

From: http://www.yuanma.org/data/2006/0914/article_1538.htm

js的实现:http://www.winu.cn/redirect.php?tid=71667&goto=lastpost

java 代码
  1. //测试类   
  2. public class Test ...{   
  3.   public static void main(String[] args) ...{   
  4.       //调用农历日期转换阳历日期方法   
  5.     System.out.println(Calendar.sCalendarLundarToSolar(2006,1,1));   
  6.   }   
  7. }   
  8.   
  9. //自定义日历类   
  10. class Calendar ...{   
  11.   
  12.  // Array lIntLunarDay is stored in the monthly day information in every year from 1901 to 2100 of the lunar calendar,   
  13.  // The lunar calendar can only be 29 or 30 days every month, express with 12(or 13) pieces of binary bit in one year,   
  14.  // it is 30 days for 1 form in the corresponding location , otherwise it is 29 days   
  15.  private static final int[] iLunarMonthDaysTable = ...{   
  16.      0x4ae00xa5700x52680xd2600xd9500x6aa80x56a00x9ad00x4ae80x4ae0,   // 1910   
  17.      0xa4d80xa4d00xd2500xd5480xb5500x56a00x96d00x95b00x49b80x49b0,   // 1920   
  18.      0xa4b00xb2580x6a500x6d400xada80x2b600x95700x49780x49700x64b0,   // 1930   
  19.      0xd4a00xea500x6d480x5ad00x2b600x93700x92e00xc9680xc9500xd4a0,   // 1940   
  20.      0xda500xb5500x56a00xaad80x25d00x92d00xc9580xa9500xb4a80x6ca0,   // 1950   
  21.      0xb5500x55a80x4da00xa5b00x52b80x52b00xa9500xe9500x6aa00xad50,   // 1960   
  22.      0xab500x4b600xa5700xa5700x52600xe9300xd9500x5aa80x56a00x96d0,   // 1970   
  23.      0x4ae80x4ad00xa4d00xd2680xd2500xd5280xb5400xb6a00x96d00x95b0,   // 1980   
  24.      0x49b00xa4b80xa4b00xb2580x6a500x6d400xada00xab600x93700x4978,   // 1990   
  25.      0x49700x64b00x6a500xea500x6b280x5ac00xab600x93680x92e00xc960,   // 2000   
  26.      0xd4a80xd4a00xda500x5aa80x56a00xaad80x25d00x92d00xc9580xa950,   // 2010   
  27.      0xb4a00xb5500xb5500x55a80x4ba00xa5b00x52b80x52b00xa9300x74a8,   // 2020   
  28.      0x6aa00xad500x4da80x4b600x95700xa4e00xd2600xe9300xd5300x5aa0,   // 2030   
  29.      0x6b500x96d00x4ae80x4ad00xa4d00xd2580xd2500xd5200xdaa00xb5a0,   // 2040   
  30.      0x56d00x4ad80x49b00xa4b80xa4b00xaa500xb5280x6d200xada00x55b0    // 2050   
  31.  };   
  32.   
  33.  // Array iLunarLeapMonthTable preserves the lunar calendar  leap month from 1901 to 2050,   
  34.  // if it is 0 express not to have , every byte was stored for two years   
  35.  private static final char[] iLunarLeapMonthTable = ...{   
  36.      0x000x500x040x000x20,   // 1910   
  37.      0x600x050x000x200x70,   // 1920   
  38.      0x050x000x400x020x06,   // 1930   
  39.      0x000x500x030x070x00,   // 1940   
  40.      0x600x040x000x200x70,   // 1950   
  41.      0x050x000x300x800x06,   // 1960   
  42.      0x000x400x030x070x00,   // 1970   
  43.      0x500x040x080x000x60,   // 1980   
  44.      0x040x0a0x000x600x05,   // 1990   
  45.      0x000x300x800x050x00,   // 2000   
  46.      0x400x020x070x000x50,   // 2010   
  47.      0x040x090x000x600x04,   // 2020   
  48.      0x000x200x600x050x00,   // 2030   
  49.      0x300xb00x060x000x50,   // 2040   
  50.      0x020x070x000x500x03    // 2050   
  51.  };   
  52.   
  53.  // Array iSolarLunarTable stored the offset days   
  54.  // in New Year of solar calendar and lunar calendar from 1901 to 2050;   
  55.  private static final char[] iSolarLunarOffsetTable = ...{   
  56.    49382846342443322140,  // 1910   
  57.    29483625443422413150,  // 1920   
  58.    38274635234332224029,  // 1930   
  59.    47362544342341304938,  // 1940   
  60.    26453524433221402847,  // 1950   
  61.    36264433234230483827,  // 1960   
  62.    45352443322039294736,  // 1970   
  63.    26453322413048372746,  // 1980   
  64.    35244332503928473626,  // 1990   
  65.    45342240304937274635,  // 2000   
  66.    23423121392848372544,  // 2010   
  67.    33234131503928473524,  // 2020   
  68.    42302140284736254333,  // 2030   
  69.    22413049372644332342,  // 2040   
  70.    31214029473625443222,  // 2050   
  71.  };   
  72.   
  73.   
  74.  static boolean bIsSolarLeapYear(int iYear)...{   
  75.   return ((iYear % 4 == 0) && (iYear % 100 != 0) || iYear % 400 == 0);   
  76.  }   
  77.   
  78.  // The days in the month of solar calendar   
  79.  static int iGetSYearMonthDays(int iYear, int iMonth)...{   
  80.   if((iMonth == 1) || (iMonth == 3) || (iMonth == 5)||   
  81.     (iMonth == 7) || (iMonth == 8) || (iMonth == 10) || (iMonth == 12))   
  82.     return 31;   
  83.    else if((iMonth == 4) || (iMonth == 6) || (iMonth == 9) || (iMonth == 11))   
  84.     return 30;   
  85.    else if(iMonth == 2)...{   
  86.     if(bIsSolarLeapYear(iYear)) return 29;   
  87.     else return 28;   
  88.    }   
  89.    else return 0;   
  90.  }   
  91.   
  92.  // The offset days from New Year and the day when point out in solar calendar   
  93.  static int iGetSNewYearOffsetDays(int iYear, int iMonth, int iDay)...{   
  94.   int iOffsetDays = 0;   
  95.   
  96.   for(int i = 1; i < iMonth; i++)...{   
  97.    iOffsetDays += iGetSYearMonthDays(iYear, i);   
  98.   }   
  99.   iOffsetDays += iDay -1;   
  100.   
  101.   return iOffsetDays;   
  102.  }   
  103.   
  104.  static int iGetLLeapMonth(int iYear)...{   
  105.   char iMonth = iLunarLeapMonthTable[(iYear - 1901) / 2];   
  106.   
  107.   if(iYear % 2 == 0)   
  108.    return (iMonth & 0x0f);   
  109.   else  
  110.    return (iMonth & 0xf0) >> 4;   
  111.  }   
  112.   
  113.  static int iGetLMonthDays(int iYear, int iMonth)...{   
  114.   int iLeapMonth = iGetLLeapMonth(iYear);   
  115.   if((iMonth > 12) && (iMonth - 12 != iLeapMonth) || (iMonth < 0))...{   
  116.    System.out.println("Wrong month, ^_^ , i think you are want a -1, go to death!");   
  117.    return -1;   
  118.   }   
  119.   if(iMonth - 12 == iLeapMonth)...{   
  120.    if((iLunarMonthDaysTable[iYear - 1901] & (0x8000 >> iLeapMonth)) == 0)   
  121.     return 29;   
  122.    else  
  123.     return 30;   
  124.   }   
  125.   if((iLeapMonth > 0) && (iMonth > iLeapMonth)) iMonth++;   
  126.   if((iLunarMonthDaysTable[iYear - 1901] & (0x8000 >> (iMonth - 1))) == 0)   
  127.    return 29;   
  128.   else  
  129.    return 30;   
  130.  }   
  131.   
  132.  // Days in this year of lunar calendar   
  133.  static int iGetLYearDays(int iYear)...{   
  134.   int iYearDays = 0;   
  135.   int iLeapMonth = iGetLLeapMonth(iYear);   
  136.   
  137.   for(int i = 1; i < 13; i++)   
  138.    iYearDays += iGetLMonthDays(iYear, i);   
  139.   if(iLeapMonth > 0)   
  140.    iYearDays += iGetLMonthDays(iYear, iLeapMonth + 12);   
  141.   return iYearDays;   
  142.  }   
  143.   
  144.  static int iGetLNewYearOffsetDays(int iYear, int iMonth, int iDay)...{   
  145.   int iOffsetDays = 0;   
  146.   int iLeapMonth = iGetLLeapMonth(iYear);   
  147.   
  148.   if((iLeapMonth > 0) && (iLeapMonth == iMonth - 12))...{   
  149.    iMonth = iLeapMonth;   
  150.    iOffsetDays += iGetLMonthDays(iYear, iMonth);   
  151.   }   
  152.   
  153.   for(int i = 1; i < iMonth; i++)...{   
  154.    iOffsetDays += iGetLMonthDays(iYear, i);   
  155.    if(i == iLeapMonth)   
  156.     iOffsetDays += iGetLMonthDays(iYear, iLeapMonth+12);   
  157.   }   
  158.   iOffsetDays += iDay - 1;   
  159.   
  160.   return iOffsetDays;   
  161.  }   
  162.   
  163.  // The solar calendar is turned into the lunar calendar   
  164.  static String sCalendarSolarToLundar(int iYear, int iMonth, int iDay)...{   
  165.   int iLDay, iLMonth, iLYear;   
  166.   int iOffsetDays = iGetSNewYearOffsetDays(iYear, iMonth, iDay);   
  167.   int iLeapMonth = iGetLLeapMonth(iYear);   
  168.   
  169.   if(iOffsetDays < iSolarLunarOffsetTable[iYear - 1901] )...{   
  170.    iLYear = iYear - 1;   
  171.    iOffsetDays = iSolarLunarOffsetTable[iYear - 1901] - iOffsetDays;   
  172.    iLDay = iOffsetDays;   
  173.   
  174.    for(iLMonth = 12; iOffsetDays > iGetLMonthDays(iLYear, iLMonth); iLMonth--)...{   
  175.     iLDay = iOffsetDays;   
  176.     iOffsetDays -= iGetLMonthDays(iLYear, iLMonth);   
  177.    }   
  178.    if(0 == iLDay)   
  179.     iLDay = 1;   
  180.    else  
  181.     iLDay = iGetLMonthDays(iLYear, iLMonth) - iOffsetDays + 1;   
  182.   }   
  183.   else...{   
  184.    iLYear = iYear;   
  185.    iOffsetDays -= iSolarLunarOffsetTable[iYear - 1901];   
  186.    iLDay = iOffsetDays + 1;   
  187.   
  188.    for(iLMonth = 1; iOffsetDays >= 0; iLMonth++)...{   
  189.     iLDay = iOffsetDays + 1;   
  190.     iOffsetDays -= iGetLMonthDays(iLYear, iLMonth);   
  191.     if((iLeapMonth == iLMonth) && (iOffsetDays > 0))...{   
  192.      iLDay = iOffsetDays;   
  193.      iOffsetDays -= iGetLMonthDays(iLYear, iLMonth + 12);   
  194.      if(iOffsetDays <= 0)...{   
  195.       iLMonth += 12 + 1;   
  196.       break;   
  197.      }   
  198.     }   
  199.    }   
  200.    iLMonth--;   
  201.   }   
  202.   return "" + iLYear + (iLMonth > 9 ? "" + iLMonth : "0" + iLMonth)   
  203.    + (iLDay > 9 ? "" + iLDay : "0" + iLDay);   
  204.  }   
  205.   
  206.  // The lunar calendar is turned into the Solar calendar   
  207.  static String sCalendarLundarToSolar(int iYear, int iMonth, int iDay)...{   
  208.   int iSYear, iSMonth, iSDay;   
  209.   int iOffsetDays = iGetLNewYearOffsetDays(iYear, iMonth, iDay) + iSolarLunarOffsetTable[iYear - 1901];   
  210.   int iYearDays = bIsSolarLeapYear(iYear) ? 366 : 365;   
  211.   
  212.   if(iOffsetDays >= iYearDays)...{   
  213.    iSYear = iYear + 1;   
  214.    iOffsetDays -= iYearDays;   
  215.   }   
  216.   else ...{   
  217.    iSYear = iYear;   
  218.   }   
  219.   iSDay = iOffsetDays + 1;   
  220.   for(iSMonth = 1; iOffsetDays >= 0; iSMonth++)...{   
  221.    iSDay = iOffsetDays + 1;   
  222.    iOffsetDays -= iGetSYearMonthDays(iSYear, iSMonth);   
  223.   }   
  224.   iSMonth--;   
  225.   
  226.   return "" + iSYear + (iSMonth > 9 ? iSMonth + "" : "0" + iSMonth)   
  227.    + (iSDay > 9 ? iSDay + "" : "0" + iSDay);   
  228.  }   
  229. }   
  230.   
  231. //自定义星期类   
  232. class Week...{   
  233.  int iWeek;   
  234.  private String sWeek[] = ...{   
  235.    "Sunday""Monday""Tuesday""Wednesday""Thursday""Friday""Saturday"  
  236.  };   
  237.   
  238.  public Week()...{   
  239.   iWeek = 0;   
  240.  }   
  241.   
  242.  public Week(int w)...{   
  243.   if((w > 6) || (w < 0))...{   
  244.    System.out.println("Week out of range, I think you want Sunday");   
  245.    this.iWeek = 0;   
  246.   } else  
  247.    this.iWeek = w;   
  248.  }   
  249.   
  250.  public String toString()...{   
  251.   return sWeek[iWeek];   
  252.  }   
  253. }   
  254.   
  255. //自定义日期类   
  256. class MyDate ...{   
  257.   
  258.  public int iYear;   
  259.  public int iMonth;   
  260.  public int iDay;   
  261.   
  262.  private static int checkYear(int iYear)...{   
  263.   if((iYear > 1901) && (iYear < 2050))   
  264.    return iYear;   
  265.   else...{   
  266.    System.out.println("The Year out of range, I think you want 1981");   
  267.    return 1981;   
  268.  }   
  269.  }   
  270.   
  271.  public MyDate(int iYear, int iMonth, int iDay)...{   
  272.   this.iYear = checkYear(iYear);   
  273.   this.iMonth = iMonth;   
  274.   this.iDay = iDay;   
  275.  }   
  276.   
  277.  public MyDate(int iYear, int iMonth)...{   
  278.   this.iYear = checkYear(iYear);   
  279.   this.iMonth = iMonth;   
  280.   this.iDay = 1;   
  281.  }   
  282.   
  283.  public MyDate(int iYear)...{   
  284.   this.iYear = checkYear(iYear);   
  285.   this.iMonth = 1;   
  286.   this.iDay = 1;   
  287.  }   
  288.   
  289.  public MyDate()...{   
  290.   this.iYear = 1981;   
  291.   this.iMonth = 1;   
  292.   this.iDay = 1;   
  293.  }   
  294.   
  295.  public String toString()...{   
  296.   return ""this.iYear +   
  297.    (this

你可能感兴趣的:(java,PHP,Go)